Ir para conteúdo

Ajuda com provável erro de lógica (Python)


bornman

Posts Recomendados

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

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 para o comentário
Compartilhar em outros sites

@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 para o comentário
Compartilhar em outros sites

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 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...