Ajuda com provável erro de lógica (Python) - Python - Mente Binária
By bornman, March 30, 2018 in Python
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.
ports = [80,8080,25]
for host in range(0,255):
ip = "192.0.0."+host
print(ip,":",port)
O que vocês acham? Mais pra frente pretendo usar threads e uma interface gráfica.
Edited March 30, 2018 by bornman
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.
7 horas atrás, Leandro Fróes 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?
Pera, resolveu o outro erro e agora ta com timeout? Poderia postar a saída?
17 horas atrás, Leandro Fróes disse:
5 horas atrás, bornman 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.
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.
13 horas atrás, Felipe.Silva disse:
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.
@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.
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=>"))
def scan_tcp(x):
ip_total = ip + "." + str(x)
resultado = sock.connect_ex((ip_total, 443))
print(ip_total, "Host activo...\n")
print(ip_total, "conexão não efetuada... Não existe ou pode estar a bloquear ligação...\n")
acao=q.get()
scan_tcp(acao)
for octeto in range(inicio,fim):
q.put(octeto)
print("Operação terminada em", total_tempo)
@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.
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.
@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.
@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.