Guest gnoo Posted December 19, 2017 at 10:14 PM Share Posted December 19, 2017 at 10:14 PM 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. Link to comment Share on other sites More sharing options...
cpuodzius Posted February 14, 2018 at 10:08 PM Share Posted February 14, 2018 at 10:08 PM 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 to comment Share on other sites More sharing options...
Guest gnoo Posted February 27, 2018 at 11:12 PM Share Posted February 27, 2018 at 11:12 PM 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 to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.