OysterLoader Rivelato: Dentro un Loader di Evasione Multi-Fase
Detection stack
- AIDR
- Alert
- ETL
- Query
Riassunto
OysterLoader è un loader a più stadi in C++ utilizzato per distribuire ransomware e malware comuni come Vidar. Si diffonde attraverso siti compromessi che imitano installatori di software legittimi ed è distribuito come un Microsoft Installer (MSI). Per complicare l’analisi, utilizza sovraccarico di chiamate API, risoluzione dinamica di API personalizzate, controlli anti-debug e una routine di decompressione LZMA personalizzata. Il loader comunica con un’infrastruttura C2 tiered HTTPS utilizzando intestazioni HTTP offuscate e una codifica proprietaria simile a Base64.
Indagine
Il rapporto descrive quattro fasi: un offuscatore compattato (TextShell), un livello di shellcode che gonfia il contenuto con LZMA, un downloader che esegue controlli sull’ambiente e crea un mutex, e una fase finale che rilascia un DLL e installa un’attività pianificata. Il traffico C2 si basa su IP/domains hard-coded, user agents personalizzati e consegna di payload steganografici tramite icone PNG. La persistenza è mantenuta da un’attività pianificata configurata per eseguire ogni 13 minuti.
Mitigazione
Bloccare gli installer MSI non firmati provenienti da fonti non attendibili e monitorare la creazione di pattern di mutex noti. Allertare sui pattern di nomi di attività pianificate e sull’uso di rundll32.exe per caricare DLL da %APPDATA%. Dove possibile, imporre l’ispezione TLS per identificare le intestazioni HTTP personalizzate e gli user agents utilizzati dal loader.
Risposta
Se rilevato, isolare l’host, terminare l’attività pianificata e rimuovere il file COPYING3.dll rilasciato. Cacciare payload aggiuntivi, enumerare i processi che corrispondono ai valori di mutex, bloccare i domini/IP di C2 elencati e aggiornare le rilevazioni per il comportamento di sovraccarico API e la codifica Base64 personalizzata.
Flusso di Attacco
Rilevamenti
Schtasks Puntano a Directory / Binario / Script Sospetto (tramite cmdline)
Visualizza
Esecuzione Percorso Sospetto DLL con Rundll32 (tramite creazione_processi)
Visualizza
IoC (SourceIP) per rilevare: OysterLoader Smascherato: Il Loader di Elusione Multi-Stadio
Visualizza
IoC (DestinationIP) per rilevare: OysterLoader Smascherato: Il Loader di Elusione Multi-Stadio
Visualizza
Rilevamento Comunicazione C2 OysterLoader [Connessione di Rete Windows]
Visualizza
Rilevamento Tecniche Anti-analisi e di Esecuzione di OysterLoader [Creazione Processo Windows]
Visualizza
Esecuzione di Simulazione
Prerequisito: Il controllo pre-volo di Telemetria e Baseline deve essere superato.
Razionale: Questa sezione descrive l’esecuzione precisa della tecnica dell’avversario (TTP) progettata per attivare la regola di rilevamento. I comandi e la narrazione DEVONO riflettere direttamente i TTP identificati e mirano a generare l’esatta telemetria prevista dalla logica di rilevamento. Esempi astratti o non correlati porteranno a una diagnosi errata.
-
Narrazione dell’Attacco & Comandi:
L’avversario, avendo ottenuto un accesso iniziale sul endpoint, distribuisce il payload di OysterLoader.- Registrazione DLL via Rundll32 – Il loader copia un DLL malevolo (
COPYING3.dll) nella directory temporanea e lo registra usandorundll32.execon ilDllRegisterServerpunto di ingresso, producendo una riga di comando che corrisponde aselezione1. - Controllo Anti-Debug – Per evitare l’analisi, il payload carica
ntdll.dlle chiamaIsDebuggerPresent. Questo genera un record del processo doveImmaginecontienentdll.dlle la riga di comando includeIsDebuggerPresent, soddisfacendoselezione2. - Allocazione di Memoria – Per l’esecuzione in memoria, il loader invoca
NtAllocateVirtualMemoryviantdll.dll. L’evento di creazione del processo risultante contieneNtAllocateVirtualMemorynella riga di comando, soddisfacendoselezione3.
- Registrazione DLL via Rundll32 – Il loader copia un DLL malevolo (
-
Script di Test di Regressione:
# Script di validazione della rilevazione OysterLoader – PowerShell # ---------------------------------------------------- # 1. Crea un DLL malevolo fittizio (file vuoto per la simulazione) $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. Attiva selezione1 – rundll32 con DllRegisterServer Write-Host "Esecuzione selezione1 (registrazione DLL con rundll32)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. Attiva selezione2 – ntdll con IsDebuggerPresent Write-Host "Esecuzione selezione2 (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. Attiva selezione3 – ntdll con NtAllocateVirtualMemory Write-Host "Esecuzione selezione3 (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 # Pulizia Remove-Item -Path $dllPath -Force Write-Host "Simulazione completata." -
Comandi di Pulizia:
# Assicurarsi che eventuali processi rundll32 o processi di lavoro residui siano terminati Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # Cancellare il DLL temporaneo se ancora presente $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }