Identifica hosts ativos em uma sub-rede enviando pacotes de eco.
Contexto
O Ping Sweeper é utilizado na fase inicial de exploração de rede. Antes de realizar ataques complexos, o Pentester precisa saber quais máquinas estão "vivas" em um segmento de rede (ex: 192.168.0.0/24).
O funcionamento baseia-se no protocolo ICMP (Internet Control Message Protocol). O script envia um pacote do tipo Echo Request para cada endereço IP do intervalo definido. Se o host estiver ativo e não houver bloqueios de firewall, ele responderá com um Echo Reply, confirmando sua presença na rede.
Possibilidades de Implementação
- Subprocess (Ping do SO): Executa o comando
pingdo Windows ou Linux e analisa a saída de texto. É simples, mas depende do sistema operacional. - Scapy (Packet Crafting): Constrói e envia o pacote manualmente. É a forma mais poderosa e profissional, permitindo total controle sobre os campos do protocolo.
- Multithreading: Essencial para varrer redes inteiras rapidamente. Sem threads, testar 254 endereços levaria minutos; com threads, leva poucos segundos.
Código
Neste módulo, utilizaremos a biblioteca Scapy para manipulação direta de pacotes.
Requisito: pip install scapy
from scapy.all import IP, ICMP, sr1
from concurrent.futures import ThreadPoolExecutor
import ipaddress
# --- CONFIGURAÇÕES DO MÓDULO ---
REDE_ALVO = "192.168.1.0/24" # Define o range da rede
TIMEOUT = 1.0 # Tempo de espera pela resposta
THREADS = 50 # Velocidade da varredura
def ping_host(ip):
"""
Constrói e envia um pacote ICMP Echo Request para um endereço IP.
"""
ip_str = str(ip)
# Camada IP (Destino) / Camada ICMP (Tipo 8 - Echo Request)
packet = IP(dst=ip_str)/ICMP()
try:
# sr1: Envia e espera por 1 resposta
# verbose=0: Oculta logs internos do Scapy
reply = sr1(packet, timeout=TIMEOUT, verbose=0)
if reply:
print(f"[+] Host Ativo: {ip_str}")
return ip_str
except Exception:
pass
return None
def main():
print("-" * 60)
print("Módulo: ICMP Ping Sweeper | Projeto: 30 Lessons in Python")
print("-" * 60)
print(f"[*] Escaneando rede: {REDE_ALVO}")
# Gera a lista de IPs a partir da notação CIDR
network = ipaddress.ip_network(REDE_ALVO, strict=False)
hosts = list(network.hosts())
print(f"[*] Testando {len(hosts)} endereços...\n")
hosts_encontrados = []
# Uso de ThreadPoolExecutor para disparar pings simultâneos
with ThreadPoolExecutor(max_workers=THREADS) as executor:
results = executor.map(ping_host, hosts)
for res in results:
if res:
hosts_encontrados.append(res)
print("\n" + "-" * 60)
print(f"[*] Varredura finalizada. {len(hosts_encontrados)} hosts ativos identificados.")
if __name__ == "__main__":
# Observação: Executar como administrador/sudo para permitir o uso de Raw Sockets
main()
Observações
- Privilégios: O Scapy precisa de permissões de Administrador (Windows) ou Root/Sudo (Linux) para criar pacotes ICMP brutos.
- Firewalls: Muitos hosts modernos (como Windows com Firewall ativo) são configurados para não responder a pings. Em um pentest real, um host que não responde ao ping pode ainda estar ativo, exigindo escaneamentos TCP posteriores.
- Eficiência de Rede: O uso da biblioteca
ipaddressfacilita a manipulação de máscaras de sub-rede, tornando o módulo flexível para diferentes tamanhos de rede.