SOC Prime Bias: Alto

13 Feb 2026 17:05

OysterLoader Rivelato: Dentro un Loader di Evasione Multi-Fase

Author Photo
Ruslan Mikhalov Capo della Ricerca sulle Minacce presso SOC Prime linkedin icon Segui
OysterLoader Rivelato: Dentro un Loader di Evasione Multi-Fase
shield icon

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

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.

    1. Registrazione DLL via Rundll32 – Il loader copia un DLL malevolo (COPYING3.dll) nella directory temporanea e lo registra usando rundll32.exe con il DllRegisterServer punto di ingresso, producendo una riga di comando che corrisponde a selezione1.
    2. Controllo Anti-Debug – Per evitare l’analisi, il payload carica ntdll.dll e chiama IsDebuggerPresent. Questo genera un record del processo dove Immagine contiene ntdll.dll e la riga di comando include IsDebuggerPresent, soddisfacendo selezione2.
    3. Allocazione di Memoria – Per l’esecuzione in memoria, il loader invoca NtAllocateVirtualMemory via ntdll.dll. L’evento di creazione del processo risultante contiene NtAllocateVirtualMemory nella riga di comando, soddisfacendo selezione3.
  • 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 }