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.
“graph TB %% Class definitions classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Nodes initial_access[“<b>Accesso Iniziale</b> – <b>T1218.007 Esecuzione Proxy di Sistema Binario: Msiexec</b><br />MSI malevolo firmato consegnato tramite sito compromesso.”] class initial_access action process_msiexec[“<b>Processo</b> – msiexec.exe<br />Esegue MSI malevolo”] class process_msiexec process stage1[“<b>Fase 1</b> – Packer/Offuscatore<br /><b>Tecniche</b>: T1027 File o Informazioni Offuscate, T1027.007 Risoluzione Dinamica API, T1614.001 Scoperta della Lingua di Sistema, T1480.002 Paratie di Esecuzione: Mutua Esclusione, T1497.002 Evasione da Virtualizzazione/De-Sandboxing: Controlli Basati sull’Attività Utente”] class stage1 malware stage2[“<b>Fase 2</b> – Shellcode<br /><b>Tecniche</b>: T1140 Deoffuscare/Decodificare File (RC4), decompressione LZMA”] class stage2 malware stage3[“<b>Fase 3</b> – Downloader & C2<br /><b>Tecniche</b>: T1102 Servizio Web, T1001.003 Impersonificazione di Protocollo o Servizio, T1001.002 Steganografia, T1102.001 Risolutore Dead Drop”] class stage3 malware c2_server[“<b>C2</b> – Server HTTPS<br />Intestazioni personalizzate e User-Agent falsi”] class c2_server c2 dll_payload[“<b>Malware</b> – DLL rilasciata<br />Archiviata in %APPDATA%”] class dll_payload malware process_rundll32[“<b>Processo</b> – rundll32.exe<br />Esegue DLL via DllRegisterServer”] class process_rundll32 process task_schtasks[“<b>Persistenza</b> – Attività Pianificata<br />Esegue rundll32 con la DLL rilasciata”] class task_schtasks persistence stage4[“<b>Fase 4</b> – Persistenza & Esecuzione<br /><b>Tecniche</b>: T1546.009 Esecuzione Triggered Evento: DLL di AppCert, T1027.003 Steganografia, T1102.002 Comunicazione Bidirezionale”] class stage4 malware %% Connections initial_access u002du002d>|esegue| process_msiexec process_msiexec u002du002d>|consegna| stage1 stage1 u002du002d>|genera| stage2 stage2 u002du002d>|scarica| stage3 stage3 u002du002d>|comunica con| c2_server c2_server u002du002d>|fornisce payload a| stage3 stage3 u002du002d>|scrive DLL a| dll_payload dll_payload u002du002d>|utilizzato da| process_rundll32 process_rundll32 u002du002d>|attivato da| task_schtasks task_schtasks u002du002d>|pianificato da| stage4 “
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 }