Ave Maria y las cámaras de Warzone RAT

El viernes 30 de septiembre de 2022 parecía un día como cualquier otro, hasta que una gran cantidad de malware en PowerShell apareció exigiendo atención inmediata. Sin perder tiempo, me puse manos a la obra.

 

Al principio, esto resultaba preocupante. ¿Están funcionando los detectores? ¿Algo está fallando? Para verificar que nuestro detector 'ExecutionFromEnvironmentVariable' se había activado correctamente para todos estos autoruns, hice una búsqueda rápida:

details.path:powershell.exe +details.command:"GetEnvironmentVariable"

Esto arrojó resultados para 40 autoruns. 😬 *truena los nudillos*  Hora de ponerse a trabajar.

Consejo profesional: hacer una búsqueda rápida ayuda a los analistas a entender mejor la sintaxis de búsqueda de Elastic. Esto les da a los analistas una mejor comprensión de las características comunes y podría ayudar a encontrar puntos de entrada adicionales. 

Ahora profundicemos en el autorun que estamos revisando.

Podemos ver GetEnvironmentVariable('60493fbacedcfbcabe', 'User') junto con el Name de la User Run Key. Ambos usan un formato Base-16 (HEX), lo que significa caracteres alfabéticos de A - F y números 0 - 9 con una longitud de 12 a 18. Usando regex podemos usar [a-f0-9]{12,18}.

Ahora, a implementar nuestros hallazgos en los datos de RIOs dentro de ELK. Usamos una consulta de búsqueda similar pero modificada (ver abajo), la cual arrojó seis resultados adicionales. Esta información nos dice que se trata de una amenaza activa que aún sigue presente en el endpoint. Es decir: el tiempo apremia.

+process.command_line.text:"GetEnvironmentVariable"  +process.command_line.text:/[a-f0-9]{12,18}/

Al revisar los detalles del punto de entrada, podemos ver la persistencia creada dentro del Hive Current Users Run Key. (HKU\SID\SOFTWARE\Microsoft\Windows\CurrentVersion\Run)

El comando ejecutado por la Users Run Key lanza PowerShell e invoca expresiones en el registro de entornos del endpoint con el valor 60493fbacedcfbcabe.

A partir de aquí nos encargaremos del Hive Current Users Environment del usuario: (HKU\SID\Environment). Obtenemos la siguiente etapa dentro de la ubicación del registro HKU\SID\Software\<value>.

Es importante señalar: estas claves de registro adicionales deberán incluirse en el informe para que el cliente las elimine.

Al revisar HKU\SID\Software\27842badfbdabe, vemos cuatro valores (default, 0, 1 y 3) que muestran variables de PowerShell y codificación. Guarda los valores 0, 1 y 3 para después y aísla el script para un análisis más detallado.

Ahora profundicemos un poco más en el script.

Dentro del script hay variables codificadas en Base64 y un arreglo invertido que une los datos. ¿Qué podría estar ocultando? Y no te equivoques: siempre está ocultando algo.

Usando Cyberchef, podemos intentar decodificar rápidamente las cadenas en base64 con la fórmula Subsection y Frombase64. Esto debería capturar la mayoría de las cadenas, pero aun así se necesitará algo de intervención manual. Aquí es donde entran en juego los analistas.

Después de reemplazar el script Base64 codificado, vemos rápidamente que tiene una clave, relleno (padding), un IV y otras funciones de cifrado comunes. Reemplacemos las variables con el valor correspondiente para que las funciones del script sean más fáciles de leer, intentando así revelar el secreto que esconde.

Ahora que reemplazamos las variables del script, podemos ver que el payload usa cifrado AES con el modo de cifrado Electronic CodeBook (ECB), descartando 16 bytes para crear el IV, y además ha sido comprimido.

Nota: algunas muestras usan distintos modos de cifrado, así que asegúrate de verificarlo (por ejemplo, hemos visto ECB y CBC).

Para obtener el IV de nuestro cifrado AES, necesitamos colocar el payload en Cyberchef. Como podemos ver el relleno = para Base64, revertimos el payload. Luego usamos From Base64, después de lo cual eliminamos los bytes desde los 16 bytes (empezando en 16 y con una longitud grande). Ahora convertimos el IV de vuelta To Base64.
Esto da como resultado nuestro IV: duNJnxEFm0/Nw/W34mpGMg==

Ahora combinemos todo. Asegúrate de revertir el payload From Base64 y eliminar los primeros 16 Bytes. Con el AES decrypt necesitamos la clave en Base64 9fJygHL[...], un IV que se obtuvo antes duNJnx[...], luego cambia el modo de cifrado AES a ECB, la entrada como Raw, y la salida como Raw. Dado que el payload también fue comprimido, necesitaremos usar Raw Inflate para obtener nuestra salida final.

Al inspeccionar la salida ya podemos ver que la siguiente etapa es otro script. Este script del payload es idéntico al anterior. Esta es una etapa de enjuagar y repetir. Espero que no esperaras que esto fuera sencillo; ¡eso sería demasiado fácil!

Después de afianzar lo que acabamos de aprender, obtenemos una nueva salida.

Para continuar, es necesario descargar el payload desde un enlace de Discord. Esto se reduce a la elección de cada analista sobre cómo descargar muestras maliciosas.

Nota: Si un script tiene Reflection.Assembly (assembly), esto carga un payload de .NET. Por lo tanto, cada vez que vemos Reflection.Assembly sabemos que estamos ante un malware de .NET.

Después de descargar el payload de Discord, dejaremos que el script haga el trabajo pesado. Solo necesitamos modificar partes del script después de descargar y aislar el payload:

[string] $xoredText = Get-Content "C:\\users\\Burgers\\Desktop\\mkv.txt"[io.file]::writeallbytes("C:\\users\\burgers\\desktop\\mkv_decoded.bin", $bytes)

Con el mkv_decoded.bin decodificado, sigue siendo importante hacer un análisis estático rápido del payload dentro de pestudio. La firma confirma nuestras sospechas de que es .NET. Junto con la descripción y la versión del archivo, nos da información adicional de que el payload podría ser un netLoaderDll. También vemos que la entropía es de solo 2,980, lo que muestra que este payload podría no estar empaquetado.

Al inspeccionar el netLoaderDll dentro de dnSpy vemos algunas clases: Main, runPayload y StringToByteArray.

 

Esta aplicación almacena la siguiente etapa del malware dentro de Main(), donde vemos que hay un array de bytes grande. El netLoaderDll necesita StringToByteArray para convertir el hexadecimal en una aplicación, y runPayload lanzará la siguiente etapa.

Extrae la cadena hexadecimal de dnSpy, colócala en Cyberchef y conviértela From Hex para obtener nuestra siguiente etapa.

 

Una vez más, coloca la siguiente etapa dentro de pestudio para un análisis estático rápido del contenido del archivo. Podemos ver que el archivo original se llama RunPE.exe. Con una descripción de SyscallPEloader, podemos suponer con cierta seguridad que se trata potencialmente de una herramienta para modificar el syscall. Este archivo ahora está muy empaquetado, con una entropía de 7,766.

 

 

Lamentablemente esta no es la última etapa del malware, y parece que usa una táctica común de evasión de desenganche de APIs dentro del endpoint y así genera un proceso para Notepad.exe. Como necesitamos más información, recurrimos a uno de nuestros expertos del vecindario para terminar esta investigación.

➡️ Un gran agradecimiento a @Matthew Brennan por sus ideas sobre esta siguiente etapa.
Lo siguiente es básicamente un resumen de los hallazgos de Matthew. ¡Veámoslo!

 

Después de ejecutar RunPE.exe, abrimos ResourceHacker para ver los procesos disponibles en el endpoint.

 

 

Dentro de propiedades, abrimos la pestaña Threads. De inmediato aparece un TID de 3488 que cambia su dirección de inicio de 0x1da511e0000 a 0x0.

 

Inspecciona el hilo, si quieres: aquí vemos SleepEx+0x9e, que pone a dormir el endpoint. También hay una dirección 0x1da52c4acdf cercana a la dirección de inicio que apareció al principio. Esta podría ser la parte de desencriptación del software. Copia el hilo 0x1da52c4acdf. Adelante. Está bien.

Ahora adjunta el proceso Notepad.exe a x64dbg y ve a Expression con Ctrl + G. Ahora pega la dirección del hilo 0x1da52c4acdf y establece un punto de interrupción de ejecución. Esperaremos.

 

Cambia el hilo al valor más cercano a la dirección; en este caso, es el hilo que usa 000001DA511E0000.

Ahora ejecutamos el depurador hasta que llegue al Hardware BreakPoint. Presionamos la tecla g y vemos un vistazo de lo que hacen los bucles en este endpoint. Esto podría ser el algoritmo de desencriptación.

También establecemos un punto de interrupción de hardware en ejecución en la dirección 000001DA52C4AD2B y ejecutamos la aplicación.

 

 

Ahora avanzamos paso a paso en el código un par de veces y obtenemos la información de nuestro C2: organitations[.]com/Preserve/stat/3E8YZFXJ (69.28.84.201).

 

Revisa ELK para el proceso notepad.exe generado por el proceso padre powershell.exe con el comando del entorno del usuario.

Nota: Es importante eliminar este proceso del cliente, ya que se trata de un beacon de cobalt strike.

Resumen:
El payload inicial de este malware es:

- un usuario descarga un maldocx desde un correo de phishing

- ejecutan el ejecutable, que corre un comando codificado en base64 que deshabilita el firewall e instala persistencia en el entorno dentro de la clave AutoRun del usuario, y crea un proceso con capacidades de RAT.

Se encontraron algunas muestras que tienen este patrón de ejecución:

Maldocx → Javascript (Wscript) → Entorno Powershell → Cobaltstrike

Maldocx → Entorno Powershell → Cobaltstrike

Reflexiones finales

Esperamos que esta deconstrucción te haya resultado útil. A continuación hay algunos recursos adicionales para que te ensucies las manos y profundices en lo que hicimos hoy en este blog. Cuantos más analistas experimenten con malware en un entorno seguro, mejor podrán detectar la actividad más sucia, oculta y peligrosa que acecha dentro de los entornos.

URLs de Discord

https://cdn[.]discordapp[.]com/attachments/1004902785772441697/1004915801771495495/ppp

https://cdn[.]discordapp[.]com/attachments/1013559875034415135/1014369421629857882/sdwwcKkjnwsdw.mkv

 

Autorun

HKU\SID\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

HKU\SID\Environment

HKU\SID\Software\<value>

C:\Users\User\appdata\local\temp\<value>.js - Algunas variantes

 

Consultas de búsqueda

+details.path:powershell.exe +details.command:"GetEnvironmentVariable"

+process.command_line.text:"GetEnvironmentVariable" +process.command_line.text:/[a-f0-9]{12,18}/

+process.name:notepad.exe +process.parent.name:powershell.exe +process.parent.args_count:7

+process.cleartext:(cdn.discordapp.com AND attachments)

También te podría interesar