Búsqueda de Ciberamenazas

Cómo detectamos Minhook en un ataque de carga lateral (y también en Suecia)

Los cambios multifacéticos en las TTP ilustran lo que ven los investigadores cuando comienzan a investigar

A finales de 2023 y durante la primera mitad de 2024, monitorizamos una campaña de ataques dirigida a varios de nuestros clientes en múltiples ubicaciones. Aunque los intentos de ataque lanzaron una carga útil de Cobalt Strike, que podría haber dado lugar a cualquier otra actividad, la información que pudimos recabar de nuestras detecciones nos lleva a evaluar con un nivel de confianza medio que la actividad podría remontarse a un único agente malicioso.

La campaña presentaba varias características dignas de mención:

  • El objetivo inicial en Extremo Oriente se desplazó a Suecia.
  • Uso de la DLL Minhook (Minhook es una biblioteca minimalista de enganches de API para Windows) para desviar las llamadas a la API de Windows.
  • El cargador limpio no formaba parte del paquete de carga lateral, sino que se sustrajo del sistema infectado.
  • Uso de una firma digital comprometida (aunque caducada) para los componentes.
  • La carga útil final fue Cobalt Strike.

La investigación ya ha concluido y los conocimientos adquiridos siguen dando resultados. En este análisis en profundidad, no solo veremos lo que hemos aprendido, sino también cómo se desarrolló la caza.

Incidentes iniciales en China/Taiwán

Observamos dos escenarios de carga lateral diferentes en un mismo día en el mismo cliente. Más tarde identificamos un tercero en otro cliente. Pensamos que los incidentes podrían estar relacionados, ya que ambos utilizaban los mismos nombres de archivo para los archivos de carga útil cifrados y Cobalt Strike era la carga útil en ambos casos, pero no pudimos recuperar los archivos maliciosos en esos casos.

Al realizar una búsqueda retrospectiva, encontramos incidentes similares en varios de nuestros clientes de China y Taiwán; los primeros indicios de muestras e informes se observaron el 1 de diciembre de 2023. Durante la investigación de este pequeño grupo, observamos tres intentos de carga lateral independientes, como detallaremos a continuación.

Carga lateral de MiracastView

Se activó nuestra mitigación Shellcode/C2Interceptor y observamos una conexión C2 saliente a un servidor Cobalt Strike. El ejecutable utilizado para el cargador era un componente de Windows 10: el servicio de pantalla inalámbrica Miracast.

Identificamos los siguientes componentes:

Cargador limpio:

Path: appdata\\local\\microsoft\\windowsapps\\miracastview.exe
Hash: 0bba1b25f7065118fbfd607a123b6c09d8b97ab5be4ca42b56a994188408f7a9

Cargador malicioso:

Path: appdata\\local\\microsoft\\windowsapps\\miracastview.dll
Hash: 402be231f1c9258bb1510962b15c3ea5410e54f97e3269cd6cd4c355822798d1

Archivos de carga útil:

appdata\\local\\microsoft\\windowsapps\\syncres.dat
appdata\\local\\microsoft\\windowsapps\\dsccorer.mui

Observamos conexiones C2 a las siguientes direcciones:

note.dnsrd[.]com/list
note.googlestaic[.]com/list
prdelb.dubya[.]net/list

Estos son servidores C2 de Cobalt Strike. El siguiente fragmento contiene la parte relevante de la configuración C2:

C2Server:note.googlestaic[.]com,/list,note.dnsrd[.]com,/list,prdelb.dubya[.]net,/list
UserAgent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) CHrome/117.0.0.0 Safari/537.36 Edg/117.0.2045.31
HTTP_Post_URI:/note

Desafortunadamente, no pudimos recuperar el cargador malicioso ni los archivos de carga útil. Sin embargo, basándonos en el nombre del archivo, encontramos la siguiente información en VirusTotal:

db7349a2cf678d5ddbbeb989f0893a146ae536c9169c3940c6caac9cafb3de62: SyncRes.dat

Además de tener el mismo nombre de archivo, también incluía la función exportada StartEngineData que buscaba el cargador malicioso del segundo caso, por lo que creemos que se trata del mismo componente creado por el mismo autor de la amenaza.

Carga lateral de PrintDialog

Encontramos esto después de investigar casos relacionados con el archivo de carga útil dsccorer.mui.

En este caso, nuestra telemetría mostró que la actividad de carga lateral se originó en un instalador aparentemente legítimo de la herramienta LetsTalkApplication (en la ruta correcta C:\Program Files (x86)\Letstalk\LetstalkApplication.exe”). Esto sugiere que la distribución inicial de este escenario se realizó a través de esta aplicación de chat, ofrecida por Letstalk Technology Limited, con sede en Taiwán. No hay más información.

minhook
Figura 1: uso indebido de la carga lateral del archivo de la aplicación Letstalk. En el gráfico, las abreviaturas dentro del círculo muestran que letstalkapplication.exe realizó 200 conexiones IP salientes, realizó cambios en el Registro 135 veces y llevó a cabo muchas operaciones de archivo adicionales, leyendo (200 operaciones) y escribiendo (154 operaciones) sin control.

Identificamos los siguientes componentes:

Cargador limpio:

Path: appdata\\local\\microsoft\\windows\\printdialog.exe
Hash: 138fla466c26675a16b4e9b8660873b89e5d7fc788ce3810bb357db7cb20aee9

Cargador malicioso:

Path: appdata\\local\\microsoft\\windows\\printdialog.dll
Hash: 3f4cac516b8f2ccb6f10042100369c018d8671972fad360977fe522fd47e06c6

Archivos de carga útil:

Path: appdata\\local\\microsoft\\windows\\syncres.dat
Path: appdata\\local\\microsoft\\windows\\dsccorer.mui

Carga lateral de SystemSettings

Al mismo tiempo que el caso de MiracastView, observamos otro escenario de carga lateral en el mismo cliente. Identificamos los siguientes componentes:

Cargador limpio:

Path: AppData\Local\Microsoft\Windows\SystemSettings.exe
Hash: e768ff1f2f31178fe5930f261acd4b19464acc019fb0aa697d0b48686e59050c

Cargador malicioso:

Path: appdata\\local\\microsoft\\windows\\systemsettings.dll
Hash: b72daf654fc83cd6ccccedbf57a102b48af42f410dbc48f69ec5c8c62545dc18

Archivos de carga útil:

appdata\\local\\microsoft\\windows\\wuapi.dat
appdata\\local\\microsoft\\windows\\mprapi.dat

En este caso, recuperamos el cargador malicioso, por lo que sabemos que descomprime el contenido de wuapi.dat y mprapi.dat y, a continuación, llama a la exportación StartEngineData desde ambos.

También extrae el DLL Minhook de los recursos (SHA256: bddd6adaee8ab13eabaa7c73c97718cee1437db2054ca713ec7cc86e8002a300). El archivo DLL de este recurso es el mismo que el disponible en https://github[.]com/howmp/pyminhook/raw/master/minhook/MinHook.x64.dll .

Minhook
Figura 2: vista del archivo DLL hexadecimal Minhook.x64

Utiliza Minhook para enganchar las siguientes funciones API:

  • GetProcAddress
  • FreeLibrary
  • LdrUnloadDll
Minhook
Figura 3: enganches en las funciones API

Estos enganches se utilizan para cargar el archivo de carga útil mprapi.dat al activarse.

La conexión sueca

Utilizando la información extraída de las muestras recuperadas, configuramos una búsqueda en VirusTotal para encontrar nuevas muestras. Esperábamos encontrar más muestras relacionadas con regiones asiáticas. Para nuestra sorpresa, aunque apareció una nueva muestra, aparentemente estaba dirigida a víctimas suecas.

La nueva muestra era un instalador. Los componentes de carga lateral instalados utilizaban los mismos nombres de archivo para el cargador limpio y el cargador malicioso que en el caso de SystemSettings, pero los nombres de los archivos de carga útil proceden de los escenarios MiracastView/PrintDialog.

Otra característica común es el uso de la DLL Minhook; sin embargo, en este caso no la carga el cargador malicioso, sino el archivo de carga útil.

El hallazgo de esta muestra nos permitió no solo obtener y analizar todos los componentes, sino también establecer un vínculo adicional entre los tres escenarios anteriores.

Identificamos los siguientes componentes:

Cargador limpio:

Name: GoogleUpdateStepup.exe
Hash: f87cb46cac1fa44c9f1430123fb23e179e3d653a0e4094e0c133fa48a924924f

Cargador malicioso:

Name: SystemSetting.dll 
Hash: fd93d7a9f884e0b63106e669a10b8faeaaafda49fac05a66d8581c9e9aa31ad3

Archivos de carga útil:

Name: DscCoreR.mui
Hash: bc56676f0da4b0fba57aaa51d390732e40ef713909e5a70bb30264b724a65921
Name: SyncRes.dat
Hash: 47f60c25ab5bb07dc3f65694302991a0796a29021b570a2335acda8196dd2b52

Instalador

El instalador proporcionó otra sorpresa: estaba firmado digitalmente. La firma pertenece a Gala Lab Corp., una empresa coreana desarrolladora de juegos en línea. Aunque la firma ha caducado, se comprueba como válida si el reloj del sistema se retrasa hasta antes de la fecha de caducidad, a principios de 2023.

minhook
Figura 4: un certificado de Gala Labs que en su día fue válido tiene una desagradable vida después de la muerte

En otras palabras, parece que los autores de la amenaza obtuvieron de alguna manera una firma digital comprometida de esta empresa. Sin embargo, no está claro por qué los atacantes utilizarían un certificado caducado, ya que se mostrará como no válido si el reloj del sistema es correcto.

minhook
Figura 5: cuando el reloj del sistema está bien configurado, se alerta del certificado caducado

Las muestras se compilaron mucho después de esa fecha de caducidad de 2023. Las marcas de tiempo indican que, de hecho, se compilaron el 11 de enero de 2024, es decir, después de los rastros que encontramos de la infección anterior el 1 de diciembre de 2023.

Durante el proceso de ataque, los componentes se almacenan en los recursos, como se muestra a continuación:

minhook
Figura 6: ocultando los componentes

Coloca los componentes de carga lateral en %AppData%\Roaming\xwreg\:

bc56676f0da4b0fba57aaa51d390732e40ef713909e5a70bb30264b724a65921 *DscCoreR.mui
47f60c25ab5bb07dc3f65694302991a0796a29021b570a2335acda8196dd2b52 *SyncRes.dat
fd93d7a9f884e0b63106e669a10b8faeaaafda49fac05a66d8581c9e9aa31ad3 *SystemSettings.dll
880dea11f75380e300bfd5c8054a655eacb2aa0da2c0d89fef3c32666df9a533 *SystemSettings.exe

Los archivos de carga lateral se almacenan en dos recursos comprimidos (zlib inflate):

UMRDPRDAT (resource ID: 129 extracted to SyncRes.dat)
VAULTSVCD (resource ID: 130 extracted to DscCoreR.mui)

El archivo SystemSetting.dll no se encuentra en el recurso, sino en la sección .data (también zlib inflate):

minhook
Figura 7: donde no debería estar

Curiosamente, el cargador limpio (SystemSettings.exe) no forma parte del paquete de instalación. En cambio, al ser un componente estándar, se puede obtener de su ubicación legítima (%WINDOWS%\ImmersiveControlPanel) y copiar junto con los componentes maliciosos de carga lateral.

minhook
Figura 8: uso inusual de material que ya se encuentra en el sistema

Se trata de un enfoque bastante inusual. Aunque los LOLbins están ganando popularidad (como ya hemos comentado en otra ocasión), normalmente a los autores de amenazas de este tipo les gusta asegurarse de que entregan todos los componentes necesarios para la operación.

El recurso TELEMETRY que se ve en la figura 6 es probablemente el instalador falso de Google Update Setup, como se muestra a continuación.

7b952d83286157163b655917188b2eaf92a50fe3058922810d47b25eaf6eb9fc: legit GoogleUpdateSetup.exe

minhook
Figura 9: la instalación intenta pasar desapercibida en sueco. La pantalla de carga anterior se explica por sí sola; la pantalla inferior dice «No se puede conectar a Internet. Si estás utilizando un firewall, añade GoogleUpdate.exe a la lista de aprobados [lista blanca]».
Durante la instalación, el componente beacon de Cobalt Strike establece una conexión con el servidor C2 bostik.cmsnet.se.

Cargador limpio

Cargador malicioso

El cargador malicioso carga (y descomprime en cierta medida) DscCoreR.mui y salta al punto de entrada 0x1020 en el volcado, que es la exportación SetUserProcessPriorityBoost.

La cadena de ejecución de los componentes de carga lateral es la siguiente:

SystemSettings.exe
-> carga lateral
SystemSettings.dll
-> descomprime, carga y llama a la exportación SetUserProcessPriorityBoost
DscCoreR.mui
-> descomprime, carga y llama a la exportación StartEngineData
SyncRes.dat

DscCoreR.mui

El nombre interno de este componente es StartRun.dll . Exporta la función SetUserProcessPriorityBoost.

El volcado de memoria contiene dos imágenes comprimidas; cuando se descomprimen, una es una DLL Minhook y la otra es una baliza Cobalt Strike. Carga SyncRes.dat (véase la siguiente sección) y, a continuación, localiza y llama a la exportación StartEngineData. Después de cargar la DLL Minhook, la utilizará para enganchar las siguientes funciones API:

VirtualAlloc
Sleep
minhook
Figura 10: conexión de la función VirtualAlloc

A partir de este punto, las funciones API enganchadas se desviarán al código malicioso de DscCoreR.mui.

minhook
Figura 11: la función VirtualAlloc subvertida

(Las funciones de desvío no parecen hacer nada). Si los enganches tienen éxito, descomprime la baliza Cobalt Strike y la ejecuta.

minhook
Figura 12: en acción

Datos de configuración:

C2Server - bostik.cmsnet.se,/claim/data/jquery-3.3.1.min.aspx
HttpPostUri - /claim/data/jquery-3.3.2.min.aspx

SyncRes.dat

El nombre interno de este componente es Behavior.dll . Exporta la función StartEngineData.

Contiene un PE comprimido incrustado al que parece faltarle un encabezado MZ.

Conclusión

En última instancia, no observamos actividad continuada tras el grupo de casos que documentamos a principios de 2024. No se puede extraer ninguna conclusión de ello, pero el salto geográfico que dio este ataque, además de su clara remezcla de componentes de otros intentos de ataque, apuntan a que un agente malicioso está explorando nuevas formas de lograr uno o varios objetivos. Puede que no sea fácil analizar de forma continuada un grupo de eventos tan llamativos como este en el ajetreo diario por diseñar y ofrecer protecciones, pero siempre es útil echar la vista atrás a momentos más pequeños como estos para ver qué se puede aprender de ellos.