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.

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.

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.

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.

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.

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.

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.

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.

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.

La Figura 10 muestra la información del paquete.

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.

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.

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.

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 |
9784A1483B4586EB12D8 |
minibrowser_shell |
Win32/Agent.AGNF | Downloader component. |
4DB38A097AE4D5E70B2F |
Client.exe | MSIL/Agent.DMS | WizardNet backdoor. |
76953E949AC54BE8FF3A |
ipv6.exe | Win64/Agent.CAZ | Spellbinder tool (2022). |
DA867188937698C77698 |
N/A | Win64/Agent.CAZ | Spellbinder tool (2023), loaded in memory. |
0CBA19B19DF9E2C5EBE5 |
wsc.dll | Win64/Agent.EUO | Loads shellcode from log.dat. |
1A8147050AF6F05DEA5F |
log.dat | Win32/Rozena.BXT | Shellcode that loads Spellbinder. |
2D376ADF44DBD9CF5DB0 |
plugin-audiofirstpiece.ml | Android/Spy.Agent.EEF | ZIP archive containing DarkNights for Android. |
5B70A853D8E989AD102D |
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. |