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 80para 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çãosniff.