bornman Posted March 30, 2018 at 03:18 PM Share Posted March 30, 2018 at 03:18 PM 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. Link to comment Share on other sites More sharing options...
Leandro Fróes Posted March 31, 2018 at 05:38 AM Share Posted March 31, 2018 at 05:38 AM 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 Link to comment Share on other sites More sharing options...
bornman Posted March 31, 2018 at 01:18 PM Author Share Posted March 31, 2018 at 01:18 PM 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. Link to comment Share on other sites More sharing options...
Leandro Fróes Posted March 31, 2018 at 02:35 PM Share Posted March 31, 2018 at 02:35 PM 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? Link to comment Share on other sites More sharing options...
bornman Posted March 31, 2018 at 10:29 PM Author Share Posted March 31, 2018 at 10:29 PM 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? Link to comment Share on other sites More sharing options...
Leandro Fróes Posted April 1, 2018 at 12:36 AM Share Posted April 1, 2018 at 12:36 AM 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? Link to comment Share on other sites More sharing options...
bornman Posted April 1, 2018 at 06:35 PM Author Share Posted April 1, 2018 at 06:35 PM 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? Link to comment Share on other sites More sharing options...
Felipe.Silva Posted April 1, 2018 at 11:50 PM Share Posted April 1, 2018 at 11:50 PM 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. Link to comment Share on other sites More sharing options...
Leandro Fróes Posted April 2, 2018 at 02:29 AM Share Posted April 2, 2018 at 02:29 AM 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. Link to comment Share on other sites More sharing options...
bornman Posted April 2, 2018 at 01:33 PM Author Share Posted April 2, 2018 at 01:33 PM 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. Link to comment Share on other sites More sharing options...
Guest gnoo Posted April 2, 2018 at 10:57 PM Share Posted April 2, 2018 at 10:57 PM @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() Link to comment Share on other sites More sharing options...
bornman Posted April 2, 2018 at 11:40 PM Author Share Posted April 2, 2018 at 11:40 PM @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. Link to comment Share on other sites More sharing options...
Guest gnoo Posted April 3, 2018 at 12:31 AM Share Posted April 3, 2018 at 12:31 AM 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. Link to comment Share on other sites More sharing options...
Felipe.Silva Posted April 3, 2018 at 03:13 AM Share Posted April 3, 2018 at 03:13 AM @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. Link to comment Share on other sites More sharing options...
bornman Posted April 3, 2018 at 12:34 PM Author Share Posted April 3, 2018 at 12:34 PM @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 Link to comment Share on other sites More sharing options...
Recommended Posts
Archived
This topic is now archived and is closed to further replies.