SOC Prime Bias: Alto

13 Feb 2026 14:05 UTC

OysterLoader Rivelato: Dentro un Loader di Evasione Multi-Fase

Author Photo
Ruslan Mikhalov Chief of Threat Research at 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.

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 }