Una de las características mas importantes para el correcto funcionamiento de Snort, es sin lugar a dudas, las reglas de detección y alarmas, Snort cuenta con un pequeño lenguaje de definición de reglas que sigue una sintaxis definida para diseñar reglas robustas y útiles para un pentester y/o analista en seguridad informática. Las reglas en Snort se separan en dos secciones, en primera instancia esta el encabezado de la regla y luego se definen las opciones de la regla, el encabezado de la regla contiene información relacionada a la acción que se debe tomar (por ejemplo la acción de generar una alerta) al igual que direcciones IP, puertos y mascaras de red del origen y destino del paquete, por otro lado la sección de opciones de la regla determinan diversos filtros que le dan dinamismo a la regla, de esta forma solamente se aplicará cuando dichas opciones o filtros se cumplan, por lo tanto es de vital importancia diseñar correctamente esta sección de la regla para evitar falsos positivos.

NOTA: En Snort, todas las reglas deben ser escritas en una sola linea, ya que el procesador de reglas no entiende los saltos de linea, un ejemplo básico de definición de reglas podría ser el siguiente:

alert tcp any any -> $HOME_NET any (content:»|00 01 86 a5|»; msg: «Accesso mountd «;) alert icmp any any -> $HOME_NET any (msg:»ICMP Ping»; sid:10000001;)

NOTA: Una característica interesante en la definición de reglas de Snort es que se pueden utilizar directamente variables que se encuentren definidas en el fichero de configuración utilizado para iniciar el proceso de Snort.

A continuación se enseñan los distintos campos que aplican en cada una de las zonas de una regla Snort:

ENCABEZADO DE REGLAS SNORT

Acciones: Permite ejecutar un evento relacionado con la información del paquete capturado, se trata del primer atributo visible de la regla y puede tener uno de los 3 siguientes valores:

alert Generá una alerta usando el método de alerta seleccionado y posteriormente genera un Log del paquete
log Generá un log del paquete.
pass Ignora (borra) el paquete

Protocolos: Después de determinar que acción se debe tomar, se define el protocolo al que aplica la regla, en Snort se pueden definir los siguientes protocolos de comunicación: TCP, UDP, ICMP

Direcciones IP y puertos: Indica la dirección o rango de direcciones de origen y destino relacionadas con los paquetes capturados por Snort, se puede indicar un rango de direcciones como por ejemplo /24 para redes clase “C” /16 para redes clase “B” , ahora bien, las direcciones se establecen después de definir la acción y el protocolo al que aplican, el primer conjunto de dirección(es) y puerto(s) declarados en la regla corresponden a aquellos que figuran en la dirección origen del paquete, mientras que las dirección(es) y puertos(s) declarados después del símbolo de dirección de la regla (se verá unos párrafos mas abajo su significado) corresponden a aquellos que figuran en la dirección destino del paquete. En este orden de ideas se pueden tener encabezados de la regla como los que se indican a continuación:

1. Log sobre todo el trafico UDP sobre cualquier dirección IP y cualquier puerto establecidos en el campo de origen del paquete y ademas sobre las direcciones IP de destino entre los rangos de 192.168.1.1 y 192.168.1.255 cuyo puerto se encuentre entre 1 y 1024

log udp any any -> 192.168.1.0/24 1:1024

2. Log sobre todo el trafico TCP sobre cualquier dirección IP y cualquier puerto establecidos en el campo de origen del paquete y ademas sobre las direcciones IP de destino entre los rangos de 192.168.1.1 y 192.168.1.255 cuyo puerto sea menor o igual a 6000

log tcp any any -> 192.168.1.0/24 :6000

3. Alerta sobre todo el trafico TCP sobre cualquier dirección IP y cualquier puerto establecidos en el campo de origen del paquete y ademas sobre las direcciones IP de destino entre los rangos de 192.168.1.1 y 192.168.1.255 cuyo puerto sea mayor o igual a 1024

alert tcp any any -> 192.168.1.0/24 1024:

4. Alerta sobre todo el trafico TCP sobre cualquier dirección IP y puertos menores o iguales al 1024 establecidos en el campo de origen del paquete y ademas sobre las direcciones IP de destino entre los rangos de 192.168.1.1 y 192.168.1.255 cuyo puerto sea mayor o igual a 500

log tcp any :1024 -> 192.168.1.0/24 500:

5. Alerta sobre todo el trafico TCP sobre cualquier dirección IP origen que no se encuentre en el rango de 192.168.1.1 y 192.168.1.255 y en cualquier puerto, ademas sobre las direcciones IP de destino entre los rangos de 192.168.1.1 y 192.168.1.255 cuyo puerto sea 111

alert tcp !192.168.1.0/24 any -> 192.168.1.0/24 111

Operador de Dirección: En las reglas anteriores ha existido un común denominador sin contar con la estructura de las reglas, se trata del símbolo “->” este símbolo indica la dirección del trafico que aplicará la regla, como se ha indicado anteriormente, el conjunto de direcciones IP y puertos ubicados a la izquierda de este operador corresponden a los campos de origen del paquete, mientras que el conjunto de direcciones IP y puertos ubicados a la derecha de este operador corresponden a los campos de destino del paquete. Sin embargo existe un operador mas que indica que el trafico puede ser bidireccional, lo que quiere decir que Snort no distinguirá entre los campos de la izquierda y la derecha para definir el origen y el destino de los paquetes utilizados, sino que utilizará ambos

OPCIONES DE LAS REGLAS DE SNORT

Finalmente para terminar de confeccionar una regla en Snort, es necesario definir ciertas opciones que permitirán definir determinadas características en el comportamiento de Snort cuando un paquete determinado encaja con el encabezado de la regla visto anteriormente. A continuación se listan las opciones aceptadas en las reglas de Snort:

NOTA: todas las opciones se separan con “;”

  1. msg:
    Indica a las acciones de alerta y logging el mensaje que se debe imprimir junto con el volcado del paquete, se trata simplemente de una cadena con la descripción que se desea imprimir.

    alert tcp any :1024 -> 192.168.1.0/24 500: (msg: “mensaje de alerta”; sid:10000001;)
  2. reference:
    Indica una referencia externa a sistemas de identificación de ataques, los sistemas sistemas externos soportados por Snort a la fecha de escribir este documento son:

    bugtraq http://www.securityfocus.com/bid/
    cve http://cve.mitre.org/cgi-bin/cvename.cgi?name=
    nessus http://cgi.nessus.org/plugins/dump.php3?id=
    arachnids http://www.whitehats.com/info/IDS
    mcafee http://vil.nai.com/vil/content/v _
    osvdb http://osvdb.org/show/osvdb/
    url Url arbitraria

    Las referencias anteriormente descritas se encuentran ubicadas en el directorio de instalación de Snort en el fichero “reference.config”. Para utilizar esta opción, se debe indicar de uno a muchos identificadores de sistema e identificadores de referencia

alert tcp any any -> any 7070 (msg:»IDS411/dos-realaudio»; \flags:AP; content:»|fff4 fffd 06|»; reference:arachnids,IDS411;)

alert tcp any any -> any 21 (msg:»IDS287/ftp-wuftp260-venglin-linux»; \flags:AP; content:»|31c031db 31c9b046 cd80 31c031db|»; \

reference:arachnids,IDS287; reference:bugtraq,1387; \

reference:cve,CAN-2000-1574;)

Por otro es importante anotar que el fichero “reference.config” no es cargado automáticamente por Snort, de hecho es necesario que se encuentre definido en el fichero de configuración de Snort, en concreto debería tener la linea “include reference.config

  1. gid:
    Indica el Generator Id que identifica que componente de Snort ha generado el evento asociado a la regla, los identificadores de preprocessors y gids asociados se encuentran ubicados en el fichero gen-msg.map
  2. rev:Indica la revisión de la regla de forma única, normalmente se utiliza con el atributo sid..
    alert tcp any any -> any 80 (content:»XXXX»; sid:1000001; rev:1;)
  3. sid:
    Este atributo es útil para identificar de forma única las reglas de Snort, esta información permite a los plugins de salida identificar reglas de forma fácil, por otro lado esta opción debería ser utilizada junto con opción rev. Los siguientes son los rangos manejados por Snort los posibles SID.
    – Menores de 100: Reservados para uso futuro.-Entre 100 y 999.999: Incluidos en la distribución de Snort.- Mayor o igual a 1.000.000: Usados para reglas locales.
  4. classtype:Permite categorizar la regla en cuestión para clasificar el ataque bajo un tipo mas general, por defecto Snort cuenta con algunas de estas categorías, todas se encuentran definidas en el fichero “classification.config” localizado en el directorio raíz de instalación de Snort. Este mecanismo de clasificación, permite mejorar la organización de los eventos que Snort produce durante su ejecución. Por otro lado, es posible declarar reglas personalizadas registrandolas en el fichero “classification.config” siguiendo la sintaxis deconfig classification: <clasificación> , <descripción de la clasificación> , <prioridad>Clasificación y descripción son solamente cadenas de texto y prioridad es un valor entero entre 1(alto) y 4(muy bajo).
    Clasificación personalizada
    config classification: kickass-porn,Kicking the XXX Content,3

    Regla Clasificada
    alert tcp $EXTERNAL_NET $HTTP_PORTS -> $HOME_NET any (msg: «INAPPROPRIATE»; flow: to_client,established; content:»porn»; nocase; threshold: type threshold, track by_dst,count 5, seconds 360; classtype: kickass-porn; sid: 2001352; rev:5; )

    Por otro es importante anotar que el fichero “classification.config” no es cargado automáticamente por Snort, de hecho es necesario que se encuentre definido en el fichero de configuración de Snort, en concreto debería tener la linea “include classification.config

  5. priority:Este atributo es utilizado para sobrescribir el valor de la prioridad definida en el atributo classtype de la regla, se trata de un valor entero entre 1 y 4 que hace que la prioridad declarada en el classtype sea sobrescrito.
  6. metadata:
    Permite que la regla disponga de información adicional que es útil para el procesador de reglas de Snort, los valores declarados tienen significados para Snort y hacen que el comportamiento de la regla cambie en función a los valores definidos a continuación
Clave Descripción Valor de Formato
engine “shared” Indica una regla de librería compartida
soid gid|sid Regla de librería compartida para generadores y sid
service “http” Identificador de servicio basado en objetivo

Ejemplo:

alert tcp any any -> any 80 (msg:»Ejemplo de Regla de librería compartida»; \metadata:engine shared; metadata:soid 3|12345;)alert tcp any any -> any 80 (msg:»Ejemplo de regla de Servicio HTTP»; \metadata:service http;)

Aquí se han indicado los conceptos básicos de creación de reglas de Snort, en próximas entradas se detallarán las opciones de detección de Payloads.