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 ping do 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 ipaddress facilita a manipulação de máscaras de sub-rede, tornando o módulo flexível para diferentes tamanhos de rede.