Jump to content
Sign in to follow this  
bornman

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

Recommended Posts

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.

Edited by bornman

Share this post


Link to post
Share on other 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 :)

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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?

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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()

    

 

 

 

 

 

 

  • Curtir 1

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other 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. 

Share this post


Link to post
Share on other sites

@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

Edited by bornman

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

  • Recently Browsing   0 members

    No registered users viewing this page.

×
×
  • Create New...