
Laboratorio de Snort 3 IDS → IPS en Kali. Reglas de detección personalizadas + aplicación de iptables contra reconocimiento ICMP, escaneos SYN de Nmap, fuerza bruta FTP de Hydra y backdoor de vsftpd 2.3.4 (CVE-2011-2523).
Un despliegue completo de Snort 3 como Sistema de Detección de Intrusiones (monitoreo pasivo) y como Sistema de Prevención de Intrusiones (bloqueo activo mediante iptables), validado contra cuatro vectores de ataque en una red virtual de tres máquinas sobre Kali Linux.
El laboratorio demuestra la distinción operativa entre detección y prevención ejecutando una cadena de ataque idéntica de cuatro vectores dos veces: primero contra un IDS que registra pero no puede bloquear, y luego contra un IDS + capa IPS con iptables que elimina ataques selectivamente mientras preserva el tráfico legítimo.
| Componente | Detalles |
|---|---|
| Analizador / Router | Kali Linux — 3 adaptadores: eth0 WAN (192.168.10.143, NAT), eth1 LAN1 (10.10.10.1, solo anfitrión), eth2 LAN2 (192.168.50.1, solo anfitrión) |
| Atacante | Kali Linux — eth0 en VMnet9 (10.10.10.10) — puerta de enlace predeterminada 10.10.10.1 |
| Objetivo | Metasploitable 2 — eth0 en VMnet10 (192.168.50.10) — puerta de enlace predeterminada 192.168.50.1 |
| Versión de Snort | Snort++ 3.12.1.0-0kali1 (instalado en el Analizador) |
| Herramientas de ataque | Nmap 7.99, Hydra v9.6, Metasploit Framework (msfconsole) |
| Virtualización | VMware — VMnet9 = 10.10.10.0/24, VMnet10 = 192.168.50.0/24 (ambos solo anfitrión) |
Todo el tráfico entre el Atacante y Metasploitable se fuerza a través del Analizador, convirtiéndolo en el punto de estrangulamiento natural tanto para el monitoreo como para la aplicación.
┌─────────────────────────┐
│ Analizador / Router │
│ Kali + Snort 3 │
│ │
Atacante Kali ──VMnet9──┤ eth1: 10.10.10.1 │
10.10.10.10 │ │
│ eth0: 192.168.10.143 ───┼──> WAN (NAT)
│ │
Metasploitable 2 ─VMnet10┤ eth2: 192.168.50.1 │
192.168.50.10 │ │
└─────────────────────────┘
Reemplace este boceto ASCII con
screenshots/01-network-topology.pnguna vez que tenga la figura en su lugar:Topology
El laboratorio se ejecuta en dos etapas con una cadena de ataque idéntica de cuatro vectores en cada una:
ping para descubrimiento de hostnmap -sS para enumeración de puertos (1000 puertos)Etapa 1 (IDS) ejecuta Snort pasivamente en el Analizador con cinco reglas personalizadas — observe las alertas en tiempo real, confirme que la explotación continúa de todos modos.
Etapa 2 (IPS) combina Snort con una capa de aplicación de iptables utilizando reglas de descarte quirúrgicas — confirme que los ataques son bloqueados mientras que el ping ICMP y el inicio de sesión FTP legítimo permanecen funcionales.
MASQUERADE + FORWARD para que el Analizador enrute entre subredes y hacia la WAN — consulte scripts/router_config.sh.scripts/ping_check.sh antes de instalar Snort.Snort se instala a través del administrador de paquetes de Kali (sudo apt install snort -y) y se configura en /etc/snort/snort.conf:
HOME_NET = "10.10.10.0/24,192.168.50.0/24"
EXTERNAL_NET = "any"
ips = {
enable_builtin_rules = true,
include = "/etc/snort/rules/local.rules",
variables = default_variables
}
alert_fast = { file = true, packet = false }
HOME_NET cubre ambas subredes internas para que Snort trate todo el tráfico entre subredes en el Analizador como digno de inspección. alert_fast produce alertas compactas de una línea (el registro por paquete generaría un volumen excesivo).
Validación de configuración:
sudo snort -T -c /etc/snort/snort.conf
# Resultado: 652 reglas cargadas (5 personalizadas de texto + 647 integradas), 0 advertencias
Cinco reglas en /etc/snort/rules/local.rules (archivo completo en scripts/local.rules):
| SID | Nombre | Disparador |
|---|---|---|
| 1000001 | ICMP Ping Detectado | Cualquier tráfico ICMP en cualquier dirección — captura pings de reconocimiento |
| 1000002 | Intento de Conexión FTP | Cualquier conexión TCP al puerto 21 — captura tráfico legítimo y de fuerza bruta |
| 1000003 | Posible Escaneo SYN de Nmap | Paquetes TCP con solo el flag SYN establecido (flags:S) — la firma de un escaneo de media apertura |
| 1000004 | Intento de Puerta Trasera VSFTPD 2.3.4 | content:":)" en el puerto FTP 21 — la cadena exacta de activación de CVE-2011-2523 |
| 1000005 | Posible Shellcode de Metasploit | `content:" |
Snort se ejecuta en modo pasivo en ambas interfaces internas:
sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 \
-A alert_fast -l /var/log/snort/
# Observe las alertas en una segunda terminal:
sudo tail -f /var/log/snort/alert_fast.txt
La salida de inicio confirma pcap DAQ configured to passive — Snort ve cada paquete pero no puede descartar ni modificar ninguno.
Después de ejecutar scripts/attack_simulator.sh desde el Atacante:
| Ataque | Detección | Resultado |
|---|---|---|
| Reconocimiento ICMP | ✅ SID 1000001 — alertas bidireccionales | Ping completado |
| Escaneo SYN de Nmap | ✅ SID 1000003 — miles de alertas en <1 segundo | 23 puertos abiertos enumerados |
| Fuerza bruta FTP con Hydra | ✅ SID 1000002 — alertas repetidas de conexión FTP | Credenciales msfadmin:msfadmin descifradas |
| Puerta trasera vsftpd 2.3.4 | ✅ SID 1000004 — coincidencia de contenido :) disparada | Shell Meterpreter como root obtenida |
El IDS detectó todo y no detuvo nada. Esta es la lección central de la Etapa 1: un IDS funcional sin aplicación es un sistema de alarma, no una cerradura. Para cuando un analista de SOC lee las alertas, el atacante ya es root.
Una observación secundaria: las reglas integradas de Snort (116:408, 116:414) se disparan con tráfico de difusión DHCP — no es malicioso, pero en un despliegue de producción necesitarían reglas de supresión para mantener el registro de alertas accionable.
La capa IPS se despliega con scripts/ips_setup.sh, que:
-D) para registro continuo| Regla | Lo que hace |
|---|---|
ACCEPT icmp | Permite explícitamente todo ICMP — preserva las verificaciones de conectividad |
DROP tcp dpt:21 STRING ":)" | Descarta paquetes que contienen el disparador de la puerta trasera vsftpd 2.3.4 en el puerto 21 |
ACCEPT tcp --syn -m limit --limit 10/s --limit-burst 20 | Permite apretones de manos TCP normales dentro del límite de velocidad |
DROP tcp --syn (después del límite) | Descarta inundaciones SYN que excedan 10/s — derrota escaneos SYN de Nmap |
DROP tcp dpt:21 -m connlimit --connlimit-above 5 --connlimit-mask 32 | Bloquea > 5 conexiones FTP concurrentes por origen — derrota el paralelismo de Hydra |
ACCEPT eth1→eth0, ACCEPT eth2→eth0 | Enrutamiento de salida normal |
ACCEPT -m conntrack --ctstate RELATED,ESTABLISHED | Stateful — preserva sesiones establecidas |
El mismo script de ataque se volvió a ejecutar desde el Atacante:
| Ataque | Resultado de la Etapa 2 |
|---|---|
| Reconocimiento ICMP | ✅ Permitido (intencional) |
| Escaneo SYN de Nmap | ❌ Bloqueado — 1000 puertos tcp filtrados (sin respuesta), el escaneo tomó 21.71 s en lugar de <1 s |
| Fuerza bruta FTP con Hydra | ❌ Bloqueado — todos los hijos fueron deshabilitados debido a demasiados errores de conexión — 0 contraseñas válidas encontradas |
| Puerta trasera vsftpd | ❌ Bloqueado — Rex::ConnectionTimeout — Exploit completado, pero no se creó ninguna sesión |
Dos verificaciones manuales confirmaron la aplicación selectiva:
ping -c 4 192.168.50.10 → 4 paquetes transmitidos, 4 recibidos, 0% pérdidaftp 192.168.50.10 con msfadmin:msfadmin → 220 (vsFTPd 2.3.4) … 230 Login successfulPrueba cuantitativa de los contadores de paquetes de iptables durante la ejecución: 2051 paquetes aceptados, 12 paquetes descartados por la regla connlimit de FTP, 808 paquetes ICMP aceptados — aplicación selectiva en números.
Incluso en modo IPS, Snort continuó disparando alertas SID 1000002 / 1000003 en paquetes que llegaron a su punto de inspección pasiva antes de que iptables descartara los posteriores — lo que significa que iptables proporciona aplicación mientras Snort proporciona registro de auditoría, operando en conjunto.
| Ataque / Tráfico | Etapa 1 (solo IDS) | Etapa 2 (IDS + iptables IPS) |
|---|---|---|
| Ping ICMP | Detectado ✅ | Permitido ✅ (intencional) |
| Escaneo SYN de Nmap | Detectado — 23 puertos abiertos encontrados | Bloqueado — 1000 filtrados |
| Fuerza bruta FTP con Hydra | Detectado — msfadmin:msfadmin descifrado | Bloqueado — 0 contraseñas encontradas |
| Exploit vsftpd 2.3.4 | Detectado — Shell Meterpreter como root | Bloqueado — tiempo de espera de conexión |
| Inicio de sesión FTP legítimo | n/a | Preservado (230 Login successful) |
Sí — cada uno de los SIDs 1000001–1000004 se dispararon correctamente durante la simulación de ataque:
:) atrapó la secuencia exacta de bytes del exploit.Pero detección ≠ prevención. El exploit de vsftpd abrió un shell Meterpreter como root mientras cada alerta se disparaba. Un analista de SOC observando el IDS en tiempo real habría visto el compromiso — pero con el atacante ya siendo root en segundos, la alerta por sí sola no es suficiente. Este es el núcleo operativo de por qué existe el IPS.
La implementación logró una mitigación completa de ataques con cero impacto observable en el tráfico legítimo. La efectividad proviene del diseño quirúrgico de reglas — cada regla de iptables apunta a una firma de comportamiento, no a un protocolo amplio:
connlimit por origen bloquea el paralelismo de herramientas de fuerza bruta sin romper FTP de sesión única.STRING descarta la carga útil exacta del exploit sin filtrar tráfico legítimo de inicio de sesión FTP.Una limitación reconocida: ICMP está completamente permitido, lo que significa que un atacante aún puede confirmar que Metasploitable está activo mediante ping. En un entorno de mayor seguridad, esto se limitaría en velocidad o se restringiría a fuentes confiables. En este laboratorio, ICMP es el mecanismo principal de verificación de conectividad, por lo que permanece abierto.
Este laboratorio utiliza una máquina Snort dedicada. En comparación con ejecutar Snort como un complemento dentro de un dispositivo de firewall como pfSense u OPNsense:
Ventajas del enfoque dedicado:
Compensaciones:
Snort dedicado es la opción correcta para entornos empresariales que necesitan rendimiento, posicionamiento y personalización. El enfoque del complemento pfSense/OPNsense tiene más sentido para entornos de pequeñas empresas o laboratorios domésticos que priorizan la facilidad de uso.
La Etapa 2 es técnicamente Snort pasivo + aplicación con iptables, no Snort ejecutándose en modo en línea verdadero — Snort mismo registra (pcap DAQ configured to passive), e iptables realiza el descarte basado en límites de velocidad, coincidencias de cadenas y conteos de conexiones.
Este es un patrón de despliegue legítimo y común (así es como funcionan muchas pilas IDS/IPS basadas en Linux en el mundo real). Un seguimiento natural sería migrar la Etapa 2 a una configuración en línea verdadera usando snort --daq nfq (o afpacket en modo en línea) con acciones de reglas reject / drop de Snort, para que Snort mismo realice el descarte basado en la coincidencia completa de firmas en lugar de delegar en iptables.
snort-ids-ips-lab/
├── README.md ← este archivo
├── report/
│ ├── Snort-IDS-IPS-Report.pdf ← informe completo del laboratorio
│ └── Snort-IDS-IPS-Report.docx ← fuente editable
├── scripts/
│ ├── router_config.sh ← reenvío de IP + enrutamiento iptables
│ ├── ping_check.sh ← verificación de conectividad
│ ├── attack_simulator.sh ← cadena de ataque de 4 vectores
│ ├── ips_setup.sh ← reglas iptables de IPS + demonio Snort
│ └── local.rules ← 5 reglas personalizadas de Snort (SID 1000001-1000005)
├── screenshots/ ← figuras del informe
├── .gitignore
└── LICENSE
⚠️ Solo para uso en laboratorio. Estos scripts ejecutan exploits reales y herramientas de fuerza bruta contra un objetivo deliberadamente vulnerable. No los ejecute contra ningún sistema que no posea y para el cual no tenga autorización explícita por escrito para probar.
scripts/router_config.sh, luego scripts/ping_check.sh para confirmar la conectividad total.sudo apt update && sudo apt install snort -y
scripts/local.rules en /etc/snort/rules/local.rules y configure HOME_NET = "10.10.10.0/24,192.168.50.0/24" en /etc/snort/snort.conf.sudo snort -T -c /etc/snort/snort.conf — espere 652 reglas cargadas, 0 advertencias.sudo snort -c /etc/snort/snort.conf -i eth1 -i eth2 -A alert_fast -l /var/log/snort/
# En otra terminal:
sudo tail -f /var/log/snort/alert_fast.txt
sudo ./scripts/attack_simulator.sh — observe las alertas disparándose y el shell Meterpreter.sudo ./scripts/ips_setup.sh, luego vuelva a ejecutar la cadena de ataque en el Atacante. Confirme los bloqueos, luego pruebe manualmente:
ping -c 4 192.168.50.10 # debería tener éxito
ftp 192.168.50.10 # msfadmin / msfadmin — debería tener éxito
Todas las actividades documentadas en este repositorio se llevaron a cabo exclusivamente dentro de un entorno de laboratorio virtual autónomo de VMware con fines académicos supervisados. No se atacaron, escanearon ni afectaron de ninguna manera sistemas externos, de producción o del mundo real. Metasploitable 2 es una máquina virtual intencionalmente vulnerable diseñada específicamente para capacitación en seguridad.
Este material no debe utilizarse para replicar estas actividades contra ningún sistema real sin autorización explícita por escrito del propietario del sistema. El escaneo de puertos no autorizado, los ataques de credenciales o la explotación de servicios de red son ilegales en la mayoría de las jurisdicciones.
MIT — consulte LICENSE. El informe del laboratorio en sí se proporciona como referencia educativa.