bornman Posted March 30, 2018 Posted March 30, 2018 Fala pessoal, estou tentando fazer um scanner de rede em Python utilizando sockets. No código a base está como um IP classe C, em que o loop muda apenas o último octeto, ex: 192.0.0.H e tenta se conectar a esse endereço usando algumas portas, quando a conexão for estabelecida então supõe-se que o endereço existe na rede. Desenvolvi apenas a primeira parte do código, o problema é que, na hora do print, estão aparecendo endereços que não existem na rede. Segue o código: import socket import subprocess subprocess.call("clear", shell=True) ports = [80,8080,25] for host in range(0,255): for port in ports: host = str(host) ip = "192.0.0."+host sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) result = sock.connect_ex((ip, port)) if (result == 0): print(ip,":",port) O que vocês acham? Mais pra frente pretendo usar threads e uma interface gráfica.
Moderators Leandro Fróes Posted March 31, 2018 Moderators Posted March 31, 2018 Boa noite! Acho que o problema ai são conceitos de redes mano. Considerando o fato de você estar scaneando sua rede interna o IP 192.0.0.x não é um IP privado, creio que você quis dizer 192.168.0.x. Não esqueça também que o 0 e o 255 no HostID são reservados para a rede e para broadcast, respectivamente. Abraços
bornman Posted March 31, 2018 Author Posted March 31, 2018 7 horas atrás, Leandro Fróes disse: Boa noite! Acho que o problema ai são conceitos de redes mano. Considerando o fato de você estar scaneando sua rede interna o IP 192.0.0.x não é um IP privado, creio que você quis dizer 192.168.0.x. Não esqueça também que o 0 e o 255 no HostID são reservados para a rede e para broadcast, respectivamente. Abraços Opa, obrigado Leandro. Esse IP eu tinha colocado apenas no código aqui como exemplo hehehehe. Essa parte do 0 e 255 eu realmente não sabia, estou lendo um livro de redes mas ainda estou no começo. Vou tentar fazer utilizando threads pra ver se consigo realizar o scan de forma mais rápida.
Moderators Leandro Fróes Posted March 31, 2018 Moderators Posted March 31, 2018 1 hora atrás, bornman disse: Opa, obrigado Leandro. Esse IP eu tinha colocado apenas no código aqui como exemplo hehehehe. Essa parte do 0 e 255 eu realmente não sabia, estou lendo um livro de redes mas ainda estou no começo. Vou tentar fazer utilizando threads pra ver se consigo realizar o scan de forma mais rápida. Leia sim, redes é muito importante saber. Entendi, mas quando deu o problema você colocou qual IP?
bornman Posted March 31, 2018 Author Posted March 31, 2018 7 horas atrás, Leandro Fróes disse: Leia sim, redes é muito importante saber. Entendi, mas quando deu o problema você colocou qual IP? O IP estava certo, 192.168.15.x, agora ele só consegue se conectar com o IP do modem, os outros está dando timedout. Coloquei sock.settimeout(0.5), será que está muito baixo? Ou será que pode ter algo relacionado ao meu firewall?
Moderators Leandro Fróes Posted April 1, 2018 Moderators Posted April 1, 2018 2 horas atrás, bornman disse: O IP estava certo, 192.168.15.x, agora ele só consegue se conectar com o IP do modem, os outros está dando timedout. Coloquei sock.settimeout(0.5), será que está muito baixo? Ou será que pode ter algo relacionado ao meu firewall? Pera, resolveu o outro erro e agora ta com timeout? Poderia postar a saída?
bornman Posted April 1, 2018 Author Posted April 1, 2018 17 horas atrás, Leandro Fróes disse: Pera, resolveu o outro erro e agora ta com timeout? Poderia postar a saída? Não arrumei nenhum erro. Agora, utilizando a porta 80, ele só consegue se conectar com o primeiro IP(no caso, o ip do modem). Não faço ideia de que porta devo usar no scan, a 80 está correta? Não sei se estou pensando de forma correta mas acredito que exista uma porta padrão para todos os computadores da mesma rede, certo?
Felipe.Silva Posted April 1, 2018 Posted April 1, 2018 5 horas atrás, bornman disse: Não arrumei nenhum erro. Agora, utilizando a porta 80, ele só consegue se conectar com o primeiro IP(no caso, o ip do modem). Não faço ideia de que porta devo usar no scan, a 80 está correta? Não sei se estou pensando de forma correta mas acredito que exista uma porta padrão para todos os computadores da mesma rede, certo? Errado. Muitos PCs nem tem nenhuma porta aberta. Geralmente as portas 80 e 8080 são usadas por servidores HTTP. Se no PC não tem nenhum servidor rodando, então a porta não vai estar aberta. A porta 25 geralmente, se não me engano, é usada por servidor de e-mail. (SMTP eu acho) Se não tem um servidor desses rodando no PC, então a porta também vai estar fechada. Uma maneira simples de verificar se um host está no ar é simplesmente dando um ping. (inclusive existe ferramenta para fazer isso: $ ping -c4 host) Porém uma máquina pode ser configurada para não responder a pacotes de ping.
Moderators Leandro Fróes Posted April 2, 2018 Moderators Posted April 2, 2018 Da uma olhada nas suas configurações de firewall então cara. Se for linux pode abrir uma porta com nc -lvp 8080 por exemplo e depois testar seu port scan, mas isso depois de verificar o firewall.
bornman Posted April 2, 2018 Author Posted April 2, 2018 13 horas atrás, Felipe.Silva disse: Errado. Muitos PCs nem tem nenhuma porta aberta. Geralmente as portas 80 e 8080 são usadas por servidores HTTP. Se no PC não tem nenhum servidor rodando, então a porta não vai estar aberta. A porta 25 geralmente, se não me engano, é usada por servidor de e-mail. (SMTP eu acho) Se não tem um servidor desses rodando no PC, então a porta também vai estar fechada. Uma maneira simples de verificar se um host está no ar é simplesmente dando um ping. (inclusive existe ferramenta para fazer isso: $ ping -c4 host) Porém uma máquina pode ser configurada para não responder a pacotes de ping. Entendi. Então creio que esse método de fazer um scanner de rede local não seja ideal. Quando eu estudar mais sobre o assunto tento de novo hehehe. Obrigado pela ajuda pessoal.
Guest gnoo Posted April 2, 2018 Posted April 2, 2018 @bornman Lê o que o @Felipe.Silva escreveu ... O que eu percebo do teu código tu estás a criar uma operação um pouco complexa quando o resultado se quer o mais simples possivel. Pelo que eu entendo no teu código tu queres fazer o scan em 255 hosts, e em cada um desses hosts queres testar 3 portos diferentes ( corrige-me se estou errado), isso são muitos pacotes para cá e para lá, o que acho que deverias fazer, e é o que a maioria das pessoas faz é escolher um só porto como por exemplo o 80 ou 443 que por norma estão disponiveis, muito raramente tens alguem a filtrar esses serviços ( pelo menos é essa a ideia que tenho posso estar errado). Outra forma interessante de fazer esse tipo de precedimento é usando o ping. Vou deixar aqui um código para teres uma ideia de como pode ser feito. Este código é de minha autoria tens autorização para usar e modificar. O códiog que segue é um esboço de um outro que eu fiz ele já tem as threads mas o resultado da sequencia de ip's vai estar desorganizada tens que modificar a ponto de ele ficar organizado e também modificar para que o output seja só os que estão ativos (é só uma ideia), como disse é apenas um esboço. Segue código: from socket import * import threading from datetime import datetime from queue import Queue ip = input("Digita os três primeiros octetos do ip, exemplo--> w.x.y\n=>") inicio = int(input("Digita o número a iniciar o último octeto:\n=>")) fim = int(input("Digita o número em que acaba:\n=>")) segura_saida = threading.Lock() def scan_tcp(x): sock = socket(AF_INET,SOCK_STREAM) ip_total = ip + "." + str(x) setdefaulttimeout(1) resultado = sock.connect_ex((ip_total, 443)) with segura_saida: if resultado == 0: print(ip_total, "Host activo...\n") else: print(ip_total, "conexão não efetuada... Não existe ou pode estar a bloquear ligação...\n") def thread(): while True: acao=q.get() scan_tcp(acao) q.task_done() def executa(): global q q= Queue() for y in range(100): tarefa= threading.Thread(target=thread) tarefa.daemon=True tarefa.start() t1 = datetime.now() for octeto in range(inicio,fim): q.put(octeto) q.join() t2 = datetime.now() total_tempo = t2-t1 print("Operação terminada em", total_tempo) executa()
bornman Posted April 2, 2018 Author Posted April 2, 2018 @gnoo As últimas tentativas que fiz foram com uma porta só. Rodei o seu código aqui e não detectou nenhum host ativo. Talvez eu esteja fazendo algo errado, ou o problema seja meu firewall.
Guest gnoo Posted April 3, 2018 Posted April 3, 2018 Estás a usar o teu IP externo ou da tua máquina? E que se for a tua máquina o código está para o porto 443 , tens que alterar o código. Passa um por scanner na tua máquina e ver quais os resultados que te dá, se não encontrar nada testa o teu IP externo e faz as alterações no código.
Felipe.Silva Posted April 3, 2018 Posted April 3, 2018 @bornman, cara eu fiz um exemplo em Bash do que eu acho que é o que você está tentando fazer. No caso eu simplesmente usei ping. O código: https://github.com/Silva97/tools/blob/master/lhosts.sh Acabei me empolgando e fiz logo uma tool completa.
bornman Posted April 3, 2018 Author Posted April 3, 2018 @Felipe.Silva Bacana seu código, meu objetivo era de fazer como se fosse um ping porem recriado, mas pelo que vi é muito mais complexo. Achei um no GitHub, pra quem quiser dar uma olhada: Python Ping
Recommended Posts
Archived
This topic is now archived and is closed to further replies.