Investigadores de ESET han descubierto Hodur, una variante del RAT Korplug que no había sido documentada previamente, distribuida por Mustang Panda utilizando como señuelo correos de phishing que hacen referencia a eventos actuales en Europa, incluida la invasión de Ucrania.
Los investigadores de ESET descubrieron una campaña aún en curso utilizando una variante del malware Korplug que no había sido documentada anteriormente, a la que llamaron Hodur debido a su parecido con la variante de THOR documentada previamente por Unit 42 en 2020. En la mitología nórdica, Hodur es el medio hermano ciego de Thor, que es engañado por Loki para matar a su medio hermano Baldr.
Hallazgos claves en este artículo:
- En marzo de 2022, esta campaña está aún en curso y se remonta al menos a agosto de 2021.
- Las víctimas conocidas incluyen entidades de investigación, proveedores de servicios de Internet y misiones diplomáticas europeas.
- La cadena de compromiso incluye documentos utilizados como señuelo que se actualizan con frecuencia y se relacionan con eventos en Europa.
- La campaña utiliza un loader personalizado para ejecutar una nueva variante de Korplug.
- Cada etapa del proceso de implementación utiliza técnicas de antianálisis y ofuscación del control de flujo, lo que lo distingue de otras campañas.
- Los investigadores de ESET brindan un análisis en profundidad de las capacidades y comandos de esta nueva variante.
Es probable que las víctimas de esta campaña sean atraídas con documentos de phishing que aprovechan los últimos acontecimientos en Europa, como la invasión de Rusia a Ucrania. Esto dio lugar a que más de tres millones de residentes huyeran de la guerra a los países vecinos, lo que provocó una crisis sin precedentes en las fronteras de Ucrania. Uno de los nombres de archivo relacionados con esta campaña es Situation at the EU borders with Ukraine.exe.
Otros señuelos utilizados para el phishing mencionan las restricciones de viaje actualizadas por el COVID-19, un mapa de ayuda regional aprobado para Grecia y un Reglamento del Parlamento Europeo y del Consejo Europeo. El último es un documento real disponible en el sitio web del Consejo Europeo. Esto demuestra que el grupo APT detrás de esta campaña está siguiendo de cerca los temas de actualidad y que es capaz de reaccionar con éxito y rapidez ante ellos.
Países afectados:
- Mongolia
- Vietnam
- Birmania
- Grecia
- Rusia
- Chipre
- Sudán del Sur
- Sudáfrica
Organizaciones afectadas:
- Misiones diplomáticas
- Entidades de investigación
- Proveedores de servicios de Internet (ISP)
Análisis
Con base en las similitudes de código y las muchas similitudes en cuanto a Tácticas, Técnicas y Procedimientos (TTP), los investigadores de ESET atribuyen esta campaña con mucha confianza a Mustang Panda (también conocido como TA416, RedDelta o PKPLUG). Es un grupo de ciberespionaje que apunta principalmente a entidades gubernamentales y ONG. En su mayoría, aunque no exclusivamente, sus víctimas se encuentran en el este y sureste de Asia, especialmente en Mongolia. El grupo también es conocido por su campaña dirigida al Vaticano en 2020.
Si bien no hemos podido identificar los mercados verticales de todas las víctimas, esta campaña parece apuntar a los mismos blancos que otras campañas de Mustang Panda. Siguiendo la victimología típica de este grupo de APT, la mayoría de las víctimas se encuentran en el este y sureste de Asia, junto con algunas en países europeos y africanos. Según la telemetría de ESET, la gran mayoría de las víctimas son de Mongolia y Vietnam, seguidos por Myanmar, y solo unas pocas víctimas en los otros países afectados.
Las campañas de Mustang Panda utilizan con frecuencia loaders personalizados para malware de uso común, incluidos Cobalt Strike, Poison Ivy y Korplug (también conocido como PlugX). También se sabe que el grupo crea sus propias variantes de Korplug. En comparación con otras campañas que utilizan Korplug, cada etapa del proceso de despliegue utiliza técnicas antianálisis y ofuscación de control de flujo.
Este artículo contiene un análisis detallado de esta variante de Korplug previamente desconocida y utilizada en esta campaña. Esta actividad es parte de la misma campaña que recientemente cubrió Proofpoint, pero proporcionamos información histórica y de orientación adicional.
Conjunto de herramientas
Mustang Panda es conocido por la elaboración de loaders personalizados y variantes de Korplug, y las muestras utilizadas en esta campaña muestran esto mismo a la perfección.
Las cadenas de compromiso que se ven en esta campaña siguen el patrón típico de Korplug: un ejecutable legítimo, válidamente firmado y vulnerable a la técnica conocida como DLL search-order hijacking, una DLL maliciosa y un archivo Korplug cifrado que son desplegados en la máquina de la víctima. Se abusa del ejecutable para cargar el módulo, que luego descifra y ejecuta el RAT Korplug. En algunos casos, primero se usa un downloader para desplegar estos archivos junto con un documento utilizado como señuelo. Este proceso se ilustra en la Figura 2.
Lo que distingue a esta campaña es el intenso uso de técnicas de ofuscación de control de flujo y antianálisis en cada etapa del proceso de despliege. Las siguientes secciones describen el comportamiento de cada etapa y profundizan en las técnicas de evasión de defensa utilizadas en cada una de ellas.
Acceso inicial
No hemos podido observar el vector utilizado para el despliegue inicial, pero nuestro análisis apunta a ataques de phishing y de watering hole como probables vectores. En los casos en los que vimos un downloader, los nombres de archivo utilizados sugieren un documento con un tema interesante para la víctima. Tales ejemplos incluyen:
- COVID-19 travel restrictions EU reviews list of third countries.exe
- State_aid__Commission_approves_2022-2027_regional_aid_map_for_Greece.exe
- REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe
- Situation at the EU borders with Ukraine.exe
Para fomentar la ilusión, estos binarios descargan y abren un documento que tienen el mismo nombre, pero con una extensión .doc o .pdf. El contenido de estos señuelos refleja con precisión el nombre del archivo. Como se muestra en la Figura 3, al menos uno de ellos es un documento legítimo de acceso público del Parlamento Europeo.
Downloader
Aunque su complejidad ha aumentado a lo largo de la campaña, el downloader es bastante sencillo. Este aumento en la complejidad proviene de técnicas adicionales de antianálisis, que trataremos más adelante en esta sección.
Primero descarga cuatro archivos a través de HTTPS: un documento señuelo, un ejecutable legítimo, un módulo malicioso y un archivo Korplug cifrado. La combinación de esos tres últimos componentes para ejecutar un payload a través de la carga lateral de DLL a veces se denomina tridente y es una técnica comúnmente utilizada por Mustang Panda y en general con los loaders de Korplug. Tanto las direcciones del servidor como las rutas de los archivos están hardcodeadas en el ejecutable del downloader. Una vez que se descarga todo y se abre el documento señuelo para engañar a la víctima, el downloader usa la siguiente línea de comando para iniciar el ejecutable legítimo:
cmd /c ping 8.8.8.8 -n 70&&”%temp%<legitimate executable>”
Este comando ping verifica la conectividad a Internet e introduce un retraso (a través de la opción -n 70) antes de ejecutar el ejecutable legítimo descargado.
El downloader utiliza varias técnicas de antianálisis, muchas de las cuales también se utilizan en el loader y el payload final. En el transcurso de la campaña se ha agregado ofuscación adicional a las nuevas versiones sin cambiar su objetivo.
En las primeras versiones del downloader se usaba código basura y predicados opacos para dificultar el análisis, como se muestra en la Figura 4, pero el servidor y los nombres de archivo son claramente visibles en texto plano.
En versiones posteriores, los archivos en el servidor están cifrados con RC4, utilizando como clave la representación de la string en base 10 del tamaño del archivo, y luego se codifican en hexadecimal. Este proceso se ilustra en el fragmento de Python a continuación. El downloader realiza las operaciones opuestas en el lado del cliente para recuperar los archivos de texto sin formato. Es probable que esto se haga para eludir las protecciones a nivel de red.
from Crypto.cipher import ARC4
key = “%d” % len(plaintext)
rc4 = ARC4.new(key)
cipher_content = rc4.encrypt(plaintext).hex().upper()
Estas versiones reemplazan el uso de strings en texto sin formato por pilas de strings cifradas. Todavía están harcodeadas en el archivo, pero la ofuscación que los rodea y el uso de diferentes claves hace que sea difícil descifrarlos estáticamente de manera automática. Esta misma técnica se utiliza mucho en las etapas posteriores. Las pilas de strings cifradas también se utilizan para ofuscar las llamadas a las funciones de la API de Windows.
Primero, el nombre de la función de destino se descifra y se pasa a una función. Esta función obtiene un puntero al campo InMemoryOrderModuleList del PEB (Process Environment Block). Luego itera sobre los módulos cargados, pasando cada identificador a GetProcAddress junto con el nombre de la función hasta que la función de destino se resuelva correctamente. Parte de este proceso se puede ver en la Figura 5.
Loader
Como es común con Korplug, el loader es una DLL que explota una vulnerabilidad de carga lateral en un ejecutable legítimo y firmado. Hemos observado que se abusa de muchas aplicaciones diferentes en esta campaña, por ejemplo, un ejecutable de SmadAV vulnerable que se había visto anteriormente por Qurium en una campaña atribuida a Mustang Panda dirigida a Myanmar.
El loader exporta múltiples funciones. La lista exacta varía según la aplicación abusada, pero en todos los casos, solo uno de ellos hace algo importante. En todos los loaders que observamos, esta es la función exportada con la dirección de carga más alta. Todas las demás exportaciones y el punto de entrada de la biblioteca regresan inmediatamente o ejecutan algún código basura que no hace nada. Muchas de estas exportaciones tienen nombres que consisten en letras minúsculas aleatorias y apuntan a la misma dirección que se muestra en la Tabla 1.
Tabla 1. Funciones exportadas por un loader Hodur. La exportación createSystemFontsUsingEDL es la que carga la etapa final del malware en esta versión.
Name | Ordinal | Function RVA |
---|---|---|
CreatePotPlayerExW | 1 | 0x00007894 |
RunPotPlayer | 2 | 0x000166A5 |
createSystemFontsUsingEDL | 3 | 0x00016779 |
gGegcerhwyvxtkrtyawvugo | 4 | 0x00007894 |
liucigvyworf | 5 | 0x00007639 |
ojohjinbgdfqtcwxojeusoneslciyxtiyjuieaugadjpd | 6 | 0x000077CA |
soeevhiywsypipesxfhgxboleahfwvlqcqp | 7 | 0x00007894 |
srkeqffanuhiuwahbmatdurggpffhbkcpukyxgxmosn | 8 | 0x00007894 |
thggvmrv | 9 | 0x00007701 |
La función del loader obtiene el directorio desde el que se ejecuta la DLL utilizando GetModuleFileNameA e intenta abrir el archivo Korplug cifrado que contiene. Ese nombre de archivo está hardcodeado en el loader. Lee el contenido del archivo en un búfer asignado localmente y lo descifra. El loader hace que este búfer sea ejecutable mediante VirtualProtect antes de llamarlo en el offset 0x00.
Las llamadas a funciones de la API de Windows se ofuscan con una técnica diferente a la utilizada en el downloader. A diferencia del loader, que contiene los nombres de sus funciones (como se muestra en la Tabla 1 anterior), solo los hashes 64 bits de las llamadas a funciones de la API de Windows están presentes en el binario. Para resolver esas funciones, el loader recorre las listas de exportación de todas las bibliotecas cargadas a través de InMemoryOrderModuleList de PEB. El nombre de cada exportación se codifica y luego se compara con el valor esperado. El algoritmo hash FNV-1a, que recientemente volvió a la actividad gracias al backdoor Sunburst, ha sido utilizado anteriormente por Mustang Panda, en los loaders de Korplug documentados por XORHEX, para resolver GetProcAddress y LoadLibraryA, aunque no se identificó por su nombre en ese análisis. En esta versión, sin embargo, se utiliza para todas las funciones de la API.
Backdoor Korplug
Korplug (también conocido como PlugX) es un RAT utilizado por varios grupos de APT. A pesar de ser tan ampliamente utilizado, o tal vez por ello, pocos informes describen ampliamente sus comandos y los datos que extrae. Su funcionalidad no es constante entre las variantes, pero parece existir una superposición significativa en la lista de comandos entre la versión que analizamos y otras fuentes como el informe Avira de enero de 2020 y el proyecto plugxdecoder en GitHub.
Como se mencionó anteriormente, la variante utilizada en esta campaña tiene muchas similitudes con la variante THOR, por lo que la hemos llamado Hodur. Las similitudes incluyen el uso de la clave de registro SoftwareCLASSESms-pu, el mismo formato para los servidores C&C en la configuración y el uso de la clase window Static.
Como se esperaba para los payloads de Korplug, el loader solo descifra esta etapa en la memoria. Solo la versión cifrada se escribe en el disco en un archivo con una extensión .dat.
A menos que se indique lo contrario, todas las strings hardcodeadas que se analizan en esta sección están almacenadas como cadenas de pila cifradas.
En este módulo, las funciones de la API de Windows se ofuscan mediante una combinación de los métodos utilizados en etapas anteriores. LoadLibraryA y GetProcAddress se resuelven mediante la técnica de hashing FNV-1a y las cadenas de pila se descifran y son pasadas para obtener la función de destino.
Carga
Una vez descifrado, el payload es una DLL válida que exporta una sola función. En casi todas las muestras observadas de esta campaña, esta función se denomina StartProtect. Sin embargo, lanzarla directamente a través de esta exportación o su punto de entrada no ejecutará el payload y el proceso de carga es bastante complicado.
Como se explicó en la sección anterior, el loader descifra el archivo en la memoria como un blob continuo y la ejecución comienza en el offset 0x00. El encabezado PE contiene shellcode, que se muestra en la Figura 6, que llama a un offset específico que corresponde a la exportación única del módulo.
Esta función parsea el blob PE en la memoria y manualmente lo mapea como una biblioteca en un búfer recién asignado. Esto incluye mapear las diversas secciones, resolver importaciones y, finalmente, usar DLL_PROCESS_ATTACH para llamar al punto de entrada de DLL. Una vez más, se utilizan predicados opacos y código basura para ofuscar el propósito de esta función.
A continuación, se llama al punto de entrada de la biblioteca correctamente cargada con el valor no estándar de 0x04 para el parámetro fdwReason (actualmente solo los valores de 0x00 a 0x03 están actualmente definidos). Este valor especial es necesario para que ejecute el payload principal. Esta simple verificación evita que el RAT se ejecute directamente con una herramienta genérica como rundll32.exe.
El backdoor primero descifra su configuración usando la string 123456789 como una clave XOR repetida. Una vez descifrado, el bloque de configuración comienza con ########. El diseño de la configuración varía ligeramente entre las muestras, pero todas contienen al menos los siguientes campos:
- Nombre del directorio de instalación. También se usa como el nombre de la clave de registro creada para la persistencia. Este valor corresponde aproximadamente al nombre de la aplicación abusada con tres letras aleatorias adjuntas (por ejemplo, FontEDLZeP o AdobePhotosGQp)
- Nombre del mutex
- Un valor que es una string de versión o de ID
- Lista de servidores C&C. Cada entrada incluye la dirección IP, el número de puerto y un número que indica el protocolo que se utilizará con ese C&C
Luego, el backdoor verifica la ruta desde la que se ejecuta utilizando GetModuleFileNameW. Si esto coincide con %userprofile%<installation directory> o %allusersprofile%<installation directory>, se ejecutará la funcionalidad de RAT. De lo contrario, pasará por el proceso de instalación.
Instalación
Para instalarse, el malware crea el directorio antes mencionado en %allusersprofile%. Luego, utilizando SetFileAttributesW se marca como hidden y system. El ejecutable vulnerable, el módulo de carga y los archivos cifrados de Korplug se copian en el nuevo directorio.
A continuación se establece la persistencia. Las muestras anteriores lograron esto mediante la creación de una tarea programada para ejecutarse en el arranque a través de schtasks.exe. Las muestras más recientes agregan una entrada de registro a SoftwareMicrosoftWindowsCurrentVersionRun, probando primero la sección HKLM y luego HKCU. Esta entrada tiene el mismo nombre que el directorio de instalación con su valor establecido en la ruta del ejecutable recién copiado.
Una vez que se ha configurado la persistencia, el malware inicia el ejecutable desde su nueva ubicación y sale.
RAT
La funcionalidad RAT de la variante Hodur utilizada en esta campaña se alinea principalmente con otras variantes de Korplug, con algunos comandos y características adicionales. Sin embargo, como hemos dicho anteriormente, los análisis detallados de los comandos de Korplug son pocos y esporádicos, por lo que nuestro objetivo es proporcionar dicho análisis con la esperanza de ayudar a los futuros analistas.
Cuando está en este modo, el backdoor itera a través de la lista de servidores C&C en su configuración hasta que llega al final o recibe un comando de desinstalación. Para cada uno de esos servidores, procesa comandos hasta que recibe un comando Stop o encuentra un error.
El handshake inicial de Hodur se puede realizar a través de HTTPS o TCP. Esto está determinado por un valor en la configuración de ese servidor C&C en particular. La comunicación posterior siempre se realiza a través de TCP utilizando un protocolo personalizado que describimos en esta sección, junto con los comandos que se pueden emitir. Hodur usa sockets de la API de Windows Sockets (Winsock) que admiten I/O superpuestas.
Después del protocolo de enlace inicial, las comunicaciones de Hodur involucran mensajes TCP que consisten en un encabezado, con la estructura descrita en la Tabla 2, seguido de un cuerpo de mensaje que generalmente se comprime usando LZNT1 y siempre se cifra con RC4. Los mensajes cuyo Número de comando tiene en el campo encabezado el conjunto de bits 0x10000000 (aquellos que contienen contenido de archivo para los comandos ReadFile y WriteFile, descritos en la Tabla 3) tienen cuerpos de mensaje cifrados, pero no comprimidos. Todos los cuerpos de mensajes cifrados usan la clave hardcodeada sV!e@T#L$PH% con un nonce aleatorio de cuatro bytes (el valor en el offset 0x00 en el encabezado) adjunto.
Tabla 2. Formato de encabezado utilizado para la comunicación entre el C&C y el backdoor
Offset | Field | Description |
---|---|---|
0x00 | Nonce | Random nonce appended to the RC4 key. |
0x04 | Command number | This field indicates the command to run or the command that caused this response to be sent. |
0x08 | Length of body | Length of the message body. It seems that this field isn’t checked by the client for messages from the C&C server. |
0x0C | Command exit status | The return or error value of the command that was run. This field is not checked by the client in messages received from the C&C server. |
Los encabezados de los mensajes del C&C de Hodur se transmiten sin cifrar, seguidos de cuerpos de mensaje de tamaño variable (el valor en el offset 0x08 del encabezado). El formato del cuerpo del mensaje varía según el comando, pero una vez descifrados y descomprimidos, los valores de longitud variable (como strings) siempre están al final del cuerpo del mensaje y su offset en el cuerpo se almacena como un número entero en el campo del mensaje correspondiente.
Al igual que la versión descrita por Avira, Hodur tiene dos grupos de comandos –0x1001 y 0x1002—, cada uno con su propio controlador. El servidor C&C puede establecer qué grupo escuchar enviando el ID correspondiente como el Número de comando cuando un cliente aún no está en uno de los dos modos. Continuará escuchando el mismo grupo hasta que reciba el comando Stop o se produzca un error (incluida la recepción de un mensaje con un Número de comando no válido en su encabezado).
El primer grupo, 0x1001, contiene comandos para administrar la ejecución del backdoor y realizar un reconocimiento inicial en un host recientemente comprometido. Como estos comandos no toman argumentos, los mensajes enviados por el servidor C&C consisten solo en los encabezados. La Tabla 3 contiene una lista de estos comandos. El comando GetSystemInfo se describe con más detalle a continuación. Tenga en cuenta que no hay nombres de comandos presentes en el RAT; fueron tomados de análisis previos o proporcionados por nosotros.
Tabla 3. Comandos en el grupo 0x1001
ID | Name | Description | Data in client response |
---|---|---|---|
0x1000 | Ping | Sent by the client when it starts listening for commands from this group. | Between 0 and 64 random bytes |
0x1001 | GetSystemInfo | Get information about the system. | See Table 4 |
0x1002 | ListenThread | Start a new thread that listens for group 0x1002 commands. | None |
0x1004 | ResetConnection | Terminate with WSAECONNRESET. | N/A |
0x1005 | Uninstall | Delete persistence registry keys, remove itself and created folders. | None |
0x1007 | Stop | Set registry key SystemCurrentControlSetControlNetworkallow to 1 and exit. | N/A |
El comando GetSystemInfo recopila extensa información sobre el sistema, como se detalla en la Tabla 4. Si aún no existe, la clave de registro SoftwareCLASSESms-puCLSID se establece en la marca de tiempo actual, probando primero con HKLM y luego HKCU. A continuación, el valor de esta clave se envía en la respuesta.
Tabla 4. Formato del cuerpo de respuesta para la respuesta GetSystemInfo
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | Magic bytes 0x20190301 | 0x38 | Suite mask |
0x04 | Client IP address of the C&C socket | 0x3A | Product type |
0x08 | Server IP address of the C&C socket | 0x3C | 0x01 if the process is running as WOW64 |
0x0C | RAM in KB | 0x40 | System time – year |
0x10 | CPU clock rate in MHz | 0x42 | System time – month |
0x14 | Display width in pixels | 0x44 | Timestamp of first run (offset) |
0x18 | Display height in pixels | 0x46 | Service pack version string (offset) |
0x1C | Default locale | 0x48 | Unknown |
0x20 | Current tick count | 0x4A | Username (offset) |
0x24 | OS major version | 0x4C | Computer name (offset) |
0x28 | OS minor version | 0x4E | Mutex name (offset) |
0x2C | OS build number | 0x50 | Unknown |
0x30 | OS platform ID | 0x52 | List of machine IP addresses (offset) |
0x34 | Service pack major version | 0x54 | Always two 0x00 bytes |
0x36 | Service pack minor version |
El grupo 0x1002 contiene comandos que brindan funcionalidad de RAT, como se detalla en la Tabla 5. Algunos de estos toman parámetros proporcionados en el cuerpo del mensaje del comando. El comando FindFiles se describe con más detalle a continuación. Nuevamente, tenga en cuenta que no hay nombres de comando presentes en el RAT; fueron tomados de análisis previos o proporcionados por nosotros.
Tabla 5. Comandos en el grupo 0x1002
ID | Name | Description | Data in C&C request | Data in client response |
---|---|---|---|---|
0x1002 | Ping | Sent by the client when it starts listening for commands from this group. | N/A | None |
0x3000 | ListDrives | List all mapped drives (A: to Z:) and their properties.
All 26 entries are sent back in one message body. Drives that aren’t present have all fields set to 0x00. |
None | · Drive type · Total size · Space available to user · Free space · Volume name (offset) · File system name (offset) |
0x3001 | ListDirectory | List the contents of the specified directory. The client sends one response message per entry. | Directory path | · Is a directory? · File attributes · File size · Creation time · Last write time · Filename (offset) · 8.3 filename (offset) |
0x3002 | Sent by the client when it has finished executing the ListDirectory command. | N/A | None | |
0x3004 | ReadFile | Read a file in chunks of 0x4000 bytes. | · Creation time · Last access time · Last write time · Has offset · Offset in file · File size · File path |
|
0x10003005 | Chunk of read file data. | N/A | Read data | |
0x10003006 | Sent by the client when it has finished executing the ReadFile command. | N/A | None | |
0x3007 | WriteFile | Write to a file and restore previous timestamp.
Creates parent directories if they don’t exist. |
· Creation time · Last access time · Last write time · Has offset · Offset in file · File path (offset) |
None |
0x10003008 | Sent by the server with data to write to the file. | Data to write | N/A | |
0x10003009 | Sent by the server when the WriteFile operation is complete. | None | N/A | |
0x300A | CreateDirectory | Create a directory. | Directory path | None |
0x300B | CanReadFile | Try to open a file with read permissions. | File path | None |
0x300C | DesktopExecute | Execute a command on a hidden desktop. | Command line to execute | PROCESS_INFORMATION structure for the created process. |
0x300D | FileOperation | Perform a file operation using SHFileOperation. | · wFunc · fFlags · pFrom (offset) · pTo (offset) |
None |
0x300E | GetEnvValue | Get the value of an environment variable. | Environment variable | Environment variable value. |
0x300F | CreateProgramDataDir | Creates the directory %SYSTEM%ProgramData, optionally with a subdirectory. | Subdirectory relative path (optional) | None |
0x3102 | FindFiles | Recursively search a directory for files matching a given pattern. | · Starting directory · Search pattern |
See response body format in Table 6. |
0x7002 | RemoteShell | Start an interactive remote cmd.exe session. | None | None |
0x7003 | Result of the last command run. | N/A | Command output |
Comando FindFiles
A partir del directorio proporcionado, este comando busca archivos cuyos nombres coincidan con el patrón dado. Este patrón admite los mismos caracteres comodín que la API FindFirstFile de Windows. Para cada archivo coincidente, el cliente envía un mensaje de respuesta con su cuerpo en el formato descrito en la Tabla 6.
Tabla 6. Formato del cuerpo de la respuesta para el comando FindFiles
Offset | Value | Offset | Value |
---|---|---|---|
0x00 | File attributes | 0x24 | Folder path (offset) |
0x04 | File size in bytes | 0x26 | Filename (offset) |
0x0C | Creation time | 0x28 | 8.3 filename (offset) |
0x1C | Last write time |
Se envía un mensaje de respuesta con un cuerpo vacío una vez que se completa la búsqueda.
Conclusión
Los señuelos utilizados en esta campaña muestran una vez más lo rápido que Mustang Panda es capaz de reaccionar ante los acontecimientos mundiales. Por ejemplo, un reglamento de la UE sobre el COVID-19 se usó como señuelo solo dos semanas después de su publicación, y los documentos sobre la guerra en Ucrania comenzaron a usarse en los días posteriores al inicio de la invasión. Este grupo también demuestra la capacidad de mejorar iterativamente sus herramientas, incluido su uso característico del tridente de downloaders para desplegar Korplug.
El equipo de ESET Research ahora también ofrece reportes privados de inteligencia de APT y feeds de datos. Por cualquier consulta acerca de este servicio, visite la página ESET Threat Intelligence .
Indicadores de Compromiso
SHA-1 | Filename | ESET detection name | Description |
---|---|---|---|
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
10AE4784D0FFBC9CD5FD85B150830AEA3334A1DE | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
69AB6B9906F8DCE03B43BEBB7A07189A69DC507B | coreclr.dll | Win32/Agent.ADMW | Korplug loader. |
4EBFC035179CD72D323F0AB357537C094A276E6D | PowerDVD18.exe | Win32/Delf.UTN | Korplug loader. |
FDBB16B8BA7724659BAB5B2E1385CFD476F10607 | N/A | Win32/Korplug.TB | Decrypted Korplug (dumped from memory). |
7E059258CF963B95BDE479D1C374A4C300624986 | N/A | Win32/Korplug.TC | Decrypted Korplug (dumped from memory). |
7992729769760ECAB37F2AA32DE4E61E77828547 | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
F05E89D031D051159778A79D81685B62AFF4E3F9 | SymHp.exe | Win32/Delf.UTN | Korplug loader. |
AB01E099872A094DC779890171A11764DE8B4360 | BoomerangLib.dll | Win32/Korplug.TH | Korplug loader. |
CDB15B1ED97985D944F883AF05483990E02A49F7 | PotPlayer.dll | Win32/Agent.ADYO | Korplug loader. |
908F55D21CCC2E14D4FF65A7A38E26593A0D9A70 | SmadHook32.dll | Win32/Agent.ADMW | Korplug loader. |
477A1CE31353E8C26A8F4E02C1D378295B302C9E | N/A | Win32/Agent.ADMW | Korplug loader. |
52288C2CDB5926ECC970B2166943C9D4453F5E92 | SmadHook32c.dll | Win32/Agent.ADMW | Korplug loader. |
CBD875EE456C84F9E87EC392750D69A75FB6B23A | SHELLSEL.ocx | Win32/Agent.ADMW | Korplug loader. |
2CF4BAFE062D38FAF4772A7D1067B80339C2CE82 | Adobe_Caps.dll | Win32/Agent.ADMW | Korplug loader. |
97C92ADD7145CF9386ABD5527A8BCD6FABF9A148 | DocConvDll.dll | Win32/Agent.ADYO | Korplug loader. |
39863CECA1B0F54F5C063B3015B776CDB05971F3 | N/A | Win32/Korplug.TD | Decrypted Korplug (dumped from memory). |
0D5348B5C9A66C743615E819AEF152FB5B0DAB97 | FontEDL.exe | clean | Vulnerable legitimate Font File Generator executable. |
C8F5825499315EAF4B5046FF79AC9553E71AD1C0 | Silverlight.Configuration.exe | clean | Vulnerable legitimate Microsoft Silverlight Configuration Utility executable. |
D4FFE4A4F2BD2C19FF26139800C18339087E39CD | PowerDVDLP.exe | clean | Vulnerable legitimate PowerDVD executable. |
65898ACA030DCEFDA7C970D3A311E8EA7FFC844A | Symantec.exe | clean | Vulnerable legitimate Symantec AntiVirus executable. |
7DDB61872830F4A0E6BF96FAF665337D01F164FC | Adobe Stock Photos CS3.exe | clean | Vulnerable legitimate Adobe Stock Photos executable. |
C13D0D669365DFAFF9C472E615A611E058EBF596 | COVID-19 travel restrictions EU reviews list of third countries.exe | Win32/Agent_AGen.NJ | Downloader. |
062473912692F7A3FAB8485101D4FCF6D704ED23 | REGULATION OF THE EUROPEAN PARLIAMENT AND OF THE COUNCIL.exe | Win32/TrojanDownloader.Agent.GDL | Downloader. |
2B5D6BB5188895DA4928DD310C7C897F51AAA050 | log.dll | Win32/Agent.ACYW | Korplug loader. |
511DA645A7282FB84FF18C33398E67D7661FD663 | 2.exe | Win32/Agent.ADPL | Korplug loader. |
59002E1A58065D7248CD9D7DD62C3F865813EEE6 | log.dll | Win32/Agent.ADXE | Korplug loader. |
F67C553678B7857D1BBC488040EA90E6C52946B3 | KINGSTON.exe | Win32/Agent.ADXZ | Korplug Loader. |
58B6B5FD3F2BFD182622F547A93222A4AFDF4E76 | PotPlayer.exe | clean | Vulnerable legitimate executable. |
Red
Domain | IP | First seen | Notes |
---|---|---|---|
103.56.53[.]120 | 2021‑06‑15 | Korplug C&C | |
154.204.27[.]181 | 2020‑10‑05 | Korplug C&C. | |
43.254.218[.]42 | 2021‑02‑09 | Download server. | |
45.131.179[.]179 | 2020‑10‑05 | Korplug C&C. | |
176.113.69[.]91 | 2021-04-19 | Korplug C&C. | |
upespr[.]com | 45.154.14[.]235 | 2022-01-17 | Download server. |
urmsec[.]com | 156.226.173[.]23 | 2022‑02‑23 | Download server. |
101.36.125[.]203 | 2021-06-01 | Korplug C&C. | |
185.207.153[.]208 | 2022‑02‑03 | Download server. | |
154.204.27[.]130 | 2021-12-14 | Korplug C&C. | |
92.118.188[.]78 | 2022-01-27 | Korplug C&C. | |
zyber-i[.]com | 107.178.71[.]211 | 2022-03-01 | Download server. |
locvnpt[.]com | 103.79.120[.]66 | 2021-05-21 | Download server. This domain was previously used in a 2020 campaign documented by Recorded Future. |
Técnicas de MITRE ATT&CK
Esta tabla fue creada utilizando la versión 10 del framework de MITRE ATT&CK.
Tactic | ID | Name | Description |
---|---|---|---|
Resource Development | T1583.001 | Acquire Infrastructure: Domains | Mustang Panda has registered domains for use as download servers. |
T1583.003 | Acquire Infrastructure: Virtual Private Server | Some download servers used by Mustang Panda appear to be on shared hosting. | |
T1583.004 | Acquire Infrastructure: Server | Mustang Panda uses servers that appear to be exclusive to the group. | |
T1587.001 | Develop Capabilities: Malware | Mustang Panda has developed custom loader and Korplug versions. | |
T1588.006 | Obtain Capabilities: Vulnerabilities | Multiple DLL hijacking vulnerabilities are used in the deployment process. | |
T1608.001 | Stage Capabilities: Upload Malware | Malicious payloads are hosted on the download servers. | |
Execution | T1059.003 | Command and Scripting Interpreter: Windows Command Shell | Windows command shell is used to execute commands sent by the C&C server. |
T1106 | Native API | Mustang Panda uses CreateProcess and ShellExecute for execution. | |
T1129 | Shared Modules | Mustang Panda uses LoadLibrary to load additional DLLs at runtime. The loader and RAT are DLLs. | |
T1204.002 | User Execution: Malicious File | Mustang Panda relies on the user executing the initial downloader. | |
T1574.002 | Hijack Execution Flow: DLL Side-Loading | The downloader obtains and launches a vulnerable application so it loads and executes the malicious DLL that contains the second stage. | |
Persistence | T1547.001 | Boot or Logon Autostart Execution: Registry Run Keys / Startup Folder | Korplug can persist via registry Run keys. |
T1053.005 | Scheduled Task/Job: Scheduled Task | Korplug can persist by creating a scheduled task that runs on startup. | |
Defense Evasion | T1140 | Deobfuscate/Decode Files or Information | The Korplug file is encrypted and only decrypted at runtime, and its configuration data is encrypted with XOR. |
T1564.001 | Hide Artifacts: Hidden Files and Directories | Directories created during the installation process are set as hidden system directories. | |
T1564.003 | Hide Artifacts: Hidden Window | Korplug can run commands on a hidden desktop. Multiple hidden windows are used during the deployment process. | |
T1070 | Indicator Removal on Host | Korplug’s uninstall command deletes registry keys that store data and provide persistence. | |
T1070.004 | Indicator Removal on Host: File Deletion | Korplug can remove itself and all created directories. | |
T1070.006 | Indicator Removal on Host: Timestomp | When writing to a file, Korplug sets the file’s timestamps to their previous values. | |
T1036.004 | Masquerading: Masquerade Task or Service | Scheduled tasks created for persistence use legitimate-looking names. | |
T1036.005 | Masquerading: Match Legitimate Name or Location | File and directory names match expected values for the legitimate app that is abused by the loader. | |
T1112 | Modify Registry | Korplug can create, modify, and remove registry keys. | |
T1027 | Obfuscated Files or Information | Some downloaded files are encrypted and stored as hexadecimal strings. | |
T1027.005 | Obfuscated Files or Information: Indicator Removal from Tools | Imports are hidden by dynamic resolution of API function names. | |
T1055.001 | Process Injection: Dynamic-link Library Injection | Some versions of the Korplug loader inject the Korplug DLL into a newly launched process. | |
T1620 | Reflective Code Loading | Korplug parses and loads itself into memory. | |
Discovery | T1083 | File and Directory Discovery | Korplug can list files and directories along with their attributes and content. |
T1082 | System Information Discovery | Korplug collects extensive information about the system including uptime, Windows version, CPU clock rate, amount of RAM and display resolution. | |
T1614 | System Location Discovery | Korplug retrieves the system locale using GetSystemDefaultLCID. | |
T1016 | System Network Configuration Discovery | Korplug collects the system hostname and IP addresses. | |
T1016.001 | System Network Configuration Discovery: Internet Connection Discovery | The downloader pings Google’s DNS server to check internet connectivity. | |
T1033 | System Owner/User Discovery | Korplug obtains the current user’s username. | |
T1124 | System Time Discovery | Korplug uses GetSystemTime to retrieve the current system time. | |
Collection | T1005 | Data from Local System | Korplug collects extensive data about the system it’s running on. |
T1025 | Data from Removable Media | Korplug can collect metadata and content from all mapped drives. | |
T1039 | Data from Network Shared Drive | Korplug can collect metadata and content from all mapped drives. | |
Command and Control | T1071.001 | Application Layer Protocol: Web Protocols | Korplug can make the initial handshake over HTTPS. |
T1095 | Non-Application Layer Protocol | C&C communication is done over a custom TCP-based protocol. | |
T1573.001 | Encrypted Channel: Symmetric Cryptography | C&C communication is encrypted using RC4. | |
T1008 | Fallback Channels | The Korplug configuration contains fallback C&C servers. | |
T1105 | Ingress Tool Transfer | Korplug can download additional files from the C&C server. | |
T1571 | Non-Standard Port | When Hodur performs its initial handshake over HTTPS, it uses the same port (specified in the configuration) as for the rest of the communication. | |
T1132.001 | Data Encoding: Standard Encoding | Korplug compresses transferred data using LZNT1. | |
Exfiltration | T1041 | Exfiltration Over C2 Channel | Data exfiltration is done via the same custom protocol used to send and receive commands. |
Fuente info
Autor: Alexandre Côté Cyr