Page cover

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:

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

  2. Prevención de intrusiones (IPS):

    • En modo inline, puede bloquear tráfico malicioso automáticamente, evitando que ataques lleguen a los sistemas finales.

  3. Registro y auditoría:

    • Almacena información detallada sobre paquetes de red, permitiendo auditorías y análisis forense de incidentes.

  4. 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:

sudo apt install snort

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_NET en /etc/snort/snort.conf antes de usar Snort en producción.

Paso 2. Añadir regla

abrir el siguiente archivo con nano

sudo nano /etc/snort/rules/local.rules

y escribimos la siguiente regla debajo:

alert tcp any any -> any any (msg: "ESCANEO DE NMAP DETECTADO!!!"; flags: S; threshold: type threshold, track by_src, count 10, seconds 60; sid: 1000001; rev: 1;)

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.

Paso 3. configurar Snort

Y ahora con la regla activa vamos al siguiente archivo de configuración de snort:

sudo nano /etc/snort/snort.conf

Hasta la siguiente línea indicada que debemos descomentar:

# syslog
output alert_syslog: LOG_AUTH LOG_ALERT

Esto hará que las alertas se puedan ver claramente, ahora deberemos guardar los cambios reiniciando el servicio con systemd:

sudo systemctl restart snort
  • O bien con el daemon en otros sistemas con:

    sudo snort -c /etc/snort/snort.conf -i <interfaz>

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:

nmap -p- -sS -sC -sV --min-rate=5000 -n -vvv -Pn 192.168.122.209

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:

cat /var/log/auth.log

#Algunas guias modernas usan alert_fast o alert_full hacia /var/log/snort/alerts.log para no mezclar con logs de sistema, en ese caso:

cat /var/log/snort/alerts.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:S detecta 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:

alert tcp any any -> any 80 (msg:"Conexión HTTP completa detectada"; flags:PA; sid:1000002; rev:1;)
  • 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:

threshold: type limit, track by_src, count 1, seconds 60;
  • 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:

alert tcp any any -> any 22 (msg:"Conexión SSH establecida"; flags:PA; sid:1000003; rev:1;)
alert tcp any any -> any 80 (msg:"Conexión HTTP establecida"; flags:PA; sid:1000004; rev:1;)

Esto evita que Snort genere alertas por tráfico de puertos no relevantes.

En resumen, añadiremos dos reglas que nos quedaran así:

# Regla para HTTP (puerto 80)
alert tcp any any -> any 80 (msg:"[SNORT] Conexión HTTP establecida"; flags:PA; threshold:type limit, track by_src, count 1, seconds 60; sid:1000002; rev:1;)

# Regla para SSH (puerto 22)
alert tcp any any -> any 22 (msg:"[SNORT] Conexión SSH establecida"; flags:PA; threshold:type limit, track by_src, count 1, seconds 60; sid:1000003; rev:1;)

Ahora para comprobar si salta alerta puedes ejecutar lo siguiente:

# Para HTTP (puerto 80):
nmap -p 80 -sC -sV --script http-title 192.168.122.209

# Para SSH (puerto 22):
nmap -p 22 -sC -sV --script ssh2-enum-algos 192.168.122.209

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