martes, 1 de diciembre de 2015

¿Quién dijo que Yara es sólo para binarios?

Hace unos días detectamos en la red de sensores de Hispasec varios correos fraudulentos que afectaban a una entidad bancaria colombiana llamada Davivienda. Empezamos a estudiar cómo poder hacer una clasificación de los mismos y además de utilizar las ya conocidas expresiones regulares, surgió la idea de hacerlo con Yara. Aunque Yara inicialmente estaba enfocado a utilizarse contra archivos binarios, en nuestro laboratorio intentamos hacer una prueba de concepto (PoC) para observar su rendimiento sobre archivos de texto.

Todos los emails y reglas Yara usados en esta entrada han sido alojados en el repositorio YaraRules en GitHub para que el lector pueda, en cualquier momento, comprobar y/o utilizarlos para sus propios fines bajo licencia GNU-GPLv2.

Uno de los emails recibidos y el cuál vamos a utilizar para hacer la PoC (alojado aquí) se trata, como ya hemos dicho, del banco colombiano “Davivienda”. En primer lugar nos interesa conocer si este email contienen el nombre del banco, para ello creamos una regla que simplemente busca la cadena del banco:
rule davivienda {
   strings:
      $nombre = "davivienda" nocase
   condition:
      all of them
}
Esta nos dirá si en el email se encuentra el nombre del banco. Si bien esta condición puede no ser única, para otros bancos necesitaremos más de una palabra o condiciones más complejas.
Y con una simple llamada a Yara podemos ver si el email pertenece a dicha entidad:

$ yara bank_rule.yar davivienda.eml
davivienda davivienda.eml

En el contenido del correo (guardado en el archivo davivienda.eml) se encuentra la palabra davivienda, definida en la primera regla.

A continuación vamos a intentar extraer algunas características interesantes de los correos electrónicos. En primer lugar vamos a ver si contiene archivos adjuntos. Dentro del formato de correo electrónico (eml) los archivos adjuntos se encuentran tras el cuerpo del mensaje y justo después de la cabecera "X-Attachment-Id", la cuál nos indica el identificador del archivo adjunto. La siguiente regla nos dice si un email contiene archivos adjuntos buscando dicha cabecera:
rule with_attachment {
   strings:
      $attachment_id = "X-Attachment-Id"
   condition:
      $attachment_id
}
Y procedemos a ejecutarla con Yara sobre nuestro archivo de email.

$ yara attachment.yar davivienda.eml

Lo cual no nos da ningún resultado y es correcto, pues este email no tiene archivos adjuntos. Para comprobar si funciona vamos a volver a pasarlo sobre otro correo que sabemos que contiene un archivo adjunto:

$ yara attachment.yar con_adjunto.eml
attachment con_adjunto.eml

Para casos en los que el email no tenga archivo adjunto también se puede buscar la condición contraria y juntar ambas en un ruleset, que quedaría tal que así (se puede descargar completo aquí):

rule with_attachment {
   strings:
      $attachment_id = "X-Attachment-Id"
   condition:
      $attachment_id
}


rule without_attachment {
   strings:
      $attachment_id = "X-Attachment-Id"
   condition:
      not $attachment_id
}

Al ejecutarla sobre el scam del banco nos daría este resultado:

$ yara attachment.yar davivienda.eml
without_attachment davivienda.eml

Con esta simple regla sobre un email de scam podemos ver si tiene archivos adjuntos (y que posiblemente pueda ser algún tipo de malware).

Otra de las cosas que se pueden buscar sobre un email es que aparezcan URLs. Para ello Yara nos provee de expresiones regulares y la regla para detectar URLs quedaría así:
rule with_urls {
    strings:
        $url_regex = /https?:\/\/([\w\.-]+)([\/\w \.-]*)/
    condition:
        all of them
}
Y para buscar si NO tiene URLs de una manera muy similar, simplemente negando la condición (ver completa aquí):
rule without_urls {
   strings:
      $url_regex = /https?:\/\/([\w\.-]+)([\/\w \.-]*)/
   condition:
      not $url_regex
}

Incluímos ambas reglas dentro de un mismo ruleset para que sea más cómodo y lo ejecutamos con Yara sobre nuestro correo:

$ yara urls.yar davivienda.eml
with_urls davivienda.eml

Lo que nos confirma que contiene URLs.

Las imágenes también son un recurso muy interesante a buscar en un correo electrónico y podemos hacerlo con esta regla algo más completa:

rule with_images {
   strings:
      $a = ".jpg" nocase
      $b = ".png" nocase
      $c = ".bmp" nocase
   condition:
      any of them
}
En este caso lo que se buscan son las extensiones de archivos de imagen. El modificador nocase es para que busque en case-insensitive, es decir, sin tener en cuenta mayúsculas o minúsculas.

También añadimos la regla contraria, para detectar si no carga imágenes (ver completa aquí):
rule without_images {
   strings:
      $a = ".jpg" nocase
      $b = ".png" nocase
      $c = ".bmp" nocase
 condition:
  not $a and not $b and not $c
}
Y procedemos a pasarla sobre nuestro archivo:

$ yara image.yar davivienda.eml
with_images davivienda.eml

Por lo que también carga imágenes externas.

Finalmente y para poder hacer todo este proceso más automatizado, se puede crear un ruleset (que nosotros hemos nombrado como email_ruleset.yar) que englobe todas las reglas que hemos definido anteriormente (ver completo aquí):
include "bank_rule.yar"
include "attachment.yar"
include "urls.yar"
include "image.yar"
Con esto terminado, lo volvemos a ejecutar sobre nuestro archivo de email y nos dará toda la información que estamos buscando:

$ yara email_ruleset.yar davivienda.eml
davivienda davivienda.eml
without_attachments davivienda.eml
with_urls davivienda.eml
with_images davivienda.eml

Recordar al lector que esto es sólo un ejemplo del potencial y flexibilidad de las reglas Yara sobre todo tipo de archivos. Todas las reglas y archivo de email pueden ser consultados en este repositorio de GitHub: https://github.com/Yara-Rules/rules/tree/master/email

Más información:

Página oficial de Yara

Blog de YaraRules

Repositorio GitHub de YaraRules


Antonio Sánchez


No hay comentarios:

Publicar un comentario en la entrada