Yara para usos forenses

3 minute read Publicado:

Reglas yara para detectar Magic Headers

Yara se utiliza principalmente en el entorno del análisis de malware, pero no está enfocado a esa área únicamente ni mucho menos. Es por eso que no hace mucho se me ocurrió darle a Yara un uso forense. La idea es hacer un detector de ficheros según el magic de éstos. Si lo pensamos un momento no es nada descabellado, pues al fin y al cabo, Yara permite buscar patrones tanto en formato texto como binario y esto se ajusta a lo que estaba buscando.

El lenguaje que define las reglas es realmente sencillo y a la vez expresivo. Para crear reglas se definen unas variables y se combinan entre ellas para formar una expresión lógica, en este caso variables en formato binario. Si se cumple la condición entonces hay una coincidencia, o un positivo como se suele decir.

Regla yara básica

rule test {
    meta:
        author = "Jaume Martin"
    strings:
        $a = "Esto es una prueba"
        $b = { 00 01 10 11 }
    condition:
        $a and $b
}

La regla Yara anterior buscará en ficheros el string Esto es una prueba y la cadena binaria 00011011. Como decía el lenguaje es sencillo pero expresivo, así que si en vez de utilizar cadena de prueba utilizamos los magic de los formatos se pueden buscar ficheros.

Para escribir un conjunto de reglas Yara que busquen los magic pero primero hay que conocer esos magic. Se puede optar por extraerlos de los ficheros de la siguiente manera:

$> xxd prueba.doc | head
0000000: d0cf 11e0 a1b1 1ae1 0000 0000 0000 0000  ................
0000010: 0000 0000 0000 0000 3e00 0300 feff 0900  ........>.......
0000020: 0600 0000 0000 0000 0000 0000 0400 0000  ................
0000030: 8c01 0000 0000 0000 0010 0000 8e01 0000  ................
0000040: 0100 0000 feff ffff 0000 0000 8801 0000  ................
0000050: 8901 0000 8a01 0000 8b01 0000 ffff ffff  ................
0000060: ffff ffff ffff ffff ffff ffff ffff ffff  ................
0000070: ffff ffff ffff ffff ffff ffff ffff ffff  ................
0000080: ffff ffff ffff ffff ffff ffff ffff ffff  ................
0000090: ffff ffff ffff ffff ffff ffff ffff ffff  ................

O por el contrario, se pueden consultar listas públicas. Por ejemplo, en la wikipedia hay una lista y aquí otra lista algo más extensa.

Con el magic elegido se puede escribir una regla Yara para encontrar ficheros los ficheros buscados, por ejemplo para ficheros doc.

rule doc_magic: DOC
{
    meta:
        author = "Jaume Martin"

    strings:
        $a = {D0 CF 11 E0 A1 B1 1A E1}

    condition:
       $a at 0
}

Esta regla en concreto servirá para encontrar ficheros doc sueltos. Fijaos en la condición $a at 0, el magic debe aparecer al inicio del fichero o lo que es lo mismo, al offset 0x0.

Pero se puede modificar la regla anterior para que pueda encontrar ficheros doc en un dump de disco o ram. En este caso hay que fijarse que la condición no está fijada a la posición inicial, pues el doc puede estar en cualquier parte del volcado.

rule contains_doc: DOC
{
    meta:
        author = "Jaume Martin"

    strings:
        $a = {D0 CF 11 E0 A1 B1 1A E1}

    condition:
       $a
}

En definitiva, he creado un repositorio en github llamado yara-forensics donde voy a ir recopilando este tipo de reglas que nos permita encontrar fichero específicos entre volúmenes grandes de datos. Para quien quiera colaborar el repositorio está abierto a colaboración, así que ya sabéis.