Captura e analisa pacotes em tempo real (usando a biblioteca Scapy).

Contexto

O Network Sniffer (ou analisador de pacotes) é uma ferramenta que coloca a interface de rede em modo promíscuo para "ouvir" e capturar o tráfego que passa pelo meio físico. Em um cenário de Pentest, ele é utilizado para:

  • Interceptação de Dados: Capturar credenciais (senhas e usuários) enviadas via protocolos não criptografados (HTTP, FTP, Telnet).
  • Análise de Protocolos: Entender como uma aplicação se comunica para buscar falhas na lógica do protocolo.
  • Monitoramento de Rede: Identificar dispositivos suspeitos ou comunicações maliciosas (ex: Beaconing de um Malware).

Possibilidades de Implementação

  • Filtros de Captura (BPF): Utilizar filtros como tcp port 80 para capturar apenas o tráfego que interessa, economizando memória e processamento.
  • Extração de Payloads: Isolar o corpo das requisições para encontrar strings específicas, como "user" ou "password".
  • Análise em Tempo Real: Processar cada pacote no momento em que ele chega, permitindo alertas instantâneos.

Código

Este módulo utiliza a biblioteca Scapy. Ele foi configurado para monitorar tráfego HTTP e exibir a URL e os dados brutos de pacotes que podem conter informações sensíveis.

Requisito: pip install scapy

from scapy.all import sniff, IP, TCP, Raw
import logging

# Oculta mensagens de aviso do Scapy
logging.getLogger("scapy.runtime").setLevel(logging.ERROR)

def process_packet(packet):
    """
    Callback executada para cada pacote capturado.
    Filtra pacotes TCP que contenham dados (camada Raw).
    """
    if packet.haslayer(TCP) and packet.haslayer(Raw):
        payload = packet[Raw].load.decode(errors='ignore')

        # Filtramos palavras-chave comuns em ataques de interceptação
        keywords = ["user", "pass", "login", "username", "password", "set-cookie"]

        if any(key in payload.lower() for key in keywords):
            src_ip = packet[IP].src
            dst_ip = packet[IP].dst
            print(f"\n[!] POSSÍVEL DADO SENSÍVEL DETECTADO!")
            print(f"[*] Origem: {src_ip} -> Destino: {dst_ip}")
            print(f"[*] Conteúdo: {payload[:200]}...") # Exibe apenas os primeiros 200 caracteres
            print("-" * 50)

def main():
    print("=" * 60)
    print("Módulo: Network Sniffer | Projeto: 30 Lessons in Python")
    print("=" * 60)
    print("[*] Iniciando captura de tráfego (Apenas portas 80, 21, 23)...")
    print("[*] Pressione Ctrl+C para parar.\n")

    # sniff: Função principal de captura
    # filter: Sintaxe BPF para capturar apenas tráfego comum sem SSL/TLS
    # prn: Função que será chamada para cada pacote capturado
    # store: 0 para não guardar pacotes na memória (evita crash em capturas longas)
    try:
        sniff(filter="tcp port 80 or tcp port 21 or tcp port 23", 
              prn=process_packet, 
              store=0)
    except PermissionError:
        print("[!] Erro: Você precisa de privilégios de Administrador/Root para cheirar a rede.")
    except Exception as e:
        print(f"[!] Erro inesperado: {e}")

if __name__ == "__main__":
    main()

Observações

  • Privilégios Elevados: Capturar pacotes brutos exige acesso direto ao hardware de rede, portanto o script deve ser executado com Sudo (Linux/macOS) ou Administrador (Windows).
  • Criptografia (TLS/SSL): Este sniffer básico não consegue ler o conteúdo de pacotes HTTPS (porta 443). Ele verá o tráfego, mas o conteúdo estará criptografado. Para isso, seriam necessárias técnicas de SSL Stripping.
  • Interface de Rede: Por padrão, o Scapy escolhe a interface principal. Se você quiser especificar uma (ex: Wi-Fi), use o parâmetro iface="wlan0" na função sniff.