Alerta de escaneo de puertos con Snort
A partir de un video que vi, me puse a revisar como crear alertas de escaneo de nmap a nuestro servidor. Como ya he hablado en otra entrada sobre lo que es un escaneo de red no me voy a extender, simplemente primero hay que saber un poco que es Snort:
Snort es un software de seguridad de red de código abierto que analiza el tráfico de red en tiempo real para detectar actividades sospechosas o maliciosas. Desarrollado por Cisco Systems, aunque su origen es comunitario y open-source. Este utiliza un sistema de reglas que define patrones de ataques, vulnerabilidades y comportamientos anómalos para identificar amenazas.

Este en general sirve para:
Detección de intrusiones (IDS):
Monitoriza el tráfico de red y genera alertas cuando detecta patrones de ataque conocidos, como escaneos de puertos, ataques DoS/DDoS o intentos de explotación de vulnerabilidades.
Prevención de intrusiones (IPS):
En modo inline, puede bloquear tráfico malicioso automáticamente, evitando que ataques lleguen a los sistemas finales.
Registro y auditoría:
Almacena información detallada sobre paquetes de red, permitiendo auditorías y análisis forense de incidentes.
Análisis de tráfico:
Permite inspeccionar protocolos, identificar servicios expuestos y evaluar comportamientos anómalos en la red.
Ahora sí vamos con la guía paso a paso:
Paso 1. Instalación
Snort es una herramienta presente en la mayoría de repositorios oficiales de linux así que será tan sencillo como:
Durante la instalación se te preguntará por la dirección de red que quieres monitorear (HOME_NET). Es importante configurarla correctamente, de lo contrario Snort puede no generar alertas.
Recomendación: Revisa la configuración de
HOME_NETen/etc/snort/snort.confantes de usar Snort en producción.
Paso 2. Añadir regla
abrir el siguiente archivo con nano
y escribimos la siguiente regla debajo:
Explicación:
flags: S;especifica que debe detectar paquetes TCP SYN (común en escaneos de puertos).threshold: type threshold, track by_src, count 10, seconds 60;genera una alerta si se detectan 10 paquetes que cumplen con la regla en un plazo de 60 segundos desde la misma fuente.sid: 1000001;establece un identificador único para la regla.rev: 1;indica la revisión de la regla.
Hay que tener en cuenta que esta regla podría generar falsos positivos, ya que muchos escaneos legítimos (o incluso conexiones normales) pueden disparar paquetes SYN.
Asegúrate que local.rules esté incluido correctamente en snort.conf, para ello revisa que la línea include $RULE_PATH/local.rules esté descomentada. Puedes hacerlo como en el paso 3.
Paso 3. configurar Snort
Y ahora con la regla activa vamos al siguiente archivo de configuración de snort:
Hasta la siguiente línea indicada que debemos descomentar:
Esto hará que las alertas se puedan ver claramente, ahora deberemos guardar los cambios reiniciando el servicio con systemd:
O bien con el daemon en otros sistemas con:
Paso 4. Leer la alerta
Una vez hecho esto, desde una máquina atacante vamos a realizar el escaneo de puertos con nmap a la IP del host:
La alerta se disparará solo si la regla detecta al menos 10 paquetes SYN por fuente en 60 segundos. Ten en cuenta que si el escaneo es más lento, no se disparará por lo que aquí estamos haciendo la concesión. Una vez ejecutado, ahora sí si vamos a revisar el archivo de log:
Veremos claramente que se esta guardando la alerta de nmap.
Paso extra. Detección sin falsos positivos

Para que Snort genere alertas solo ante accesos “satisfactorios” o conexiones establecidas y no ante simples escaneos SYN (que pueden ser falsos positivos y se dan de forma muy frecuente) debemos cambiar la forma en que se definen las reglas y ajustar su lógica.
Actualmente tenemos definido el sistema para detectar conexiones completas en lugar de solo SYN, vamos a crear una regla para detectar SYN+ACK a través de HTTP con más precisión.
La regla actual con
flags:Sdetecta paquetes SYN, que se envían al iniciar una conexión TCP. Esto incluye escaneos de puertos y conexiones legítimas. Por eso aparecen falsos positivos.
Pero para saber conexiones satisfactorias debemos detectar el paquete ACK de la conexión establecida o un intercambio completo de 3 vías (SYN, SYN-ACK, ACK):

Para ello configuraremos la siguiente regla en el mismo archivo de antes /etc/snort/rules/local.rules:
flags:PA= Push + ACK, normalmente presente en tráfico que ya está transmitiendo datos, no solo SYN.
Así Snort alertará solo cuando haya datos enviados por un host, lo que reduce falsos positivos.
Lo siguiente será usar threshold basado en eventos reales ya que nuestra regla dispara al recibir 10 SYN en 60 segundos lo cual genera alertas por escaneos rápidos aunque no haya conexión exitosa.
Una mejor estrategia es ajustar el threshold para disparar solo después de detectar un paquete con datos:
Lo cual asegura que se genere una única alerta por conexión establecida, en lugar de cada SYN.
Si queremos hilar más fino podemos incluso filtrar por puertos específicos de interés
Para ello podemos evitar usar
any any→ reduciremos falsos positivos al enfocarnos en puertos de servicios críticos:
Esto evita que Snort genere alertas por tráfico de puertos no relevantes.
En resumen, añadiremos dos reglas que nos quedaran así:
Ahora para comprobar si salta alerta puedes ejecutar lo siguiente:
O usar el mismo de antes que es más agresivo en su búsqueda. Para revisar resultados puedes hacerlo como en el paso 4.
Rerencias:
Última actualización