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_conexoesdeve 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.