Ir para conteúdo

Portscan em Python


Visitante gnoo

Posts Recomendados

Boas pessoal fiz um espécie de portscan, e o prblema é o seguinte, quando faço scan a um servidor num site de empregos qualquer a partir de 2000 porto o programa devolve um erro, mas na minha rede consigo fazer até 10 000 sem problema alguém pode explicar o porquê disso sff.

5a398ef576995_Capturadeecrno2017-12-1921-52-12.png.0a01de5f92a9478554486f54f98242a5.png5a398ecca1ca2_Capturadeecrno2017-12-1922-11-49.thumb.png.50cbf075080e6868f9f3f2d0f73667f8.png

Link para o comentário
Compartilhar em outros sites

  • 1 mês depois...

O que a mensagem de erro leva a crer é que você está atingindo o limite de file descriptors (lembre-se que no Linux tudo é descripto por arquivos). A diferença entre fazer o scan na sua rede local e na Internet é a latência envolvida, portanto quando você realiza o scan na sua rede, rapidamente o SYN ACK (porta aberta) ou RST (porta fechada) e o socket é fechado, enquanto na Internet essa resposta tarda mais a demorar.

No entanto, o que deve estar acontecendo é que a porta não está nem aberta nem fechada, mas sim, filtrada. Nesse caso você não vai receber nenhuma resposta e seu socket vai continuar aberto (alocando um file descriptor). Seu script não está tratando esse caso... o que aconselharia fazer é setar um timeout, depois do qual você considera a porta filtrada.

 

Obs.: No Stackoverflow há uma referência que pode te ajudar a debugar a questão do file descriptor.

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois...

Obrigado por responder @cpuodzius, também pensei que seria com o número de processos a executar ser elevado entretanto resolvi o problema com "tratamento de exceções" , não sei se foi a melhor decisão mas foi a que resultou melhor para mim na altura.

Agradeço a dica das portas filtradas , não tinha pensado nisso, vou fazer essa alteração também (tentar pelo menos).

Entretanto depois de alguma pesquisa cheguei a um resultado:

#!/usr/bin/env python

try:
    from scapy3k.all import *
except:
    print("O módulo scapy3k não está instalado")


from socket import *
import threading
from queue import Queue
import shelve
from time import strftime
from datetime import datetime

base_dados = shelve.open('servicos_scan.db')
base_dados_servicos = base_dados ['servicos']

host = input("Inserir host para reconhecimento: ")

segura_saida = threading.Lock()

porto_aberto = []

porto_fechado = []


def mapeamento(porto):
    sock = socket(AF_INET, SOCK_STREAM)
    try:
        resultado = sock.connect_ex((host, porto))
        with segura_saida:
            if resultado == 0:
                porto_aberto.append(porto)
                print("Detectado porto aberto %d/tcp em %s" % (porto, host))
            else: 
                porto_fechado.append(porto)
               
        sock.close()
    except:
        pass

def OSfingerprint(host):

    print("******OS Fingerprint******")
   
    pacote_ICMP = sr1(IP(dst=host)/ICMP(), timeout= 2, verbose= 0)
    if int(pacote_ICMP[IP].ttl) == 64:
        print("Host: %s Sistema possivel: linux/FreeBSD/Android" % host)
    elif int(pacote_ICMP[IP].ttl) == 128:
        print("Host: %s Sistema possivel: Windows" % host)
    elif int(pacote_ICMP[IP].ttl) == 255:
        print("Cisco routers")
    
def confirma_servicos():
   
    print("PORTO   ESTADO  SERVIÇO\n")
    for j in porto_aberto:
        print(j,"/tcp  Aberto",base_dados_servicos.get(j, "desconhecido"))
    
    print("Scan feito em %s" %total_tempo)
    print("Sem actividade:",len(porto_fechado),"portos fechados")

def thread():
    while True:
        acao = q.get()
        mapeamento(acao)
        q.task_done()

def executa_scan():
    print("A verificar total ([10 000])portos")
   
    global q
    q = Queue()


    for i in range(30):
        tarefa = threading.Thread(target= thread)
        tarefa.daemon = True
        tarefa.start()
        
    t1 = datetime.now()

    global hora_inicio
    hora_inicio = strftime("%H:%M")
    print("Scan iniciou  às %s " % hora_inicio)
    for porto in range(1, 10001):
        q.put(porto)

    q.join()

    global hora_fim
    hora_fim = strftime("%H:%M")
    print("Scan terminado às %s" %hora_fim)
    t2 = datetime.now()

    global total_tempo
    total_tempo = t2-t1
    
def main():
    executa_scan()
    confirma_servicos()
    OSfingerprint(host)
    
   

if __name__ == '__main__':
    main()

O código está um pouco desarrumado mas ainda estou a aprender a montar as coisas, ainda não está acabado, mais para a frente quero implementar uma função para analisar os headers do TCP , estou a começar agora a aprofundar nessa matéria. 

Link para o comentário
Compartilhar em outros sites

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

  • Quem Está Navegando   0 membros estão online

    • Nenhum usuário registrado visualizando esta página.
×
×
  • Criar Novo...