· Asparux · malware · 8 min read

Malware Analysis 1 - Todo Sobre Yara rules

Introducción

¡Hola amigos!

En esta publicación aprenderemos cómo los cazadores de amenazas usan las reglas YARA para detectar posibles riesgos de seguridad, cómo escribirlos y mucho más sobre eso.

Explicación

YARA significa otro acrónimo ridículo y lo utilizan todos los cazadores de amenazas, ya que puede ahorrar mucho tiempo al realizar operaciones personalizadas para decidir si un archivo es malicioso o no. Todos los antivirus también usan esto.

Aquí hay algunos puntos clave sobre las reglas de YARA:

1 - Estructura

Las reglas constan de dos partes principales, un cuerpo y un encabezado. El encabezado contiene metadatos y el cuerpo contiene el patrón a buscar.

2 - La coincidencia de patrones

YARA utiliza expresiones regulares y otras reglas de coincidencia para buscar posibles instrucciones de malware basadas en archivos y memoria.

3 - Condicionales

Las reglas también pueden incluir declaraciones condicionales que permitan una lógica de coincidencia más compleja. Por ejemplo, es posible que una regla solo coincida si se encuentra un determinado patrón dentro de un determinado rango de direcciones de memoria.

4 - Variables

También pueden utilizar variables para hacerlos más flexibles. Por ejemplo, se podría usar una variable para especificar una ruta de archivo o para almacenar un valor particular que se usa en la lógica de coincidencia.

5 - Priorización de reglas

Las reglas de YARA se pueden priorizar, de modo que si varias reglas coinciden con un archivo o segmento de memoria en particular, se utilizará la regla con mayor prioridad.

Cómo escribir reglas YARA

Aprenderemos cómo funciona YARA y cómo realizar la mayoría de las operaciones básicas con ejemplos.

Strings

Hay 3 tipos:

  • Cadenas hexadecimales (es decir, {E2 34 D2 C8})
  • Cadena de texto (es decir, “ejemplo”)
  • Expresiones regulares (es decir, [4-6])

Condiciones y ejemplos

Permite operadores booleanos (es decir, o), relacionales (es decir, >=), aritméticos (es decir, +) y bit a bit (es decir, &).

  • Contando Strings

Si tenemos la variable $a podemos usarla #a para obtener cuantas veces aparece esa cadena.

  • Tamaño del archivo

Para obtener el tamaño del archivo también podemos usar la filesize variable interna (tenga en cuenta que $ falta) que contiene el valor en bytes

  • Conjunto de Strings

Si queremos comprobar si, por ejemplo, 2 de 3 condiciones eran verdaderas, podemos hacerlo así:

rule Test
{
    strings:
        $a = "ejemplo1"
        $b = "ejemplo2"
        $c = "ejemplo3"

    condition:
        2 of ($a,$b,$c) // 2 de 3 condiciones son "true"
}

En este caso, también podemos usar 2 de ($*) o 2 of theme en lugar de 2 of ($a,$b,$c)

Puede acercarse a los operadores internos de esta manera:

all of them       // todas las cadenas en la regla
any of them       // cualquier cadena en la regla
all of ($a*)      // todas las cadenas cuyo identificador comienza con $a
any of ($a,$b,$c) // todas de $a, $b or $c
1 of ($*)         // lo mismo que "cualquiera de ellos"
none of ($b*)     // cero del conjunto de cadenas que comienzan con "$b"
  • Direcciones virtuales

Podemos obtener el desplazamiento de una cadena en un archivo usando el @ carácter, por ejemplo, si tenemos $a = “example” su desplazamiento será @a

Si queremos iterar sobre las compensaciones podemos hacerlo así:

rule Occurrences
{
    strings:
        $a = "ejemplo1"
        $b = "ejemplo2"

    condition:
        for all i in (1..3) : ( @a[i] + 10 == @b[i] )
}
  • Otras reglas

También puedes crear una condición que incluya otra regla.

rule Rule1
{
    strings:
        $a = "ejemplo1"

    condition:
        $a
}

rule Rule2
{
    strings:
        $a = "ejemplo2"

    condition:
        $a and Rule1 // Utiliza otra rule en la condición
}

Metadatos

También podemos incluir información en nuestras reglas que no se interpreta pero que es realmente útil entre otros cazadores de amenazas, ya que la comunidad comparte sus propias reglas y puede proporcionar una mejor documentación sobre ellas, usando la metapalabra clave.

rule BlackEnergy_BackdoorPass_DropBear_SSH
{

    meta:
        description = "Detects the password of the backdoored DropBear SSH Server - BlackEnergy"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        hash = "0969daac4adc84ab7b50d4f9ffb16c4e1a07c6dbfc968bd6649497c794a161cd"

    strings:
        $s1 = "passDs5Bu9Te7" fullword ascii

    condition:
        uint16(0) == 0x5a4d and $s1
}

De todos modos, puedes usar los nombres que quieras para tus valores de metadatos ya que no afecta el código.

Comentarios

Para usarlos simplemente haz exactamente lo mismo que en lenguaje C.

// Single-line comment

/*

This is a
multiline comment

*/

Módulos

No cubriré esto en profundidad, pero YARA también permite módulos externos y son bastante sencillos de usar.

Para importar uno simplemente hazlo así:

import "cuckoo"

Y para usar una función de un módulo:

cuckoo.http_request(/someregexp/)

Dónde cuckoo está el módulo, http_requests la función y /someregexp/ representa los argumentos

Cómo usar las reglas

’Basado en Debian (Kali Linux, Parrot OS, Ubuntu…)'

apt install yara

'Basado en Arch (ArchLinux, BlackArch…)’

pacman -S yara

Estas son todas las reglas para detectar el malware BlackEnergy :

/*
	Yara Rule Set
	Author: Florian Roth
	Date: 2015-02-19
	Identifier: BlackEnergy Malware
*/

rule BlackEnergy_BE_2
{

   meta:
      description = "Detects BlackEnergy 2 Malware"
      author = "Florian Roth"
      reference = "http://goo.gl/DThzLz"
      date = "2015/02/19"
      hash = "983cfcf3aaaeff1ad82eb70f77088ad6ccedee77"

   strings:
      $s0 = "<description> Windows system utility service  </description>" fullword ascii
      $s1 = "WindowsSysUtility - Unicode" fullword wide
      $s2 = "msiexec.exe" fullword wide
      $s3 = "WinHelpW" fullword ascii
      $s4 = "ReadProcessMemory" fullword ascii

   condition:
      uint16(0) == 0x5a4d and filesize < 250KB and all of ($s*)
}

rule BlackEnergy_VBS_Agent
{

    meta:
        description = "Detects VBS Agent from BlackEnergy Report - file Dropbearrun.vbs"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        hash = "b90f268b5e7f70af1687d9825c09df15908ad3a6978b328dc88f96143a64af0f"

    strings:
        $s0 = "WshShell.Run \"dropbear.exe -r rsa -d dss -a -p 6789\", 0, false" fullword ascii
        $s1 = "WshShell.CurrentDirectory = \"C:\\WINDOWS\\TEMP\\Dropbear\\\"" fullword ascii
        $s2 = "Set WshShell = CreateObject(\"WScript.Shell\")" fullword ascii /* Goodware String - occured 1 times */

    condition:
        filesize < 1KB and 2 of them
}

rule DropBear_SSH_Server
 {

    meta:
        description = "Detects DropBear SSH Server (not a threat but used to maintain access)"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        score = 50
        hash = "0969daac4adc84ab7b50d4f9ffb16c4e1a07c6dbfc968bd6649497c794a161cd"

    strings:
        $s1 = "Dropbear server v%s https://matt.ucc.asn.au/dropbear/dropbear.html" fullword ascii
        $s2 = "Badly formatted command= authorized_keys option" fullword ascii
        $s3 = "This Dropbear program does not support '%s' %s algorithm" fullword ascii
        $s4 = "/etc/dropbear/dropbear_dss_host_key" fullword ascii
        $s5 = "/etc/dropbear/dropbear_rsa_host_key" fullword ascii

    condition:
        uint16(0) == 0x5a4d and filesize < 1000KB and 2 of them
}

rule BlackEnergy_BackdoorPass_DropBear_SSH
{

    meta:
        description = "Detects the password of the backdoored DropBear SSH Server - BlackEnergy"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        hash = "0969daac4adc84ab7b50d4f9ffb16c4e1a07c6dbfc968bd6649497c794a161cd"

    strings:
        $s1 = "passDs5Bu9Te7" fullword ascii

    condition:
        uint16(0) == 0x5a4d and $s1
}

rule BlackEnergy_KillDisk_1
{

    meta:
        description = "Detects KillDisk malware from BlackEnergy"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        score = 80
        super_rule = 1
        hash1 = "11b7b8a7965b52ebb213b023b6772dd2c76c66893fc96a18a9a33c8cf125af80"
        hash2 = "5d2b1abc7c35de73375dd54a4ec5f0b060ca80a1831dac46ad411b4fe4eac4c6"
        hash3 = "c7536ab90621311b526aefd56003ef8e1166168f038307ae960346ce8f75203d"
        hash4 = "f52869474834be5a6b5df7f8f0c46cbc7e9b22fa5cb30bee0f363ec6eb056b95"

    strings:
        $s0 = "system32\\cmd.exe" fullword ascii
        $s1 = "system32\\icacls.exe" fullword wide
        $s2 = "/c del /F /S /Q %c:\\*.*" fullword ascii
        $s3 = "shutdown /r /t %d" fullword ascii
        $s4 = "/C /Q /grant " fullword wide
        $s5 = "%08X.tmp" fullword ascii
        $s6 = "/c format %c: /Y /X /FS:NTFS" fullword ascii
        $s7 = "/c format %c: /Y /Q" fullword ascii
        $s8 = "taskhost.exe" fullword wide /* Goodware String - occured 1 times */
        $s9 = "shutdown.exe" fullword wide /* Goodware String - occured 1 times */

    condition:
        uint16(0) == 0x5a4d and filesize < 500KB and 8 of them
}

rule BlackEnergy_KillDisk_2
{

    meta:
        description = "Detects KillDisk malware from BlackEnergy"
        author = "Florian Roth"
        reference = "http://feedproxy.google.com/~r/eset/blog/~3/BXJbnGSvEFc/"
        date = "2016-01-03"
        score = 80
        super_rule = 1
        hash1 = "11b7b8a7965b52ebb213b023b6772dd2c76c66893fc96a18a9a33c8cf125af80"
        hash2 = "5d2b1abc7c35de73375dd54a4ec5f0b060ca80a1831dac46ad411b4fe4eac4c6"
        hash3 = "f52869474834be5a6b5df7f8f0c46cbc7e9b22fa5cb30bee0f363ec6eb056b95"

    strings:
        $s0 = "%c:\\~tmp%08X.tmp" fullword ascii
        $s1 = "%s%08X.tmp" fullword ascii
        $s2 = ".exe.sys.drv.doc.docx.xls.xlsx.mdb.ppt.pptx.xml.jpg.jpeg.ini.inf.ttf" fullword wide
        $s3 = "%ls_%ls_%ls_%d.~tmp" fullword wide

    condition:
        uint16(0) == 0x5a4d and filesize < 500KB and 3 of them
}

rule BlackEnergy_Driver_USBMDM
{

    meta:
        description = "Auto-generated rule - from files 7874a10e551377d50264da5906dc07ec31b173dee18867f88ea556ad70d8f094, b73777469f939c331cbc1c9ad703f973d55851f3ad09282ab5b3546befa5b54a, edb16d3ccd50fc8f0f77d0875bf50a629fa38e5ba1b8eeefd54468df97eba281"
        author = "Florian Roth"
        reference = "http://www.welivesecurity.com/2016/01/03/blackenergy-sshbeardoor-details-2015-attacks-ukrainian-news-media-electric-industry/"
        date = "2016-01-04"
        super_rule = 1
        hash1 = "7874a10e551377d50264da5906dc07ec31b173dee18867f88ea556ad70d8f094"
        hash2 = "b73777469f939c331cbc1c9ad703f973d55851f3ad09282ab5b3546befa5b54a"
        hash3 = "edb16d3ccd50fc8f0f77d0875bf50a629fa38e5ba1b8eeefd54468df97eba281"
        hash4 = "ac13b819379855af80ea3499e7fb645f1c96a4a6709792613917df4276c583fc"
        hash5 = "7a393b3eadfc8938cbecf84ca630e56e37d8b3d23e084a12ea5a7955642db291"
        hash6 = "405013e66b6f137f915738e5623228f36c74e362873310c5f2634ca2fda6fbc5"
        hash7 = "244dd8018177ea5a92c70a7be94334fa457c1aab8a1c1ea51580d7da500c3ad5"
        hash8 = "edcd1722fdc2c924382903b7e4580f9b77603110e497393c9947d45d311234bf"

    strings:
        $s1 = "USB MDM Driver" fullword wide
        $s2 = "KdDebuggerNotPresent" fullword ascii /* Goodware String - occured 50 times */
        $s3 = "KdDebuggerEnabled" fullword ascii /* Goodware String - occured 69 times */
    condition:
        uint16(0) == 0x5a4d and filesize < 180KB and all of them
}

rule BlackEnergy_Driver_AMDIDE
{

    meta:
        description = "Auto-generated rule - from files 32d3121135a835c3347b553b70f3c4c68eef711af02c161f007a9fbaffe7e614, 3432db9cb1fb9daa2f2ac554a0a006be96040d2a7776a072a8db051d064a8be2, 90ba78b6710462c2d97815e8745679942b3b296135490f0095bdc0cd97a34d9c, 97be6b2cec90f655ef11ed9feef5b9ef057fd8db7dd11712ddb3702ed7c7bda1"
        author = "Florian Roth"
        reference = "http://www.welivesecurity.com/2016/01/03/blackenergy-sshbeardoor-details-2015-attacks-ukrainian-news-media-electric-industry/"
        date = "2016-01-04"
        super_rule = 1
        hash1 = "32d3121135a835c3347b553b70f3c4c68eef711af02c161f007a9fbaffe7e614"
        hash2 = "3432db9cb1fb9daa2f2ac554a0a006be96040d2a7776a072a8db051d064a8be2"
        hash3 = "90ba78b6710462c2d97815e8745679942b3b296135490f0095bdc0cd97a34d9c"
        hash4 = "97be6b2cec90f655ef11ed9feef5b9ef057fd8db7dd11712ddb3702ed7c7bda1"
        hash5 = "5111de45210751c8e40441f16760bf59856ba798ba99e3c9532a104752bf7bcc"
        hash6 = "cbc4b0aaa30b967a6e29df452c5d7c2a16577cede54d6d705ca1f095bd6d4988"
        hash7 = "1ce0dfe1a6663756a32c69f7494ad082d293d32fe656d7908fb445283ab5fa68"

    strings:
        $s1 = " AMD IDE driver" fullword wide
        $s2 = "SessionEnv" fullword wide
        $s3 = "\\DosDevices\\{C9059FFF-1C49-4445-83E8-" wide
        $s4 = "\\Device\\{C9059FFF-1C49-4445-83E8-" wide

    condition:
        uint16(0) == 0x5a4d and filesize < 150KB and all of them
}

Entonces podríamos usarlo así:

Usando VirusTotal

es el mejor analizador de malware online (o al menos el más utilizado), con muchas capacidades para detectar malwares potenciales, obviamente utiliza YARA.

Carguemos nuestra muestra de malware allí para ver qué dice:

Y obviamente se detecta como malicioso.

Conclusión

Espero que hayas aprendido a escribir tus propias reglas YARA, cómo usarlas en la búsqueda de amenazas y cómo funcionan. En general, las reglas de YARA son una herramienta poderosa para identificar y clasificar malware.

Back to Blog