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.
Fluxo de Ataque
Detecções
A Possibilidade de Execução Através de Linhas de Comando PowerShell Ocultas (via cmdline)
Proof of Value
LOLBAS WScript / CScript (via process_creation)
Proof of Value
Chamar Métodos .NET Suspeitos do Powershell (via powershell)
Proof of Value
Possíveis Indicadores de Ofuscação do Powershell (via powershell)
Proof of Value
LOLBAS Conhost (via cmdline)
Proof of Value
IOCs (HashSha256) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Proof of Value
IOCs (SourceIP) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Proof of Value
IOCs (DestinationIP) para detectar: PureLogs: Entrega via Esteganografia PawsRunner
Proof of Value
Descriptografia AES do PowerShell a partir de Variáveis de Ambiente [Windows PowerShell]
Proof of Value
Detecção de Execução de Processo Malicioso via Conhost e PowerShell Ocultos [Criação de Processos do Windows]
Proof of Value
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.