|

TALLER de Sistemas de detección de intrusiones.
SNORT
CAPITULO III: CREACION DE REGLAS CON SNORT.
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
Dentro del lenguaje Snort
de rules (reglas) veremos el uso
intensivo de nociones de TCP/IP, en concreto de TCP, flag, números de secuencia, etc, etc, por lo cual es
imprescindible su repaso para una mejor comprensión.
Recomendado el uso tambíén de software de captura de paquetes tipo
Ethereal o TCPdump/Windump para ver en un escenario real la función de
las
nociones aprendidas sobre TCP como:
Reglas
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
|
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
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:
-
El orden de la sección opciones. Primero las opciones y después el
mensaje. El orden, pues, es indiferente.
-
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.
Prácticas
A. Descifrar la siguiente regla:
alert tcp any 110 -> any any (msg:"Virus - Posible Virus-Worm Timofonica";
alert tcp any 110 -> content: "filename=\"TIMOFONICA.TXT.vbs\""; nocase;
alert tcp any 110 -> reference:MCAFEE,98674; sid:799; classtype:misc-activity;
rev:3;)
B. Crear una regla para detectar download de ficheros *.MP3.
Una posible solución:
alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg: "Cuidado, están descargando MP3";flags: AP;
content: ".mp3";)
|
Teoría para esta práctica
En TCP cuando una aplicación desea asegurarse de que todos los datos que han pasado al nivel inferior se
han transmitido, es decir, necesita estar segura de que todos los datos pasados a TCP han llegado al destino, se
utiliza la función PUSH (enviar inmediatamente o empujar los datos).
Si se ejecuta una aplicación de cliente en un
equipo con una implementación de TCP/IP que no establece el bit PUSH en las operaciones de envío, se pueden producir
retrasos en la respuesta. Por tanto, las aplicaciones dedicadas a la transmisión de datos es norma común
el establecer este
bit. Esto lo podemos verificar claramente observando cualquier traza de TCPDump/Windump o Ethereal si capturamos alguna trasmisión de información entre host de nuestra red.
Por otra parte,
en cualquier transmisión de datos siempre se envían mensajes de acuse de recibo
(ACK - Acknowledgement) conforme se van va recibiendo las tramas (Asentimiento de datos).
Resumiendo. En cualquier transmisión de datos, una vez establecida la
conexión TCP tenemos:
-
Un indicador P es el flag P (push) presente en la cabecera del paquete TCP, indicando que se trata
de un paquete normal conteniendo datos.
-
Un ack=x indica que se está confirmando la recepción correcta de datos hasta un
determinado número de secuencia.
|
Reglas Snort para casos varios
|
1.- W32.Sircam.Worm@mm
2001-07-20 -- W32.Sircam.Worm@mm
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "Te mando este archivo para que me
des tu punto de vista"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "Espero me puedas ayudar con el
archivo que te mando"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "Espero te guste este archivo que
te mando"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "Este es el archivo con la
informaci=n que me pediste"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "I send you this file in order to
have your advice"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "I hope you can help me with this
file that I send"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "I hope you like the file that I
sendo you"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible W32.Sircam.Worm@mm"; content: "This is the file with the
information that you ask for"; nocase; rev:2;)
alert tcp any any -> any 25 (msg:"Virus - Posible VBS.VBSWG2.X@mm Worm"; content: "name=\"Homepage.HTML.vbs\"";
nocase; rev:1;)
2.- Reglas para escaneos nmap varios
zardoz~/src/snortrules>grep -i nmap *
icmp.rules:alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP Nmap2.36BETA or HPING2 Echo ";itype:8;dsize:0;
reference:arachnids,162;)
icmp.rules:alert icmp $EXTERNAL_NET any -> $HOME_NET any (msg:"ICMP PING NMAP"; dsize: 0; itype: 8;
reference:arachnids,162;)
scan.rules:alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"SCAN nmap fingerprint attempt";flags:SFPU;
reference:arachnids,05;)
scan.rules:alert tcp $EXTERNAL_NET any -> $HOME_NET any (msg:"SCAN nmap TCP";flags:A;ack:0;
reference:arachnids,28;)
zardoz~/src/snortrules>
|
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:
-
un echo
request es de tipo 8 para obtener un echo reply (tipo 0)
-
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:

Para todo esto contamos con un tipo de herramientas llamadas
sniffers. Utilizaremos para nuestra práctica
Ethereal por ser de los más intuitivos y
fáciles de usar e interpretar. Podemos usar también TCPDump/Windump.
-
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.
-
En nuestro host receptor activamos el capturador de
paquetes.
-
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
-
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).
Instalación de las reglas desde IDSCenter
Panel de IDSCenter > IDS rules > Rules/Signatures

Con el navegador del panel buscamos nuestro archivo con las reglas o regla creada
(.rules), la añadimos al set con
"Add" y aplicamos con "Apply".
Esta operación la realizaremos, como ya comentamos en el capítulo II, con Snort parado Stop Snort,
una vez hecho todo el proceso lo volveremos a iniciar con los cambios aplicados.
-Taller IDS-
|