Monitora a rede em busca de padrões de ataques DoS

Contexto

O ataque de Syn Flood é uma forma de Negação de Serviço (DoS) que explora o three-way handshake do protocolo TCP. O atacante envia uma avalanche de pacotes SYN (solicitação de conexão), mas nunca responde aos pacotes SYN-ACK do servidor. Isso deixa as conexões "meio-abertas", esgotando os recursos (memória/CPU) do alvo e impedindo que usuários legítimos se conectem.

O objetivo deste módulo é monitorar a interface de rede em tempo real, contar a frequência de pacotes SYN de uma mesma origem e alertar quando um comportamento ultrapassa um limite (threshold) suspeito.

Possibilidades de Implementação

  • Contagem por IP: Mantém um dicionário em memória onde a chave é o IP de origem e o valor é o número de pacotes SYN enviados em um curto intervalo.
  • Análise de Flags: Filtra especificamente pacotes onde apenas a flag S (SYN) está ativa, ignorando conexões já estabelecidas.
  • Ações Automáticas: Pode ser integrado a um firewall local para bloquear automaticamente (via iptables, por exemplo) o IP que exceder o limite.

Código

Este módulo utiliza o Scapy para farejar a rede e a biblioteca collections para gerenciar a contagem de pacotes de forma eficiente.

Requisito: pip install scapy

from scapy.all import sniff, IP, TCP
from collections import Counter
import time

# --- CONFIGURAÇÕES DO MÓDULO ---
LIMITE_SYN = 20          # Número de SYNs por IP antes de alertar
INTERVALO_CHECK = 10     # Janela de tempo em segundos

# Dicionário para rastrear pacotes: { "IP": [timestamp1, timestamp2...] }
historico_conexoes = Counter()

def monitor_syn(packet):
    """
    Analisa cada pacote TCP para identificar flags SYN únicas.
    """
    if packet.haslayer(TCP):
        # Verificamos se APENAS a flag SYN está ativa (valor 2 ou 'S')
        if packet[TCP].flags == 'S':
            src_ip = packet[IP].src
            historico_conexoes[src_ip] += 1

            # Verifica se o IP ultrapassou o limite de segurança
            if historico_conexoes[src_ip] > LIMITE_SYN:
                print(f"[!!!] ALERTA DE SYN FLOOD: {src_ip} enviou {historico_conexoes[src_ip]} pacotes SYN!")
                # Reset opcional para não inundar o terminal de alertas
                # historico_conexoes[src_ip] = 0 

def main():
    print("=" * 60)
    print("Módulo: Syn Flood Detector | Projeto: 30 Lessons in Python")
    print("=" * 60)
    print(f"[*] Monitorando tráfego... Limite: {LIMITE_SYN} SYNs/{INTERVALO_CHECK}s")
    print("[*] Pressione Ctrl+C para encerrar.\n")

    try:
        # Iniciamos o sniffing filtrando apenas tráfego TCP
        sniff(filter="tcp", prn=monitor_syn, store=0)
    except PermissionError:
        print("[!] Erro: Privilégios de Administrador/Root são necessários.")
    except KeyboardInterrupt:
        print("\n[*] Monitoramento finalizado pelo usuário.")

if __name__ == "__main__":
    main()

Observações

  • Falsos Positivos: Port scanners (como o Nmap no modo sS) funcionam enviando pacotes SYN. Este detector irá identificar o scan como um ataque de inundação.
  • Gerenciamento de Memória: Em um ambiente de produção, o dicionário historico_conexoes deve ser limpo periodicamente (ex: a cada 10 segundos) para evitar que o script consuma toda a RAM.
  • Evasão: Atacantes sofisticados usam IP Spoofing (falsificação do IP de origem). Nesse caso, o detector verá muitos IPs diferentes enviando poucos pacotes cada, o que exige uma análise estatística mais complexa.