← cd ../

~/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 Layer para gerar volume artificial
  • ExecuteGlobal no 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 X por impressão do conteúdo de X

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.