~/notes/suspicious-hta-triage
Checklist de triagem para HTA suspeitoPassos básicos para identificar, registrar e desmontar um HTA malicioso sem executá-lo, a partir do caso LAB-0001.
Quando um arquivo .hta chega por um contato conhecido, o primeiro trabalho não é entender o payload final. É responder rápido: isso é executável, o que ele tenta esconder e como extrair o próximo estágio sem rodar nada no Windows.
Este checklist resume a rotina aplicada no caso LAB-0001, um HTA de 994.809 bytes que virou um dropper de propagação por WhatsApp Web. Todos os comandos e valores abaixo vêm desse caso.
1. Trate como hostil e confirme o tipo
Não abra no Windows. Comece com file:
$ file whats/A-8dd9b4be89d585d36.hta
whats/A-8dd9b4be89d585d36.hta: HTML document, ASCII text, with very long lines (2800)
No Windows, .hta roda via mshta.exe com acesso local a VBScript e JScript. Não é só uma página HTML, então trate como potencial loader.
2. Registre hash e tamanho
$ sha256sum whats/A-8dd9b4be89d585d36.hta
5a822a163d0787bcfd52b2ae3ace6cb6a92eb158a52b0fbe3cf0380acc2cb702 whats/A-8dd9b4be89d585d36.hta
$ wc -c whats/A-8dd9b4be89d585d36.hta
994809 whats/A-8dd9b4be89d585d36.hta
Hash e tamanho viram o identificador do caso. Qualquer deofuscação posterior precisa referenciar essa amostra exata.
3. Olhe o cabeçalho com xxd
$ xxd -g 1 -l 256 whats/A-8dd9b4be89d585d36.hta
No caso real, os primeiros bytes já mostravam <title>System Automation</title> e o bloco HTA:APPLICATION com APPLICATIONNAME="System Process". Se o nome do arquivo promete uma coisa e o título interno promete outra, anote a divergência.
4. Leia o comportamento de janela antes do código
O trecho que mais dizia sobre intenção era curto:
SHOWINTASKBAR="no"
WINDOWSTATE="minimize"
Sub Window_OnLoad
On Error Resume Next
Self.Close
End Sub
A leitura operacional: o arquivo tenta não deixar janela útil, some da taskbar, fecha a própria janela ao carregar e silencia erros. Para a vítima, o efeito esperado é “cliquei e nada abriu”. Para o atacante, o clique já entregou execução ao mshta.exe.
5. Mapeie a ofuscação por formato, não por conteúdo
No LAB-0001, as strings reais não apareciam em busca simples. Os formatos eram:
- arrays numéricos com subtração modular, como
(numero - 110 + 256) Mod 256 - expressões
Chr((a-b) Xor k)concatenadas - 554 blocos
Layerpara gerar volume artificial ExecuteGlobalno final, que monta o script real só em runtime
O ponto didático: deofuscar uma camada revelou outro VBScript, não o malware final. Campanhas desse tipo usam “decode, execute, decode de novo”.
6. Extraia sem executar
Duas opções seguras, ambas documentadas no caso:
- parser estático que interpreta o texto sem chamar
ExecuteGlobal - em VM isolada, trocar
ExecuteGlobal Xpor impressão do conteúdo deX
No caso, o parser recuperou 47.051 bytes de primeiro estágio, outro VBScript terminado de novo em ExecuteGlobal.
7. Reconstrua a cadeia dropper
Só depois da extração vale desenhar o fluxo completo. No LAB-0001:
HTA
-> VBScript decodificado
-> segundo VBScript decodificado
-> C:\temp\instalar.bat
-> MSI remoto + Python embutido
-> whats.py / whatsz.py
-> automação do WhatsApp Web
Os sinais que sustentam essa leitura estão no caso completo: msiexec /qn, pythonw.exe sem console e o domínio centrogauchodabahia123.com. A análise integral, com indicadores e impacto, está em LAB-0001.