OysterLoader Revelado: Dentro de um Carregador de Evasão em Múltiplos Estágios
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
OysterLoader é um carregador de múltiplas etapas em C++ usado para implantar ransomware e malwares comuns como o Vidar. Ele se espalha por meio de sites comprometidos que imitam instaladores de software legítimos e é entregue como um Instalador da Microsoft (MSI). Para complicar a análise, ele usa inundação de chamadas de API, resolução dinâmica de API personalizada, verificações anti-debug e uma rotina de descompressão LZMA personalizada. O carregador se comunica com uma infraestrutura C2 HTTPS em camadas usando cabeçalhos HTTP ofuscados e uma codificação proprietária semelhante ao Base64.
Investigação
O relatório descreve quatro etapas: um ofuscador compactado (TextShell), uma camada de shellcode que infla o conteúdo com LZMA, um downloader que realiza verificações de ambiente e cria um mutex, e uma etapa final que solta uma DLL e instala uma tarefa agendada. O tráfego C2 depende de IPs/domínios codificados, agentes-usuário personalizados e entrega esteganográfica de payload por meio de ícones PNG. A persistência é mantida por uma tarefa agendada configurada para ser executada a cada 13 minutos.
Mitigação
Bloqueie instaladores MSI não assinados de fontes não confiáveis e monitore a criação de padrões de mutex conhecidos. Alerta sobre padrões de nomes de tarefa agendada e o uso de rundll32.exe para carregar DLLs de %APPDATA%. Quando viável, aplique inspeção TLS para identificar os cabeçalhos HTTP personalizados e agentes-usuário usados pelo carregador.
Resposta
Se detectado, isole o host, termine a tarefa agendada e remova o arquivo COPYING3.dll descartado. Caçar por cargas adicionais, enumerar processos que correspondam aos valores de mutex, bloquear os domínios/IPs de C2 listados e atualizar as detecções para o comportamento de inundação de API e a codificação Base64 personalizada.
Fluxo de Ataque
Detecções
Schtasks Aponta para Diretório / Binário / Script Suspeito (via cmdline)
Ver
Execução de Caminho Suspeito de Rundll32 DLL (via criação de processo)
Ver
IOCs (SourceIP) para detectar: OysterLoader Desmascarado: O Carregador de Evasão de Múltiplas Etapas
Ver
IOCs (DestinationIP) para detectar: OysterLoader Desmascarado: O Carregador de Evasão de Múltiplas Etapas
Ver
Detecção de Comunicação C2 do OysterLoader [Conexão de Rede do Windows]
Ver
Detecção de Técnicas de Anti-análise e Execução do OysterLoader [Criação de Processos do Windows]
Ver
Execução de Simulação
Pré-requisito: A Verificação Prévia de Telemetria & Linha de Base deve ter passado.
Justificativa: Esta seção detalha a execução precisa da técnica do adversário (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. Exemplos abstratos ou não relacionados levarão a diagnósticos incorretos.
-
Narrativa & Comandos do Ataque:
O adversário, tendo ganho uma posição inicial no endpoint, implanta a payload do OysterLoader.- Registro de DLL via Rundll32 – O carregador copia uma DLL maliciosa (
COPYING3.dll) no diretório temporário e a registra usandorundll32.execom oDllRegisterServerponto de entrada, produzindo uma linha de comando que corresponde aseleção1. - Verificação Anti-Debug – Para evadir a análise, a payload carrega
ntdll.dlle chamaIsDebuggerPresent. Isso gera um registro de processo ondeImagemcontémntdll.dlle a linha de comando incluiIsDebuggerPresent, satisfazendoseleção2. - Alocação de Memória – Para execução na memória, o carregador invoca
NtAllocateVirtualMemoryviantdll.dll. O evento resultante de criação de processo contémNtAllocateVirtualMemoryna linha de comando, satisfazendoseleção3.
- Registro de DLL via Rundll32 – O carregador copia uma DLL maliciosa (
-
Script de Teste de Regressão:
# Script de validação de detecção do OysterLoader – PowerShell # ---------------------------------------------------- # 1. Criar uma DLL maliciosa de teste (arquivo vazio para simulação) $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. Acionar seleção1 – rundll32 com DllRegisterServer Write-Host "Executando seleção1 (registro DLL com rundll32)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. Acionar seleção2 – ntdll com IsDebuggerPresent Write-Host "Executando seleção2 (IsDebuggerPresent)..." $scriptBlock = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern bool IsDebuggerPresent(); "@ -Namespace WinAPI -Name NativeMethods [WinAPI.NativeMethods]::IsDebuggerPresent() | Out-Null } Start-Job -ScriptBlock $scriptBlock | Wait-Job | Receive-Job # 4. Acionar seleção3 – ntdll com NtAllocateVirtualMemory Write-Host "Executando seleção3 (NtAllocateVirtualMemory)..." $scriptBlock2 = { Add-Type -MemberDefinition @" [DllImport("ntdll.dll", SetLastError = true)] public static extern int NtAllocateVirtualMemory( IntPtr ProcessHandle, ref IntPtr BaseAddress, IntPtr ZeroBits, ref UIntPtr RegionSize, uint AllocationType, uint Protect); "@ -Namespace WinAPI -Name NativeMethods $process = [System.Diagnostics.Process]::GetCurrentProcess() $handle = $process.Handle $base = [IntPtr]::Zero $size = [UIntPtr]::Zero [WinAPI.NativeMethods]::NtAllocateVirtualMemory($handle, [ref]$base, [IntPtr]::Zero, [ref]$size, 0x1000, 0x04) | Out-Null } Start-Job -ScriptBlock $scriptBlock2 | Wait-Job | Receive-Job # Limpeza Remove-Item -Path $dllPath -Force Write-Host "Simulação concluída." -
Comandos de Limpeza:
# Garantir que quaisquer processos remanescentes de rundll32 ou tarefas sejam terminados Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # Excluir DLL temporária se ainda presente $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }