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

logo snort

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:

captura snort content

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:

content-2.png

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:

Snort. Content offset búsqueda patrones en pyload

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


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

3 respuestas a Snort. Búsqueda de patrones. Reglas de contenido.

  1. usuario dijo:

    Hola, tengo una duda, me gustaría saber que significa cuando el modificador del content «offset» tiene un valor negativo, cómo se hace en estos casos para realizar la búsqueda del contenido..

    Muchas Gracias.

  2. Alfon dijo:

    Hola usuario,
    Aunque «offset» como modificador de «content» puede tomar, según el manual, valores de -65535 a 65535, yo no he visto ninguna regla con un valor negativo de offset (offset:-x).

    Dime para que regla lo necesitas o una regla que contenga este valor en negativo.

    Saludos,

  3. omar dijo:

    holame gustaria encontrar una palabra en espeifico como «pendejo» dentro de un correo electronico o un mensaje del whatsapp o del skype como seria la regla??

Deja un comentario