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!