PureLogs Entregue Através de Esteganografia do PawsRunner
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
A campanha depende de um e-mail de phishing contendo um arquivo TXZ que entrega um carregador JavaScript, que define variáveis de ambiente e inicia conhost.exe em modo sem cabeça. O carregador então descriptografa uma montagem .NET conhecida como PawsRunner, que recupera imagens PNG contendo conteúdo criptografado oculto através de técnicas de esteganografia. Dessas imagens, o malware extrai a carga final: o infostealer PureLogs .NET. Uma vez ativo, o PureLogs conecta-se a um servidor remoto de comando e controle sobre HTTPS e exfiltra credenciais do navegador junto com informações do sistema.
Investigação
Análises mostraram que o carregador JavaScript obtém comandos de variáveis de ambiente de processo, inicia o PowerShell com uma janela oculta, e descriptografa uma carga criptografada com AES que é executada através de reflexão .NET. PawsRunner alterna entre três APIs de rede e três diferentes strings de agente de usuário enquanto busca arquivos PNG, então analisa iTXt and IEND blocos para localizar os dados ocultos e descriptografa a próxima fase com RC4. O PureLogs, por sua vez, usa TripleDES e Gzip para carregar uma DLL de downloader, faz solicitações HTTP protegidas por TLS para endpoints específicos e coleta um amplo conjunto de dados relacionados ao navegador do sistema da vítima.
Mitigação
Organizações devem bloquear anexos TXZ no gateway de e-mail, monitorar e conhost.exe instâncias rodando sem uma janela visível, e detectar PowerShell iniciado com a -w hidden flag. As equipes de segurança também devem implantar assinaturas para PawsRunner e PureLogs, restringir o tráfego de saída para o domínio e endereço IP de comando e controle identificados, e limitar a execução de montagens .NET não assinadas. Sempre que possível, a detecção de esteganografia deve ser aplicada a arquivos de imagem suspeitos de entrada.
Resposta
Se esta atividade for detectada, isole o endpoint afetado, termine processos suspeitos conhost.exe e PowerShell, e remova quaisquer binários .NET baixados do sistema. Credenciais comprometidas devem ser revogadas, a autenticação multifator implementada, e as senhas armazenadas no navegador redefinidas. Os investigadores também devem realizar análises forenses de rede para confirmar que nenhuma comunicação adicional de comando e controle ocorreu e aplicar etapas de remediação para evitar reinfecção.
"graph TB %% Class Definitions classDef action fill:#99ccff classDef tool fill:#cccccc classDef process fill:#ffdd99 classDef malware fill:#ff9999 %% Nodes initial_phishing["<b>Ação</b> – <b>T1566.001 Anexo de Spearphishing</b><br/>O atacante envia um e-mail de phishing com um anexo de arquivo TXZ que contém a carga maliciosa."] class initial_phishing action malicious_archive["<b>Malware</b> – <b>Nome</b>: Arquivo TXZ Malicioso<br/><b>Descrição</b>: Arquivo usado para entregar a carga inicial de JavaScript."] class malicious_archive malware user_execution["<b>Ação</b> – <b>T1204.004 Execução do Usuário</b><br/>A vítima extrai o arquivo, o JavaScript executa o PowerShell em modo oculto e lê comandos das variáveis de ambiente."] class user_execution action powershell_loader["<b>Processo</b> – <b>Nome</b>: Carregador PowerShell<br/><b>Descrição</b>: Executa a montagem .NET descriptografada via reflexão sem gravar no disco."] class powershell_loader process defense_compile["<b>Ação</b> – <b>T1027.004 Compilar Após Entrega</b><br/>A montagem .NET descriptografada é carregada na memória via reflexão."] class defense_compile action defense_compress["<b>Ação</b> – <b>T1027.015 Compressão</b><br/>A carga é descriptografada com AES‑256 e, em seguida, descomprimida usando Gzip."] class defense_compress action defense_stego["<b>Ação</b> – <b>T1027.003 Esteganografia</b><br/>O carregador baixa imagens PNG e extrai dados criptografados ocultos de blocos iTXt/IEND."] class defense_stego action masquerade_icon["<b>Ação</b> – <b>T1036.008 Mascaramento</b><br/>O binário usa imagens de gatos como seu ícone de aplicativo para parecer benigno."] class masquerade_icon action c2_encrypted["<b>Ação</b> – <b>T1573 Canal Criptografado</b><br/>Mais comunicação C2 ocorre sobre HTTPS com cargas criptografadas com AES‑256."] class c2_encrypted action credential_access["<b>Ação</b> – <b>T1555.003 Credenciais de Navegadores da Web</b><br/>PureLogs enumera navegadores e extrai senhas, cookies e arquivos de cripto-carteiras salvos."] class credential_access action purelogs_tool["<b>Ferramenta</b> – <b>Nome</b>: PureLogs<br/><b>Descrição</b>: Utilitário de dump de credenciais que coleta dados de navegadores."] class purelogs_tool tool collection_archive["<b>Ação</b> – <b>T1560.003 Arquivar Dados Coletados</b><br/>Os dados coletados são comprimidos com Gzip e criptografados com AES antes da exfiltração."] class collection_archive action exfiltration_http["<b>Ação</b> – <b>T1048.003 Exfiltração Sobre Protocolo Não C2 Descriptografado</b><br/>Os dados são enviados via requisições HTTP POST para múltiplos endpoints externos."] class exfiltration_http action %% Connections initial_phishing –>|entrega| malicious_archive malicious_archive –>|aciona| user_execution user_execution –>|executa| powershell_loader powershell_loader –>|realiza| defense_compile defense_compile –>|usa| defense_compress defense_compress –>|usa| defense_stego defense_stego –>|permite| masquerade_icon masquerade_icon –>|estabelece| c2_encrypted c2_encrypted –>|permite| credential_access credential_access –>|usa| purelogs_tool credential_access –>|coleta| collection_archive collection_archive –>|exfiltra via| exfiltration_http %% Class Assignments class initial_phishing action class malicious_archive malware class user_execution action class powershell_loader process class defense_compile action class defense_compress action class defense_stego action class masquerade_icon action class c2_encrypted action class credential_access action class purelogs_tool tool class collection_archive action class exfiltration_http action "
Fluxo de Ataque
Detecções
A Possibilidade de Execução Através de Linhas de Comando PowerShell Ocultas (via cmdline)
Ver
LOLBAS WScript / CScript (via process_creation)
Ver
Chamar Métodos .NET Suspeitos do Powershell (via powershell)
Ver
Possíveis Indicadores de Ofuscação do Powershell (via powershell)
Ver
LOLBAS Conhost (via cmdline)
Ver
IOCs (HashSha256) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Ver
IOCs (SourceIP) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Ver
IOCs (DestinationIP) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Ver
Descriptografia AES do PowerShell a partir de Variáveis de Ambiente [Windows PowerShell]
Ver
Detecção de Execução de Processo Malicioso via Conhost e PowerShell Ocultos [Criação de Processos do Windows]
Ver
Execução de Simulação
Pré-requisito: O Check de Pré-voo de Telemetria & Base deve ter passado.
-
Narrativa e Comandos de Ataque
- Etapa 1 – Preparar a carga criptografada
- O atacante cria uma pequena carga de demonstração (
"segredo"), criptografa com AES-256 usando uma chave conhecida, codifica em Base64, e armazena em uma variável de ambienteENC_PAYLOAD.
- O atacante cria uma pequena carga de demonstração (
- Etapa 2 – Executar o carregador de descriptografia do PowerShell
- Um único comando lê
ENC_PAYLOAD, decodifica a string Base64, constrói um .NETAesCryptoServiceProvider, deriva a chave/IV, descriptografa os dados e, opcionalmente, executa o texto sem formatação.
- Um único comando lê
- Etapa 3 – Gerar telemetria de detecção
- O comando PowerShell inclui a palavra literal “AES” (por exemplo,
New-Object System.Security.Cryptography.AesCryptoServiceProvider) e é registrado como EventID 4104, satisfazendo a regra de detecção.
- O comando PowerShell inclui a palavra literal “AES” (por exemplo,
- Etapa 1 – Preparar a carga criptografada
-
Script de Teste de Regressão
# ------------------------------------------------- # Simulação de Descriptografia AES do PowerShell (Aciona a detecção) # ------------------------------------------------- # 1. Defina uma chave estática de 256 bits e IV (para propósitos de demonstração) $key = [byte[]](0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,0x10, 0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,0x20) $iv = [byte[]](0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,0xb0) # 2. Carga de texto sem formatação (exemplo) $plain = [System.Text.Encoding]::UTF8.GetBytes("dados secretos") # 3. Criptografar a carga usando AES (CBC, PKCS7) $aes = [System.Security.Cryptography.AesCryptoServiceProvider]::new() $aes.Key = $key $aes.IV = $iv $aes.Mode = [System.Security.Cryptography.CipherMode]::CBC $aes.Padding = [System.Security.Cryptography.PaddingMode]::PKCS7 $encryptor = $aes.CreateEncryptor() $cipherBytes = $encryptor.TransformFinalBlock($plain,0,$plain.Length) $cipherB64 = [Convert]::ToBase64String($cipherBytes) # 4. Armazenar texto cifrado em uma variável de ambiente # 5. Carregador de descriptografia – a linha exata que será registrada (contém "AES") $loader = @" `$enc = [System.Environment]::GetEnvironmentVariable('ENC_PAYLOAD') `$bytes = [Convert]::FromBase64String(`$enc) `$aes = New-Object System.Security.Cryptography.AesCryptoServiceProvider `$aes.Key = $($key -join ',') `$aes.IV = $($iv -join ',') `$decryptor = `$aes.CreateDecryptor() `$plain = `$decryptor.TransformFinalBlock(`$bytes,0,`$bytes.Length) `$result = [System.Text.Encoding]::UTF8.GetString(`$plain) Write-Output `"Descriptografado: `$result`" "@ # Execute o carregador (será capturado como EventID 4104) Invoke-Expression $loader -
Comandos de Limpeza
# Remover a variável de ambiente # Limpar quaisquer variáveis temporárias da sessão Remove-Variable -Name key,iv,plain,cipherBytes,cipherB64,loader -ErrorAction SilentlyContinue
Validação Pós-Simulação
- Execute a consulta de validação (exemplo de KQL acima) mas filtre para
"ScriptBlockText contains 'AES'"para confirmar que a detecção disparou. - Revise os detalhes do alerta no SIEM; verifique se o nome do alerta corresponde à regra (se definida) e se a severidade é reportada como Alta.
Considerações Finais
- A regra detecta com sucesso o cenário de uso direto de “AES”.
- Os adversários podem evitar dividindo a palavra (por exemplo,
"AE"+"S"), carregando a classe .NET via reflexão, ou realizando a descriptografia dentro de binários compilados. - Melhorar a regra com indicadores comportamentais (uso de variáveis de ambiente para texto cifrado, strings de alta entropia, criação de
AesCryptoServiceProviderobjetos, e subsequentesTransformFinalBlockchamadas) melhorará a resiliência a ofuscação simples.