Sistemas de Detección de intrusos y Snort. (II). Creación de Reglas (I).

Ya vimos en el Capítulo I de Snort el funcionamiento de este IDS y su implementación en nuestra red. Ahora vamos a aprender a crear nuestras propias reglas.

Introducción.

El lenguaje usado por Snort es flexible y potente, basado en una serie de normas que serán las que nos sirvan de guía para la escritura de las reglas.

Dentro de estas normas tenemos:

  • la descripción de cada regla
  • cabecera
  • opciones
  • uso de preprocesadores

Las reglas Snort (Snort Rules) deben ser escritas en una sola línea, de lo contrario habrá que usar el carácter de escape (\):

alert tcp any 110 -> (content: “filename=\”TOMOFONICA.TXT.vbs\””;\
nocase; msg: “Virus tomofonica”;)

La reglas Snort las podemos dividir en dos secciones lógicas, a saber: cabecera de la regla y opciones:

  • La cabecera contiene la acción de la regla en sí, protocolo, IPs, máscaras de red, puertos origen y destino y destino del paquete o dirección de la operación.
  • La sección opciones contiene los mensajes y la información necesaria para la decisión a tomar por parte de la alerta en forma de opciones.

Resumiendo lo visto hasta ahora, las reglas Snort las dividiremos de la siguiente manera:

CABECERA

  • Acción
  • Protocolos involucrados
  • Direcciones IP
  • Números de puerto
  • Dirección de la operación

Introducción.

El lenguaje usado por Snort es flexible y potente, basado en una serie de normas que serán las que nos sirvan de guía para la escritura de las reglas.

Dentro de estas normas tenemos:

  • la descripción de cada regla
  • cabecera
  • opciones
  • uso de preprocesadores

Las reglas Snort (Snort Rules) deben ser escritas en una sola línea, de lo contrario habrá que usar el carácter de escape (\):

alert tcp any 110 -> (ontent: “filename=\”TOMOFONICA.TXT.vbs\””; \ nocase; msg: “Virus tomofonica”;)

La reglas Snort las podemos dividir en dos secciones lógicas, a saber: cabecera de la regla y opciones:

  • La cabecera contiene la acción de la regla en sí, protocolo, IPs, máscaras de red, puertos origen y destino y destino del paquete o dirección de la operación.
  • La sección opciones contiene los mensajes y la información necesaria para la decisión a tomar por parte de la alerta en forma de opciones. Irán entre paréntesis.

Resumiendo lo visto hasta ahora, las reglas Snort las dividiremos de la siguiente manera:

CABECERA

  • Acción
  • Protocolos involucrados
  • Direcciones IP de origen y destino
  • Números de puerto
  • Dirección de la operación

OPCIONES

  • Mensaje
  • Opciones de decisión

EJEMPLO 1

Veamos ahora un ejemplo de regla Snort para alertar de un escaneo nmap del tipo TCP ping:

alert tcp $EXTERNAL_NET any -> $HOME_NET any / (msg:”Escaneo ping con nmap”;flags:A;ack:0; / reference:arachnids,28;classtype:attempted-recon; sid:628;/ rev:1;)

Analicemos esta alerta:

CABECERA

  • Acción de la regla: alert

  • Protocolo: tcp

  • Direccion IP origen: $EXTERNAL_NET (toda la red)

  • Puerto IP origen: any (cualquiera)

  • Direccion IP destino: $HOME_NET (toda nuestra red)

  • Puerto IP destino: any (cualquiera)

  • Dirección de la operación: -> (puede ser ->, <-, )

OPCIONES

  • Mensaje: msg

  • Opciones: flags:A;ack:0; reference:arachnids..(1)

Un poco de teoría:

  • flags:A Establece el contenido de los flags o banderas TCP, en este caso ACK (puede tener varios valores y operadores que veremos más adelante).

  • ack:0 Caso particular para valor ACK=0, es el valor que pone nmap para TCP ping scan.

  • reference:arachnids,28 Referencia un a un Advisory, alerta tipo Bugtrac, etc.

  • classtype:attempted-recon Categoría de la alerta según unos niveles predefinidos y prioridades (veremos más adelante las categorías).

  • sid:628 Identificación única para esta regla snort según unos tramos determinados.

  • rev:1 Identificación de la revisión o versión de la regla.

EJEMPLO 2

En el manual oficial del Snort como primer ejemplo tenemos:

alert tcp any any -> 192.168.1.0/24 111 (content:”|00 01 86 a5|”; msg: “mountd access”;)

Acceso al demonio de administración mountd de UNIX, el cual tiene tiene diversos problemas de desbordamiento de memoria intermedia, que permiten a un atacante remoto obtener privilegios de administrador en los sistemas vulnerables.

Dos consideraciones:

  1. El orden de la sección opciones. Primero las opciones y después el mensaje. El orden, pues, es indiferente.

  2. La opción ‘content’. Es una de las opciones más importantes ya que nos permite la búsqueda de contenidos dentro del campo datos del paquete IP. Se puede añadir ‘nocase’ para que la búsqueda de los datos no sea sensible a las mayúsculas. Estos datos pueden estar en formato hexadecimal, texto plano o binario.

Para resumir, vemos que la cabecera de las reglas sigue el siguiente formato:

 

<direccion de la operación>

Podemos jerarquizar las reglas usando los includes. Estos includes nos permiten crear reglas dentro de otras. El formato sería:

include

Uso de variables en las reglas.

Podemos usar variables (lo hemos visto en el ejemplo anterior). Estas variables se definen en el archivo etc/snort.conf (estudiaremos este archivo de configuración en otros capítulos).

El formato de las variables sería:

var

Por ejemplo:

var MY_NET [102.168.1.0/24]

Con lo cual una regla usando variables quedaría de la siguiente forma:

alert tcp any any -> $MY_NET any (flags: S; msg “SYN Packet”;)

Otras variables que podemos defini puede ser la red externa o EXTERNAL_NET o la ubicación de un servidor Oracle, servidor SQL,etc.

Es decir, usaremos las variables para la mejor configuración de los valores de nuestra red.

Cabecera de las reglas. Acciones.

Hemos vistos que la primera parte de la cabecera es la acción de la regla. La acción de la regla indica a Snort que debe hacer cuando detecte un paquete que coincida con el criterio de la regla. Las accones pueden ser:

  • alert genera una alerta usando el métido de alerta seleccionado y almacena el log.
  • log archiva el log del paquete
  • pass ignora el paquete
  • activate activa la alerta y llama a una regla dinámica
  • dynamic cuando es llamada por una regla activate se pone en funcionamiento

Algunos ejemplos:

pass tcp any any -> $HOME_NET any (msg:”all traffic”;)

pass ip 10.x.x.0/22 any -> any any (content: “Open Port * 80”; msg: \ “Open Port 80.”; )

alert tcp any 110 -> (content: “filename=\”TOMOFONICA.TXT.vbs\””; \ nocase; msg: “Virus tomofonica”;)

Activate y dynamic lo veremos más adelante.

Práctica comentada. Un caso real.

Crear una regla Snort “desde cero” para la detección de ping desde windows 2000.

Para detectar un ping realizado desde fuera de nuestra red, lo primero que debemos saber es qué tipo de datos intervienen en la cabecera del datagrama IP, en la ICMP y los datos.

*La teoría TCP/IP nos dice que:

  1. un echo request es de tipo 8 para obtener un echo reply (tipo 0)

  2. en el campo Protocolo de la cabecera IP debe ir el dato ICMP y poco más recordaremos.

 

Así que la cuestión es cómo averiguar el resto de datos y, sobre todo, qué traza deja un ping enviado desde windows 2000.

*Formato de petición y respuesta de eco. Ping echo / echo request:

Ping echo - echo request

 

Para todo esto contamos con un tipo de herramientas llamadas sniffers. Utilizaremos para nuestra práctica Ethereal (ahora WireShark) por ser de los más intuitivos y fáciles de usar e interpretar. Podemos usar también TCPDump/Windump.

  1. Segundos antes de enviar un ping desde un host emisor pulsamos en Ethereal (o el soft que hayamos elegido para la captura de trazas): Capture > Start.

  2. En nuestro host receptor activamos el capturador de paquetes.

  3. Enviamos el ping al host receptor, dejando unos segundos para que “termine” el ping y pulsamos Stop en el panel de captura del host receptor

  4. Buscamos en la secuencia de captura o traza, la información de envío de ping usando el protocolo ICMP.

 

Pulsando encima de la información nos saldrá algo paracido a esto en Ethereal:

Frame 61 (74 on wire, 74 captured)
Arrival Time: Jun 28, 2002 09:04:11.247973000
Time delta from previous packet: 0.000060000 seconds
Time relative to first packet: 1.864325000 seconds
Frame Number: 61
Packet Length: 74 bytes
Capture Length: 74 bytes
Ethernet II
Destination: 00:04:76:9a:66:a6 (INFOGRAFIA5)
Source: 00:01:02:9f:7b:0d (INFOGRAFIA3)
Type: IP (0x0800)
Internet Protocol, Src Addr: INFOGRAFIA3 (192.168.4.3), Dst Addr: INFOGRAFIA5 (192.168.4.5)
Version: 4
Header length: 20 bytes
Differentiated Services Field: 0x00 (DSCP 0x00: Default; ECN: 0x00)
0000 00.. = Differentiated Services Codepoint: Default (0x00)
…. ..0. = ECN-Capable Transport (ECT): 0
…. …0 = ECN-CE: 0
Total Length: 60
Identification: 0x6aaa
Flags: 0x00
.0.. = Don’t fragment: Not set
..0. = More fragments: Not set
Fragment offset: 0
Time to live: 128
Protocol: ICMP (0x01)
Header checksum: 0x46be (correct)
Source: INFOGRAFIA3 (192.168.4.3)
Destination: INFOGRAFIA5 (192.168.4.5)
Internet Control Message Protocol
Type: 0 (Echo (ping) reply)
Code: 0
Checksum: 0x4e5c (correct)
Identifier: 0x0200
Sequence number: 05:00
Data (32 bytes)

0000 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d 6e 6f 70 abcdefghijklmnop
0010 71 72 73 74 75 76 77 61 62 63 64 65 66 67 68 69 qrstuvwabcdefghi

Las dos últimas líneas son los datos (32 bytes) que nos servirán como firma o huella para nuestra regla snort.

 

Ya sabemos la firma o huella que deja un ping en Windows 2000. Ya sólo nos queda crear una regla donde la opcion content tenga los datos “abcdefghijklmnopqrstuvwabcdefghi”

La regla nos quedaría entonces:

alert ICMP $EXTERNAL any -> $INTERNAL any (msg: “ICMP ping en Windows 2000.”; dsize: 32; itype: 8; content: “abcdefghijklmnopqrstuvwabcdefghi”; depth: 32;)

Donde aparecen nuevos indicadores:

  • dsize: tamaño de datos. comprobación del tamaño del contenido del paquete.

  • itype: tipo de icmp, en este caso para un ping es 8.

  • depth: extensión del tamaño de datos que se ha de inspeccionar.

 

De esta práctica podemos desprender que para la creación de la mayoría de las reglas Snort el procedimiento es estudiar las trazas dejadas por cortafuegos y NIDS que supongan algún tipo de ataque o intrusión al sistema que queremos proteger.

Basándonos en el estudio de estas trazas, hallaremos la firma o huella del ataque que nos servirá en la creación de la regla de detección.

Instalación de las reglas creadas

Las reglas Snort de ubican en ficheros .rules (snort rules). Aquí vemos parte del contenido de uno de estos ficheros:

# (C) Copyright 2001,2002, Martin Roesch, Brian Caswell, et al.
# All rights reserved.
# $Id: virus.rules,v 1.16 2002/08/18 20:28:43 cazz Exp $
#————
# VIRUS RULES
#————
#
# NOTE: These rules are NOT being actively maintained.
#
#
# If you would like to MAINTAIN these rules, e-mail
# snort-sigs@lists.sourceforge.net
#

alert tcp any 110 -> any any (msg:”Virus – SnowWhite Trojan Incoming”; content:”Suddlently”; sid:720; classtype:misc activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible pif Worm”; content: “.pif”; nocase; sid:721; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible NAVIDAD Worm”; content: “NAVIDAD.EXE”; nocase; sid:722; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “myromeo.exe”; nocase; sid:723; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “myjuliet.chm”; nocase; sid:724; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “ble bla”; nocase; sid:725; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “I Love You”; sid:726; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “Sorry… Hey you !”; sid:727; classtype:misc-activity; rev:3;)

alert tcp any 110 -> any any (msg:”Virus – Possible MyRomeo Worm”; content: “my picture from shake-beer”; sid:728; classtype:misc-activity; rev:3;)

 

Crearemos un fichero como este personalizado para almacenar nuestras reglas creadas (lo importante de este fichero de texto plano son las reglas, el resto -con la marca # – es sólo a título informativo).

Estos ficheros .rules se almacenan en el directorio raíz de Snort (por defecto).

Hasta aquí el primer capítulo dedicado a las reglas Snort.

En el siguiente capítulo dedicado a las Reglas de Snort avanzaremos más en la creación y comprensión de las reglas.

Esta entrada fue publicada en Seguridad y redes, Snort y etiquetada , , , , , , , , , , . Guarda el enlace permanente.

16 respuestas a Sistemas de Detección de intrusos y Snort. (II). Creación de Reglas (I).

  1. Abril García Ramírez dijo:

    hola:
    la página esta super bien, solo tengo algunas dudas ya que nosotros montamos el IDS en plataforma linux distribución ubuntu 7.10, para la realizacion de nuestro proyecto para titularnos, y nuestra base de datos al parecer no conecta las alertas, y no sabemos donde esta el error. es bastante raro, ya que se supone ya del mysql deberia jalarlas no?? o algo por alli nos esta fallando,en algun archivo de configuracion ya que las tablas en la base de datos estan vacias a la hora de hacer algunas simulaciones como escaneos de puertos, pings, etc, no las encontramos reportadas en la base de datos, despues creo que mucho menos se vera en la interfaz grafica que le pusimos que es el BASE en codigo abierto no se si pudiesen ayudarnos??
    atte abril

  2. alfon dijo:

    Estimado Abril,
    Revisa el fichero de configuración snort.conf. Seguro que la clave está ahí. si quieres postea aquí mismo la parte concerniente a base de datos.
    saludos,

  3. Vicac dijo:

    Hola. Muchas gracias por tus manuales de snort me han sido de utilidad ahora que estoy comenzando con esta herramienta.
    Tengo una pregunta ¿hay alguna manera de te muestre lo mensajes en la consola en el momento en el se cumple la regla? Es decir, no tener que ir a los logs para ver que es lo que esta sucediendo o sucedio.
    Gracias de antemano
    pd. Lo uso en linux

  4. Juan dijo:

    Quisiera saber como hago para crear una regla que me busque una palabra en Internet..
    Saludos..el blog esta excelente..

  5. alfon dijo:

    Estimado Juan.
    Intenta ser más explícito. Buscar una palabra en Internet, tal como lo preguntas, se hace con Google. Otro cosa es que quieras crear una regla que filtre contenidos a través del http y genrerar una alerta. La regla sería algo parecido a:
    alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg:"Palabra prohibida"; content:"sexo"; nocase; flow:to_client,established;)
    Saludos,

    • Luisa dijo:

      Hola alfon me gustaria saber si me puedes ayudar con esta alerta: Necesito generar una alerta que cuando se utilice algun comando de sql injection este la detecte… yo la hago de esta manera
      alert tcp $EXTERNAL_NET any -> $HTTP_SERVERS $HTTP_PORTS (msg:”Comando de SQL Inyeccion detectado”; flow:to_server,established;uricontent:”UNION”; classtype:web-application-attack;sid:10000002; rev:1;) PERO NO me funciona
      como mas puedo hacerlo??
      Urgente llevo días intentandolo… gracias

  6. Miguel Ángel Martínez López dijo:

    Que tal, me agradó mucho tu página por la información con la que cuenta. Solo tengo una duda respecto al Snort Rule, que pasa, qué quiere decir si en la part de rule Option se suenta con la línea Flags: SF;msg “SYN-FIN” scan. gracias

  7. Alfon dijo:

    No sé si entendí bien tu duda. Si tienes una regla con los flags SF, esta regla (alert) se ativará cuando un paquete tenga activos esos flags.. SYN-FIN. Sería un posible SF scan. No tiene porqué serlo.

  8. cuervo dijo:

    me marca este error alguien me podria ayudar
    “ERROR: c:\snort\etc\snort.conf(273) Config option “detection” can only be configured once.” o diganme donde puedo conseguir un manual o algo afin de orientarme enque estoy mal en la configuracion

  9. Miguel Ángel Martínez López dijo:

    Qué tal, de nuevo visitándolos por este medio, viendo que ustedes son los especialistas en redes, me han surgido ciertas dudas que agradeceré mucho me ayuden a resolver:
    1. Por qué se tiene establecido que deben ser hasta 255 hops o saltos los que puede hacer un paquete en su viaje.
    2. En función de qué factor se determina el retardo del viaje de los paquetes en una red.
    3. Cómo se mide el porcentaje de eficiencia de un IDS. Gracias

  10. Alfredo Victoria Antezana dijo:

    Hola, muy buena tu pagina y explicas bien, queria pedirte un favor, si puedes hablar sobre como configurar el archivo snort.conf no le entiendo, baje reglas del inter y no se como habilitarlas en snort

  11. Alfon dijo:

    Gracis Alfredo. Veré la forma de explicarlo en una nueva entrada.

  12. koke dijo:

    como puedo hacer una regla que me avise cuando un pc ingreso a facebook??sirve esta que cree
    ALERT TCP $EXTERNAL_NET any $HTTP_PORTS ->$HOME_NET any(msg:”web prohibida”;content:”http://www.facebook.com”;nocase;flow: to_client,established;)
    sirve esa??

  13. Nilton dijo:

    Alguien podria poner mas reglas con su explicacion , se le estaria muy agradecido

  14. Jorge dijo:

    Buenas noches, tu documento esta muy interesante y muy explicito solo, yo necesito saber como generar una regla en donde me detecte los archivos gif, png y tiff, asi como en que navegador los estuvieron viendo, alguien me puede ayudar con esto. Saludos,

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s