Jump to content

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


bornman

Recommended Posts

Posted

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
Posted

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 :)

Posted
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
Posted
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?

Posted
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
Posted
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?

Posted
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?

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

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.

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

Posted

@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()

    

 

 

 

 

 

 

Posted

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

Posted

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. 

Archived

This topic is now archived and is closed to further replies.

  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...