Introducción
Snort es un potente Sistema de Detección de Intrusos en Red (NIDS) de código abierto. Una de sus características más definitorias es su lenguaje flexible basado en reglas, que permite a los profesionales de la seguridad definir firmas para actividades de red maliciosas.
Las reglas son el puente entre la teoría y la detección. Una idea de seguridad como "los escaneos de puertos son sospechosos" solo se vuelve operativamente útil cuando se expresa en una forma que el motor pueda evaluar frente al tráfico real. Por lo tanto, aprender la sintaxis de las reglas enseña mucho más que el propio Snort; enseña cómo los defensores traducen el comportamiento en una lógica legible por máquina.
En este laboratorio, aprenderás la sintaxis central y la anatomía de las reglas personalizadas de Snort. Escribirás reglas fundamentales definiendo acciones, protocolos, direcciones IP, puertos y opciones para detectar y alertar específicamente sobre pings ICMP y patrones de tráfico TCP anómalos. Al finalizar este laboratorio, comprenderás cómo construir, probar y validar tus propias reglas de Snort.
Comprender la sintaxis y el encabezado de las reglas
En este paso, aprenderás la estructura básica de una regla de Snort y crearás un archivo para almacenar tus reglas personalizadas.
El encabezado es, en realidad, una definición de alcance. Decide qué tráfico merece ser evaluado más a fondo. Esto es importante porque una detección eficiente comienza reduciendo al máximo el conjunto de tráfico candidato antes de aplicar comprobaciones de contenido más profundas. Los encabezados amplios son más fáciles de escribir, pero también pueden generar más ruido.
Una regla de Snort se divide en dos secciones lógicas principales: el Encabezado de la regla (Rule Header) y las Opciones de la regla (Rule Options).
El Encabezado de la regla contiene la acción, el protocolo, las direcciones IP de origen y destino, y los puertos de origen y destino. Dicta quién se comunica con quién y qué protocolo están utilizando. La sintaxis básica se ve así:
[Action] [Protocol] [Source IP] [Source Port] -> [Destination IP] [Destination Port] (Options)
Aquí tienes un desglose de los componentes del encabezado:
- Action (Acción): Qué debe hacer Snort cuando encuentra un paquete que coincide con los criterios de la regla (por ejemplo,
alert,log,drop). - Protocol (Protocolo): El protocolo del tráfico (por ejemplo,
tcp,udp,icmp,ip). - IP Addresses (Direcciones IP): Las direcciones IP de origen y destino. Puedes usar
anypara coincidir con todas las direcciones IP. - Ports (Puertos): Los puertos de red de origen y destino. Puedes usar
anypara coincidir con todos los puertos. - Direction Operator (Operador de dirección): El símbolo
->indica la dirección del tráfico (del origen al destino). También puedes usar<>para tráfico bidireccional.
Para comenzar a escribir nuestras propias reglas, necesitamos un archivo dedicado. Asegúrate de estar en tu directorio de trabajo predeterminado (~/project) y crea un nuevo archivo llamado local.rules.
Usa el comando touch para crear un archivo vacío:
touch ~/project/local.rules
Puedes verificar que el archivo se creó correctamente listando el contenido de tu directorio:
ls -l ~/project/local.rules
Deberías ver una salida similar a esta, confirmando que el archivo existe y actualmente está vacío:
-rw-r--r-- 1 labex labex 0 Jul 25 10:00 /home/labex/project/local.rules
Escribir una regla de detección ICMP
En este paso, escribirás tu primera regla de Snort para detectar tráfico ICMP. ICMP (Internet Control Message Protocol) es comúnmente utilizado por utilidades de red como ping para verificar la conectividad.
ICMP es un buen ejemplo didáctico porque es simple y fácil de reconocer, pero también ilustra un punto operativo real: no toda detección significa un ataque. Muchas redes utilizan ping legítimamente. El trabajo del analista es combinar lo que la regla detectó con el contexto ambiental antes de decidir si el evento es benigno o sospechoso.
Escribiremos una regla que active una alerta cada vez que cualquier paquete ICMP viaje desde cualquier origen a cualquier destino.
Abre tu archivo local.rules usando el editor de texto nano:
nano ~/project/local.rules
Escribe la siguiente regla en el editor:
alert icmp any any -> any any (msg:"ICMP Ping Detected"; sid:1000001; rev:1;)
Analicemos qué significa esta regla:
alert: La acción a tomar. Snort generará una alerta.icmp: El protocolo que estamos monitoreando.any any -> any any: El tráfico puede originarse desde cualquier IP y cualquier puerto, y dirigirse a cualquier IP y cualquier puerto.(msg:"ICMP Ping Detected"; sid:1000001; rev:1;): Estas son las opciones de la regla.msges el mensaje de alerta,sides un ID único de Snort (las reglas personalizadas deben tener un ID de 1,000,000 o superior), yreves el número de revisión de la regla.
Después de escribir la regla, guarda el archivo y sal de nano presionando Ctrl+O, Enter para confirmar el nombre del archivo, y luego Ctrl+X para salir.
Ahora, probemos si Snort entiende nuestro archivo de reglas. Snort tiene un modo de prueba (-T) que verifica la configuración y las reglas en busca de errores de sintaxis sin iniciar realmente el motor de detección.
Ejecuta el siguiente comando para probar tu archivo de reglas:
sudo snort -T -c ~/project/local.rules
Verás mucha información mientras Snort se inicializa. Busca cerca del final de la salida un mensaje de éxito que indique que Snort validó correctamente la configuración:
Snort successfully validated the configuration!
Snort exiting
Si ves este mensaje, tu regla ICMP es sintácticamente correcta.
Escribir una regla de alerta de puerto TCP
En este paso, escribirás una regla para detectar tráfico TCP específico. Mientras que ICMP no utiliza puertos, TCP y UDP sí lo hacen. Esto nos permite escribir reglas que se dirijan a servicios específicos, como HTTP (puerto 80) o SSH (puerto 22).
Los puertos te dan un contexto de aplicación aproximado. No cuentan toda la historia, pero a menudo son la primera aproximación que usan los defensores para separar los tipos de servicio. Una regla que se basa en el puerto de destino 80 esencialmente dice: "Me interesa el tráfico que probablemente esté dirigido a un servicio web".
Escribiremos una regla que nos alerte cada vez que alguien intente conectarse a un servidor web en el puerto 80.
Abre tu archivo local.rules nuevamente usando nano:
nano ~/project/local.rules
Agrega una nueva línea debajo de tu regla ICMP existente y escribe la siguiente regla TCP:
alert tcp any any -> any 80 (msg:"HTTP Traffic to Port 80 Detected"; sid:1000002; rev:1;)
Analicemos el encabezado de esta nueva regla:
alert tcp: Estamos generando una alerta para el protocolo TCP.any any: El origen puede ser cualquier dirección IP y cualquier puerto.->: El tráfico fluye hacia el destino.any 80: El destino puede ser cualquier dirección IP, pero el puerto de destino debe ser 80.
Observa que incrementamos el sid a 1000002. Cada regla de Snort debe tener un ID de Snort único.
Guarda el archivo (Ctrl+O, Enter) y sal de nano (Ctrl+X).
Una vez más, es una buena práctica probar la sintaxis de tu regla para asegurarte de que no haya errores tipográficos. Ejecuta el comando de prueba de Snort:
sudo snort -T -c ~/project/local.rules
Desplázate hasta el final de la salida para confirmar que Snort validó correctamente la configuración. Ahora deberías tener dos reglas cargadas correctamente.
Incluir opciones de regla (Msg, SID, Rev)
En este paso, profundizaremos en la sección de Opciones de regla (Rule Options). La sección de opciones está encerrada entre paréntesis () y contiene pares de palabra clave/valor separados por puntos y coma ;.
Las opciones de regla son donde una categoría de tráfico aproximada se convierte en una alerta significativa. Un msg claro ayuda a un humano a entender el evento. Un sid único permite a los sistemas rastrear qué regla se activó. Un valor rev permite a los equipos gestionar el contenido de detección a lo largo del tiempo. Estos campos respaldan las operaciones, no solo la sintaxis.
Ya has utilizado las tres opciones más fundamentales. La primera es msg, que es el mensaje que se imprimirá en los registros de alerta y debe ser descriptivo. La segunda es sid, que significa Snort ID; las reglas escritas por usuarios deben tener un SID mayor a 1,000,000. La tercera es rev, que representa el número de revisión; cada vez que modifiques una regla, debes incrementar este número para realizar un seguimiento de las versiones.
Escribamos una regla para detectar intentos de conexión SSH (puerto 22) para practicar el uso de estas opciones.
Abre tu archivo local.rules:
nano ~/project/local.rules
Agrega la siguiente regla al final del archivo:
alert tcp any any -> any 22 (msg:"SSH Connection Attempt"; sid:1000003; rev:1;)
En esta regla, establecimos un msg básico y le asignamos un nuevo SID único (1000003).
Supongamos que más tarde decidimos actualizar el mensaje de esta regla para que sea más específico. Cambiaríamos el msg e incrementaríamos el rev a 2. Hagamos eso ahora. Modifica la regla SSH que acabas de escribir al final del archivo para que se vea así:
alert tcp any any -> any 22 (msg:"Possible SSH Brute Force Attempt"; sid:1000003; rev:2;)
Guarda el archivo (Ctrl+O, Enter) y sal de nano (Ctrl+X).
Finalmente, ejecuta la verificación de sintaxis una última vez para asegurarte de que tus tres reglas estén perfectamente formateadas:
sudo snort -T -c ~/project/local.rules
Busca el mensaje de éxito de validación. Ahora has escrito y estructurado con éxito múltiples reglas personalizadas de Snort utilizando encabezados y opciones.
Resumen
En este laboratorio, aprendiste las habilidades fundamentales necesarias para escribir reglas personalizadas de Snort. Exploraste la anatomía de una regla, dividiéndola en el Encabezado de la regla y las Opciones de la regla. Escribiste con éxito reglas para detectar tráfico ICMP general y tráfico de puertos TCP específicos. Además, aprendiste a utilizar opciones de regla esenciales como msg, sid y rev para hacer que tus alertas sean descriptivas y identificables de forma única. Estas habilidades forman la base para crear firmas avanzadas de detección de intrusos en la red.



