1
resposta

código roda bem mas retorna resultados inconsistentes

Fiz um código de um portscan syn com scapy e socket, e aparentemente ele rodou sem nenhum error, porém os resultados não batem, pois ele está relatando que o alvo scaneado está com a porta 80 fechada, só que ao comparar com o nmap usando syn ack nmap -sS --script=default mostra a 80 aberta 22 também aberta. VEJA abaixo o código e o print do resultado:

import socket
from scapy.all import *

ip = input('Qual o host?:')
s = socket.socket()
ports = [20,21,22,23,25,53,80,110,127,139,143,145,465,587,1194,3306,3389]
def checking():
    ping = IP(dst=ip)/ICMP()
    res = sr1(ping, timeout=1, verbose=0)
    if res == None:
        print('Host is down')
    else:
        print('host is up')
    for p in ports:
        req = IP(dst=ip)/TCP(dport=ports, flags='S')
        resp = sr1(req, timeout=1, verbose=0)
        s.settimeout(1)
        try:
            if resp.getlayer(TCP).flags == 'SA':
                print(p, 'aberta')
        except Exception as e:
            print(p, 'fechada')
checking()

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

1 resposta

Olá, Andre.

Tudo bem?

Analisando o seu código, parece que há um pequeno erro na forma como você está passando as portas para o pacote TCP em Scapy. No loop onde você está iterando sobre a lista de portas, você está passando a lista inteira ports ao invés da porta específica p para o campo dport. Isso pode estar causando o comportamento inconsistente que você observou.

Aqui está a correção para o seu código:

import socket
from scapy.all import *

ip = input('Qual o host?:')
s = socket.socket()
ports = [20,21,22,23,25,53,80,110,127,139,143,145,465,587,1194,3306,3389]
def checking():
    ping = IP(dst=ip)/ICMP()
    res = sr1(ping, timeout=1, verbose=0)
    if res == None:
        print('Host is down')
    else:
        print('host is up')
    for p in ports:
        req = IP(dst=ip)/TCP(dport=p, flags='S')  # Correção aqui: use 'p' ao invés de 'ports'
        resp = sr1(req, timeout=1, verbose=0)
        s.settimeout(1)
        try:
            if resp.getlayer(TCP).flags == 'SA':
                print(p, 'aberta')
        except Exception as e:
            print(p, 'fechada')
checking()

Com essa correção, o seu código deve agora enviar pacotes SYN para cada porta individualmente, o que deve fornecer resultados de varredura mais precisos e consistentes.

Espero ter entendido e conseguido ajudar. Qualquer dúvida manda aqui. Bons estudos!