1
resposta

[Projeto] meu código inicia muito bem pedindo o input correto mas depois de submeter, vêm error

Fiz um port scan básico com scapy que mesmo convertendo o sport para str e mesmo assim não funcionou e também já tentei criar uma variável 'source_port' no input e passar ela no sport e também não deu certo. Ele continua dando error de attribute: sport. Abaixo meu print do código ->

from scapy.all import *

ip = input('Informe o ip do host')
ports = [80,21,22,25,110,143,139,145,445,1194,3306,3389]
def scanner():
    r = sr(IP(dst=ip)/ICMP(sport=53, timeout=1, flags="S"))
    if r == None:
        print('host down')
    else:
        print('host up')
    for p in ports:
        resp = sr1(IP(dst=ip)/TCP(sport=53, dport=p, timeout=1, verbose=0, flags="S"))
        if resp is not None:
            print(f'Porta {p} aberta')
        else:
            print(f'Porta {p} fechada')
scanner()

AttributeError: sport
1 resposta

Olá Andre. Tudo bem?

O problema está relacionado ao uso do parâmetro sport na função sr e sr1 do Scapy. O AttributeError sugere que o parâmetro sport não está sendo reconhecido da maneira que você espera.

No Scapy, o parâmetro sport é usado para definir a porta de origem de um pacote TCP ou UDP. Quando você está criando pacotes ICMP, como no seu código, o ICMP não utiliza portas (sport ou dport), pois é um protocolo da camada de rede, não da camada de transporte como TCP ou UDP.

Aqui está uma maneira de ajustar seu código para evitar o erro:

from scapy.all import *

ip = input('Informe o ip do host: ')
ports = [80, 21, 22, 25, 110, 143, 139, 145, 445, 1194, 3306, 3389]

def scanner():
    # Remova o sport do pacote ICMP
    r = sr1(IP(dst=ip)/ICMP(), timeout=1, verbose=0)
    if r is None:
        print('Host down')
    else:
        print('Host up')
        for p in ports:
            # Use sport apenas com pacotes TCP
            resp = sr1(IP(dst=ip)/TCP(sport=RandShort(), dport=p, flags="S"), timeout=1, verbose=0)
            if resp is not None and resp.haslayer(TCP) and resp.getlayer(TCP).flags == 0x12:
                print(f'Porta {p} aberta')
                # Envia um pacote RST para fechar a conexão
                sr(IP(dst=ip)/TCP(sport=RandShort(), dport=p, flags="R"), timeout=1, verbose=0)
            else:
                print(f'Porta {p} fechada')

scanner()

Algumas alterações que fiz:

  • Removi o sport do pacote ICMP, pois não é necessário.
  • Usei RandShort() para gerar uma porta de origem aleatória para os pacotes TCP.
  • Adicionei uma verificação para confirmar se a resposta contém um pacote TCP com a flag SYN-ACK (0x12), indicando que a porta está aberta.
  • Enviei um pacote RST para fechar a conexão após detectar uma porta aberta.

Espero ter ajudado e bons estudos. Qualquer dúvida manda aqui.

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.Bons Estudos!