monster    Nautopia    forum

 

ANILLO     CONTACTAR    CULTURALIA     DOWNLOADS    KIOSKO    FORO         HOME

 

Translate 

 
 

contacto de Alfon

 

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

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

 

 

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:

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

 

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-

 

 

 

 
 

NAUTOPIA © 2002. Reservados todos los derechos.