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.
graph TB %% Definições de Classe classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Nós initial_access[“<b>Acesso Inicial</b> – <b>T1218.007 Execução por Proxy de Binário do Sistema: Msiexec</b><br/>MSI malicioso assinado entregue via site comprometido.”] class initial_access action process_msiexec[“<b>Processo</b> – msiexec.exe<br/>Executa MSI malicioso”] class process_msiexec process stage1[“<b>Estágio 1</b> – Empacotador/Ofuscador<br/><b>Técnicas</b>: T1027 Arquivos ou Informações Ofuscadas, T1027.007 Resolução Dinâmica de API, T1614.001 Descoberta do Idioma do Sistema, T1480.002 Barreiras de Execução: Exclusão Mútua, T1497.002 Evasão de Virtualização/Sandbox: Verificações Baseadas em Atividade do Usuário”] class stage1 malware stage2[“<b>Estágio 2</b> – Shellcode<br/><b>Técnicas</b>: T1140 Desofuscar/Decodificar Arquivos (RC4), descompressão LZMA”] class stage2 malware stage3[“<b>Estágio 3</b> – Downloader & C2<br/><b>Técnicas</b>: T1102 Serviço Web, T1001.003 Personificação de Protocolo ou Serviço, T1001.002 Esteganografia, T1102.001 Dead Drop Resolver”] class stage3 malware c2_server[“<b>C2</b> – Servidor HTTPS<br/>Cabeçalhos personalizados e User-Agent falso”] class c2_server c2 dll_payload[“<b>Malware</b> – DLL Descarregado<br/>Armazenado em %APPDATA%”] class dll_payload malware process_rundll32[“<b>Processo</b> – rundll32.exe<br/>Executa DLL via DllRegisterServer”] class process_rundll32 process task_schtasks[“<b>Persistência</b> – Tarefa Agendada<br/>Executa rundll32 com a DLL descarregada”] class task_schtasks persistence stage4[“<b>Estágio 4</b> – Persistência & Execução<br/><b>Técnicas</b>: T1546.009 Execução Disparada por Evento: DLLs AppCert, T1027.003 Esteganografia, T1102.002 Comunicação Bidirecional”] class stage4 malware %% Conexões initial_access –>|executa| process_msiexec process_msiexec –>|entrega| stage1 stage1 –>|gera| stage2 stage2 –>|baixa| stage3 stage3 –>|comunica com| c2_server c2_server –>|fornece payload para| stage3 stage3 –>|grava DLL em| dll_payload dll_payload –>|usado por| process_rundll32 process_rundll32 –>|acionado por| task_schtasks task_schtasks –>|agendado a partir de| stage4
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 }