Snort. Búsqueda de patrones. Reglas de contenido.
Aunque estamos viendo, en los diferentes artículos al respecto, las opciones para crear reglas Snort, y, en general, todo lo respecto a Snort com IDS (Sistema Detección de Intrusos), vamos a realizar una parada, para estudiarlo con más detenimiento, en content, opción de la regla que busca contenidos en la carga útil de un paquete o payload y las opciones de content como pueden ser:
- Depth
- Offset
- Nocase
- Distance
- Within

Ya hemos visto que con la opción content de una regla Snort, podemos buscar un contenido determinado en el payload o carga útil de un paquete, de forma que genere una alerta cuando exista una coincidencia en el patrón. El contenido a buscar puede ser texto, binario o una mezcla de ambos. Sin embargo, para lograr una mayor coincidencia en los patrones y mejor rendimiento existen una serie de modificadores que añaden mayor potencia, flexibilidad y exactitud a la búsqueda de patrones y contenidos.
Puede ser que la coincidencia del patrón a buscar necesite mucha exactitud para darse como valido o que tengamos varios patrones distintos a buscar dentro del payload de un mismo paquete, e incluso que entre ambos patrones haya una determinada distancia en bytes.
Consideraciones previas
Antes que nada una serie de consideraciones sobre la notación de la sintaxis a emplear.
- Podemos usar | para delimitar el contenido en binario:
alert tcp any any -> any any (content: "|73 74 65 6d 61 73| ;)
- El caracter ! niega el patrón:
alert tcp any any -> any any (content: ! "USER" ;)
Buscando el contenido en el payload.
Uno de los casos más simples que se nos pueden dar es el siguiente. Tenemos una captura:

Queremos qe Snort genere una alerta cada vez que aparezca el comando SMTP: EHLO alfon
Lo más rápido, pasando por alto puertos y hosts (por eso ponemos any) sería:
alert tcp any any -> any any (content: "EHLO alfon";)
También lo podríamos ponner en binario:
alert tcp any any -> any any (content:"|45 48 4c 4f 20 6c 63 61 6d 70|";)
Puede ser que el comando pueda ser ehlo alfon en minúscula o máyúscula. Para ello usamos nocase:
alert tcp any any -> any any (content: "EHLO alfon"; nocase ;)
Por cierto, vamos a incluir un manseje para la alerta:
alert tcp any any -> any any (msg: "conexión SMTP"; content: "EHLO alfon"; nocase ;)
Depth y Offset
Para que la búsqueda del patrón sea más eficiente vamos a acotar este de forma que mejoremos el rendimiento. Usaremos Depth.
Depth establece un número determinado de bytes a buscar en el payload del paquete. Se cuenta desde el principio de la zona destinada a los contenidos del paquete. Vamos a verlo de forma más detallada:

Esta captura corresponde a un comando SMB. En este caso: SMB Read AndX Request (0x2e) Apertura de un archivo.
Para comenzar a buscar en el contenido del paquete, una vez terminada la zona destinada a cabecera y segmento TCP , nos situamos en la zona de datos (señalada con una flecha).
Deseamos buscar el "Server Component: SMB" (dentro del cuadro rojo).
Los datos a buscar ocupan 4 bytes y comienza en el byte 4 desde el principio del a zona de datos. (comenzamos desde 0).
Vamos a usar entonces los conceptos Depth, ya explicado y Offset. Con offset indicamos en número de bytes a partir del cual analizamos la busqueda del patrón. Seguimos con el ejemplo y creamos la regla:
alert tcp any any -> any any (msg: "apertura de archivo detectado"; content: "|ff 53 4d 42|"; offset = 4 ; depth = 4)
Es decir; buscamos el patron .SMB o en binario ff 53 4d 42 comenzando en el byte 4 y analizamos 4 bytes a partir de este último.
Distance y Within.
Bien, vamos ahora a complicar un poco la búsqueda. Necesitamos buscar dos patrones diferentes en el mismo paquete. Para que el rendimiento sea mayor y el motor de snort realice su trabajo con mayor precisión y usando menos recursos, vamos a aplicar una regla en la que determinemos el patrón de forma exacta.
Tenemos la siguiwente captura:

Vamos a bucar la Palabra Microsoft Word y a una distancia determinada MSWordDoc. Por si acaso vamos a olvidarnos de mayúsculas y mínusculas (nocase) y acotaremos perfectamente lo patrones.
alert tcp any any -> any any (msg: "Apertura de archivo Microsft Word"; content: "Microsoft Word"; offset = 116 ; depth = 14; content: "MSWordDoc"; nocase ; distance = 14 ; within = 9 ;)
Esto es lo mismo que decir. Genera una alerta con el mensaje Apertura de archivo Microsft Word cuando encuentres la palabra Microsoft Word a una distancia (offset ) de 116 bytes y busca dentro de los 14 primero bytes (depth). Busca también la palabra MSWordDoc a una distancia (distance) del último patron o palabra encontrada de 14 bytes dentro de los 9 primeros bytes (within).
Tags: snort rules reglas content payload offset depth
Meneame |
del.icio.us




