E aí, meu querido!
Tenta usar o protocolo ARP para descoberta em LAN:
from scapy.all import ARP, Ether, srp
import ipaddress
def ping_arp(network):
try:
# Verifica se a rede é válida
ip_network = ipaddress.ip_network(network, strict=False)
except ValueError:
print(f"Rede inválida: {network}"
return
print(f"Escaneando a rede: {network}..."
# Criação do pacote ARP
# 'ff:ff:ff:ff:ff:ff' é o endereço MAC de broadcast
arp_request = ARP(pdst=str(ip_network))
broadcast = Ether(dst="ff:ff:ff:ff:ff:ff"
packet = broadcast / arp_request
# Envia o pacote e recebe as respostas
answered, unanswered = srp(packet, timeout=2, verbose=False)
# Lista para armazenar os IPs e MACs ativos
devices = []
# Processa as respostas
for sent, received in answered:
devices.append({'ip': received.psrc, 'mac': received.hwsrc})
# Exibe os dispositivos encontrados
if devices:
print(f"Dispositivos ativos na rede {network}:"
for device in devices:
print(f"IP: {device['ip']}, MAC: {device['mac']}"
else:
print(f"Nenhum dispositivo ativo encontrado na rede {network}."
# Rede alvo (ex.: 192.168.1.0/24)
rede=str(input("Rede (ex.: 192.168.1.0/24): ")
ping_arp(rede)
Ou com protocolo ICMP e TCP (conectar nas portas desejadas):
from scapy.all import sr1, IP, ICMP, TCP
import socket
import ipaddress
# Lista de portas para verificar
PORTAS = [22, 80, 443, 8080, 631, 53]
# Função para enviar um ping ICMP
def enviar_ping(ip):
try:
resposta = sr1(IP(dst=ip)/ICMP(), timeout=1, verbose=False)
if resposta:
return True
except Exception as e:
pass
return False
# Função para verificar portas TCP
def verificar_portas_tcp(ip, portas):
portas_responsivas = []
for porta in portas:
try:
# Conexão TCP
pacote = IP(dst=ip)/TCP(dport=porta, flags="S"
resposta = sr1(pacote, timeout=1, verbose=False)
if resposta and (resposta[TCP].flags == "SA" or resposta[TCP].flags == "RA":
portas_responsivas.append(porta)
except Exception:
pass
return portas_responsivas
# Função principal
def escanear_rede(rede):
try:
# Valida a rede fornecida
ip_rede = ipaddress.ip_network(rede, strict=False)
except ValueError:
print(f"Rede inválida: {rede}"
return
print(f"Escaneando a rede: {rede}...\n"
hosts_ativos = []
for ip in ip_rede.hosts():
ip_str = str(ip)
print(f"Verificando {ip_str}..."
# Verifica se o host responde ao ping
if enviar_ping(ip_str):
print(f"{ip_str} respondeu ao ping!"
hosts_ativos.append(ip_str)
continue
# Tenta conexão nas portas especificadas
portas = verificar_portas_tcp(ip_str, PORTAS)
if portas:
print(f"{ip_str} respondeu em portas TCP: {portas}"
hosts_ativos.append(ip_str)
print("\nDispositivos ativos encontrados:"
for host in hosts_ativos:
print(host)
# Rede alvo no formato CIDR
rede_alvo = str(input("Rede (ex.: 192.168.1.0/24): ")
escanear_rede(rede_alvo)
Os scripts requerem privilégios administrativos. E o scan em um rede inteira pode demorar. Qualquer coisa ajusta pra apenas um host.
Vlw!
Boa sorte!
PS.: Qual SO tá usando?