En noviembre de 2019, descubrimos una nueva campaña del Grupo Winnti que apunta contra dos universidades de Hong Kong en la cual utilizan una nueva variante de ShadowPad, el backdoor insignia del grupo, que ha sido desplegado usando un nuevo launcher y embebiendo numerosos módulos. Asimismo, el malware Winnti también se encontró en estas universidades unas semanas antes de ShadowPad.
El Grupo Winnti, activo desde al menos 2012, es responsable por ir contra industrias como la de videojuegos y la de software llevando adelante la distribución de software troyanizado (como CCleaner, ASUS LiveUpdate y múltiples videojuegos) con la intención de comprometer a más víctimas. También es conocido por haber comprometido varios blancos en los sectores de la salud y la educación.
Los investigadores de ESET publicaron recientemente un white paper en el que actualizaron la información acerca del arsenal de herramientas que utiliza el Grupo Winnti, seguido por la publicación de un artículo en el cual se documenta un ataque de cadena de suministro dirigido a la industria de los videojuegos en Asia. Además, publicamos un artículo acerca de un nuevo backdoor llamado skip-2.0 que apunta a Servidores SQL de Microsoft.
Este artículo se centra en los detalles técnicos de esta nueva variante conocida como ShadowPad.
Sobre la denominación "Grupo Winnti":
Hemos elegido mantener el nombre "Grupo Winnti", ya que es el nombre que Kaspersky usó por primera vez para identificarlo en 2013. Como Winnti también es una familia de malware, siempre escribimos "Grupo Winnti" cuando nos referimos a los actores maliciosos detrás de los ataques. Desde 2013, se ha demostrado que Winnti es solo una de las muchas familias de malware utilizadas por el Grupo Winnti.
Se encontró a ShadowPad en varias universidades de Hong Kong
En noviembre de 2019, el motor de aprendizaje automático de ESET, Augur, detectó una muestra maliciosa y única presente en varias computadoras pertenecientes a dos universidades de Hong Kong donde ya se había encontrado el malware Winnti a fines de octubre. La muestra sospechosa detectada por Augur es en realidad un nuevo launcher de ShadowPad de 32 bits. Las muestras de ShadowPad y Winnti encontradas en estas universidades contienen identificadores de campaña y URLs de C&C que contienen los nombres de las universidades, lo que demuestra que se trata de un ataque dirigido.
Además de las dos universidades comprometidas, gracias al formato de URL de C&C utilizado por los atacantes, tenemos razones para pensar que al menos tres universidades adicionales de Hong Kong pueden haber sido comprometidas con estas mismas variantes de ShadowPad y Winnti.
Esta campaña del Grupo Winnti contra las universidades de Hong Kong se estaba llevando a cabo en el contexto de las protestas cívicas de Hong Kong que comenzaron en junio de 2019 desencadenadas por un proyecto de ley de extradición. A pesar de que el proyecto de ley fue retirado en septiembre de 2019, continuaron las protestas, en las cuales la gente demandaba una democracia plena e investigación de la policía de Hong Kong. Estas protestas reunieron a cientos de miles de personas en las calles con un gran apoyo de estudiantes de las universidades de Hong Kong, lo que llevó a múltiples ocupaciones del campus universitario por parte de los manifestantes.
Antes de adentrarnos en los detalles técnicos de la campaña, vale la pena mencionar que nos hemos puesto en contacto con las universidades comprometidas y les hemos proporcionado la información y asistencia necesarias para remediar el compromiso.
Launcher actualizado
A diferencia de las variantes anteriores de ShadowPad documentadas en nuestro white paper sobre el arsenal de herramientas del Grupo Winnti, este launcher no está ofuscado con VMProtect. Además, el payload cifrado no está embebido en la superposición (overlay) ni ubicado en un flujo de datos alternativo COM1:NULL.dat. Y el cifrado RC5 habitual con una clave derivada de la ID de volumen de la unidad del sistema de la máquina de la víctima (como se ve en el backdoor PortReuse, skip-2.0 y algunas variantes de ShadowPad) tampoco está presente. En este caso, el launcher es mucho más simple.
DLL de carga lateral
El launcher es una DLL de 32 bits llamada hpqhvsei.dll, que es el nombre de una DLL legítima cargada por hpqhvind.exe. Este ejecutable es de HP y generalmente se instala con su software de impresión y escaneo llamado "HP Digital Imaging". En este caso, los atacantes droppearon el hpqhvind.exe legítimo, junto con su hpqhvsei.dll malicioso, en C:\Windows\Temp.
Aunque no tenemos el componente que droppeo y ejecutó este launcher, la presencia de estos archivos nos lleva a pensar que la ejecución inicial de este launcher se realiza a través de la carga lateral de DLL.
Cuando la DLL maliciosa se carga en el inicio de hpqhvind.exe, su función DLLMain es llamada y comprobará el proceso padre para la siguiente secuencia de bytes en el desplazamiento 0x10BA:
85 C0 ; test eax, eax
0F 84 ; jz
En el caso de que el proceso padre sea hpqhvind.exe, y la DLL maliciosa proceda a parchear el proceso padre en la memoria. Reemplaza las instrucciones originales en 0x10BA con un salto incondicional (jmp – 0xE9) a la dirección de la función de hpqhvsei.dll que descifra y ejecuta el payload cifrado embebido en el launcher.
La función descompilada responsable de parchear el proceso padre se muestra en la Figura 1. En el caso de que hpqhvsei.dll se cargue mediante un proceso diferente al de hpqhvind.exe, el código malicioso no se descifrará ni ejecutará.
La diferencia entre el hpqhvind.exe original y el parcheado se muestra en la Figura 2.
La parte del código que es parcheada se encuentra al comienzo de la función principal de hpqhvind.exe. Como podemos ver en la Figura 2, el código parcheado se encuentra justo después de la carga de hpqhvsei.dll. Esto significa que la función responsable de descifrar y ejecutar el payload se ejecuta directamente después de la carga de la DLL maliciosa.
Descifrado del payload
El payload cifrado se encuentra en la sección .rdata de hpqhvsei.dll y el algoritmo de descifrado es un loop XOR donde la clave XOR se actualiza en cada iteración, como se muestra en la Figura 3.
El payload descifrado es el habitual shellcode responsable de la inicialización de ShadowPad (ofuscado usando saltos condicionales falsos para dificultar el desensamblado).
Persistencia
Después de haber sido descifrado, se ejecuta el shellcode de ShadowPad. Primero, logrará persistencia en el sistema al escribir el proceso padre parcheado en memoria en el disco en una ruta especificada en el pool del string de configuración. En el caso que examinamos, la ruta era C:\ProgramData\DRM\CLR\CLR.exe. Luego crea un servicio llamado clr_optimization_v4.0.30229_32, que es responsable de ejecutar CLR.exe. Para evitar sospechas, el nombre de este servicio, así como el nombre del ejecutable, se eligieron para que se parecieran al nombre de un Servicio de optimización de Microsoft .NET.
El proceso de presentación completo se resume en la Figura 4. La numeración en cada flecha corresponde a la secuencia cronológica de los eventos.
Módulos
ShadowPad es un backdoor multimodular en el que los módulos son referenciados desde el módulo Root con una lista circular de la cuál uno puede extraer la dirección del módulo, una marca de tiempo UNIX (probablemente embebida automáticamente durante el proceso de compilación del módulo) y un identificador de módulo. Del módulo en sí también podemos extraer el nombre que el desarrollador le dio al módulo. Esta versión incorpora los 17 módulos enumerados en la siguiente tabla:
Tabla 1. Módulos utilizados con esta versión de ShadowPad
ID | Name | Timestamp | Description |
---|---|---|---|
100 | Root | Thu 24 Oct 2019 12:08:27 PM UTC | Initial shellcode |
101 | Plugins | Thu 24 Oct 2019 12:07:02 PM UTC | Provides API for the other modules; loads modules |
102 | Config | Thu 24 Oct 2019 12:07:09 PM UTC | Handles encrypted configuration string pool |
103 | Install | Thu 24 Oct 2019 12:07:46 PM UTC | Achieves persistence |
104 | Online | Thu 24 Oct 2019 12:07:17 PM UTC | Overall communications with the C&C server |
106 | ImpUser | Thu 24 Oct 2019 12:07:24 PM UTC | User impersonation via token duplication |
200 | TCP | Thu 24 Oct 2019 12:01:01 PM UTC | TCP communications |
202 | HTTPS | Thu 24 Oct 2019 12:01:15 PM UTC | HTTPS communications |
207 | Pipe | Thu 24 Oct 2019 12:01:35 PM UTC | Handles named pipes |
300 | Disk | Thu 24 Oct 2019 12:02:29 PM UTC | File system operations |
301 | Process | Thu 24 Oct 2019 12:02:36 PM UTC | Process handling |
302 | Servcie | Thu 24 Oct 2019 12:02:45 PM UTC | Service handling |
303 | Register | Thu 24 Oct 2019 12:02:52 PM UTC | Registry operations |
304 | Shell | Thu 24 Oct 2019 12:03:00 PM UTC | Command line operations |
306 | Keylogger | Thu 24 Oct 2019 12:03:16 PM UTC | Keylogging to file system |
307 | Screen | Thu 24 Oct 2019 12:03:25 PM UTC | Screenshot capture |
317 | RecentFiles | Thu 24 Oct 2019 12:04:44 PM UTC | Lists recently accessed files |
Estos módulos, a excepción de RecentFiles, ya han sido mencionados por Kaspersky y Avast. Observe el error tipográfico en "Servcie".
Como de costumbre, todas las marcas de tiempo del módulo se distribuyen en un corto intervalo de tiempo, lo que podría sugerir el uso de un framework para compilar estos módulos. Esto también sugiere que estos módulos se construyeron unas horas antes que el launcher en sí, cuya marca de tiempo de compilación es Thu Oct 24 14:10:32 2019 (jueves 24 de octubre 14:10:32 2019). Dado que esta marca de tiempo de compilación corresponde a dos semanas antes de esta campaña, es probable que los atacantes no la hayan manipulado.
Nótese también que el número de módulos embebidos en esta variante es mucho mayor (17) que el número de módulos embebidos en las variantes previamente documentadas en nuestro white paper (8 a 10 módulos).
De manera predeterminada, cada pulsación de teclado es registrada utilizando el módulo Keylogger (306, previamente documentado por Avast) y se guarda en el disco en el archivo %APPDATA%\PAGM\OEY\XWWEYG\WAOUE.
El archivo de registro es cifrado utilizando el mismo algoritmo que se usa para cifrar strings estáticas del módulo. El uso de este módulo por defecto indica que los atacantes están interesados en robar información de las máquinas de las víctimas. Por el contrario, las variantes que describimos en nuestro white paper ni siquiera tenían ese módulo embebido.
Configuración
Al igual que con las variantes anteriores de ShadowPad, el módulo de configuración (102) contiene un pool de strings cifrado al que se puede acceder desde cualquier otro módulo. El pool de strings nunca se almacena completamente descifrado en la memoria; el campo de interés se descifra cuando es necesario y luego se libera inmediatamente (queda rápidamente no disponible). El tamaño de la configuración es de 2180 bytes y las cadenas cifradas se encuentran en la posición 0x84. El algoritmo utilizado para descifrar las cadenas es el mismo que el utilizado para descifrar las cadenas estáticas del módulo. El contenido descifrado del pool de strings es el siguiente:
0x84: 2019/11/7 16:28:36
0x99: CAMPAIGN_ID_REDACTED
0xa1: %ALLUSERSPROFILE%\DRM\CLR\CLR.exe
0xc5: clr_optimization_v4.0.30229_32
oxe6: clr_optimization_v4.0.30229_32
0x107: clr_optimization_v4.0.30229_32
0x128: SOFTWARE\Microsoft\Windows\CurrentVersion\Run
0x158: CLR
0x15e: %ProgramFiles%\Windows Media Player\wmplayer.exe
0x197: %windir%\system32\svchost.exe
0x1b7: TCP://b[redacted].dnslookup.services:443
0x1db: UDP://b[redacted].dnslookup.services:443
0x202: SOCKS4
0x21e: SOCKS5
El ID de la campaña se encuentra en el punto 0x99 y es el nombre de la universidad apuntada. Tener una ID de campaña relacionada con el blanco apuntado es bastante común en el caso de ShadowPad y Winnti.
Curiosamente, la marca de tiempo presente en esta configuración en el punto 0x84 es posterior a las marcas de tiempo de los módulos y la marca de tiempo de compilación del loader. Esto sugiere que esta configuración se agrega manualmente a la muestra después de haber sido construida. Aunque probablemente sea una coincidencia, la fecha dentro de la configuración corresponde a la fecha de la primera detección de esta muestra en la universidad correspondiente.
Comunicaciones de red
Una vez instalado en el sistema, ShadowPad inicia un proceso wmplayer.exe de Microsoft Windows Media Player oculto y suspendido y se inyecta en ese proceso. La ruta a wmplayer.exe la proporciona el módulo de configuración.
Una vez que ShadowPad se inyecta en wmplayer.exe, el módulo en línea se pondrá en contacto con el servidor de C&C utilizando la URL especificada en la configuración. Luego comenzará a escuchar las conexiones en el puerto 13567 después de haber actualizado las reglas del firewall en consecuencia:
Clave de registro::
HKLM\SYSTEM\ControlSet001\services\SharedAccess\Parameters\FirewallPolicy\FirewallRules\{816381AB-1400-45E5-B560-B8E11C5988CF}
Valor:
v2.10|Action=Allow|Active=TRUE|Dir=In|Protocol=6|Profile=Public|LPort=13567|Name=Network Discovery (TCP)|
La comunicación es manejada por el módulo TCP (200), que fue previamente documentado por Kaspersky.
El malware Winnti también estaba allí
Además de ShadowPad, el malware Winnti se encontró en algunas máquinas de estas dos universidades a fines de octubre (es decir, dos semanas antes de ShadowPad) en el archivo C:\Windows\System32\oci.dll y son detectados por los productos de ESET como Win64/Winnti.CA.
El malware Winnti generalmente contiene una configuración que especifica un ID de campaña y una URL de C&C. En todas las máquinas, el ID de la campaña coincide con el nombre de la universidad objetivo y las URL de C&C son:
- w[redacted].livehost.live:443
- w[redacted].dnslookup.services:443
El campo “redacteed” corresponde al nombre de la universidad objetivo.
Formato de la URL de C&C
Se puede observar que la URL de C&C utilizada tanto por Winnti como por ShadowPad cumple con el esquema [backdoor_type][target_name].domain.tld:443 donde [backdoor_type] es una sola letra que es "w" en el caso del malware Winnti o "b" en el caso de ShadowPad.
A partir de este formato, pudimos encontrar varias URL de C&C, incluidos tres nombres adicionales de universidades de Hong Kong. Los identificadores de campaña que se encuentran en las muestras que hemos analizado coinciden con la parte del subdominio del servidor de C&C, lo que muestra que estas muestras estaban realmente dirigidas a estas universidades.
Conclusión
El Grupo Winnti todavía está utilizando activamente ShadowPad, uno de sus backdoors insignia; esta vez contra las universidades de Hong Kong. En esta campaña, el launcher VMProtected utilizado con ShadowPad, así como con el backdoor PortReuse y skip-2.0, fue reemplazado por uno más simple. El hecho de que estas muestras, además de haber sido encontradas en estas universidades, contengan ID de campaña que coincidan con los nombres de las universidades y usen URL de C&C que contengan los nombres de las universidades, son buenos indicios de que estamos ante una campaña altamente dirigida.
Continuaremos monitoreando nuevas actividades del Grupo Winnti y publicaremos información relevante en nuestro blog. Para cualquier consulta, contáctenos a través del siguiente correo threatintel@eset.com.
Indicadores de Compromiso (IoCs)
Nombres de detección de ESET
Win32/Shadowpad.C trojan
Win64/Winnti.CA trojan
Nombres de archivos
%ALLUSERSPROFILE%\DRM\CLR\hpqhvsei.dll
%ALLUSERSPROFILE%\DRM\CLR\CLR.exe
C:\windows\temp\hpqhvsei.dll
C:\windows\temp\hpqhvind.exe
%ALLUSERSPROFILE%\DRM\CLR\hpqhvsei.dll
%SYSTEM32%\oci.dll
%APPDATA%\PAGM\OEY\XWWEYG\WAOUE
Nombre del servicio
clr_optimization_v4.0.30229_32
Servidores C&C
b[org_name].dnslookup[.]services:443
w[org_name].livehost[.]live:443
w[org_name].dnslookup[.]services:443
Launcher ShadowPad
Similar sample to avoid disclosing targeted universities.
693f0bd265e7a68b5b98f411ecf1cd3fed3c84af
Técnicas de MITRE ATT&CK
Tactic | ID | Name | Description |
---|---|---|---|
Persistence | T1050 | New Service | ShadowPad persists as a service called clr_optimization_v4.0.30229_32. |
Defense Evasion | T1073 | DLL Side-Loading | ShadowPad’s launcher is loaded by a legitimate executable via DLL side-loading. |
T1055 | Process Injection | ShadowPad is injected into a wmplayer.exe process. | |
T1140 | Deobfuscate/Decode Files or Information | ShadowPad launcher uses XOR to decrypt the payload. ShadowPad uses a custom algorithm to decrypt strings and configuration. | |
T1027 | Obfuscated Files or Information | ShadowPad shellcode is XOR-encoded and uses fake conditional jumps to hinder disassembly. ShadowPad’s strings and configuration are encrypted. It also uses API hashing. | |
T1143 | Hidden Window | ShadowPad is injected into a wmplayer.exe process started in a hidden window. | |
Discovery | T1010 | Application Window Discovery | ShadowPad’s keylogging module lists application windows. |
T1083 | File and Directory Discovery | ShadowPad’s RecentFiles module lists files recently accessed. | |
Command and Control | T1071 | Standard Application Layer Protocol | ShadowPad can use HTTP and HTTPS for C&C communications. |
T1043 | Commonly Used Port | ShadowPad uses TCP:443 and UDP:443. | |
T1065 | Uncommonly Used Port | ShadowPad listens on port 13567. | |
T1095 | Standard Non-Application Layer Protocol | ShadowPad can use UDP and TCP for C&C communications. | |
T1024 | Custom Cryptographic Protocol | ShadowPad uses its own cryptographic protocol for C&C communications. | |
Collection | T1056 | Input Capture | ShadowPad has a keylogging module. |
T1113 | Screen Capture | ShadowPad has a screenshot module. | |
Exfiltration | T1022 | Data Encrypted | Keystrokes recorded by the keylogging module are stored encrypted on disk. |