SOC Prime Bias: Високий

13 Feb 2026 14:05 UTC

Розкриття OysterLoader: Всередині багатоступеневий завантажувач ухилення

Author Photo
Ruslan Mikhalov Chief of Threat Research at SOC Prime linkedin icon Стежити
Розкриття OysterLoader: Всередині багатоступеневий завантажувач ухилення
shield icon

Detection stack

  • AIDR
  • Alert
  • ETL
  • Query

Резюме

OysterLoader – це багатоступенева програма-завантажувач на C++, яка використовується для розгортання програм-вимагачів та загальнодоступного шкідливого програмного забезпечення, такого як Vidar. Воно поширюється через скомпрометовані сайти, які видають себе за законні інсталятори програмного забезпечення, і постачається у вигляді інсталятора Microsoft (MSI). Щоб ускладнити аналіз, використовуються перевантаження викликів API, динамічна розв’язка API, перевірки анти-налагодження та власна процедура декомпресії LZMA. Завантажувач взаємодіє з багаторівневою HTTPS C2 інфраструктурою, використовуючи замасковані заголовки HTTP та власне кодування, схоже на Base64.

Розслідування

Звіт описує чотири етапи: упакований обфускатор (TextShell), рівень шеллкоду, що розширює вміст за допомогою LZMA, завантажувач, що виконує перевірки середовища і створює м’ютекс, і фінальний етап, що розгортає DLL і встановлює заплановане завдання. Трафік C2 спирається на жорстко закодовані IP/доменні імена, власні користувацькі агенти та стеганографічну доставку корисного вантажу через іконки PNG. Постійність зберігається за допомогою запланованого завдання, налаштованого на запуск кожні 13 хвилин.

Захист

Блокуйте не підписані MSI інсталятори з ненадійних джерел і моніторте створення відомих м’ютекс шаблонів. Сигналізуйте про шаблони імен запланованих завдань та використання rundll32.exe для завантаження DLL з %APPDATA%. Де це можливо, примушуйте інспекцію TLS для виявлення спеціальних HTTP заголовків та користувацьких агентів, які використовуються завантажувачем.

Відповідь

Якщо виявлено, ізолюйте хост, скасуйте заплановане завдання і видаліть завантажений файл COPYING3.dll. Шукайте додаткові корисні вантажі, перераховуйте процеси, що відповідають значенням м’ютексів, блокуйте перераховані домени/IP C2 і оновлюйте виявлення для поведінки перевантаження API і власного кодування Base64.

Потік Атаки

Simulation Execution

Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.

Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative MUST directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic. Abstract or unrelated examples will lead to misdiagnosis.

  • Attack Narrative & Commands:
    The adversary, having gained initial foothold on the endpoint, deploys the OysterLoader payload.

    1. DLL Registration via Rundll32 – The loader copies a malicious DLL (COPYING3.dll) into the temporary directory and registers it using rundll32.exe with the DllRegisterServer entry point, producing a command line that matches selection1.
    2. Anti‑Debug Check – To evade analysis, the payload loads ntdll.dll and calls IsDebuggerPresent. This generates a process record where Image contains ntdll.dll and the command line includes IsDebuggerPresent, satisfying selection2.
    3. Memory Allocation – For in‑memory execution, the loader invokes NtAllocateVirtualMemory via ntdll.dll. The resulting process creation event contains NtAllocateVirtualMemory in the command line, satisfying selection3.
  • Regression Test Script:

    # OysterLoader detection validation script – PowerShell
    # ----------------------------------------------------
    # 1. Create a dummy malicious DLL (empty file for simulation)
    $dllPath = "$env:TEMPCOPYING3.dll"
    New-Item -Path $dllPath -ItemType File -Force | Out-Null
    
    # 2. Trigger selection1 – rundll32 with DllRegisterServer
    Write-Host "Executing selection1 (rundll32 DLL registration)..."
    Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow
    
    # 3. Trigger selection2 – ntdll with IsDebuggerPresent
    Write-Host "Executing selection2 (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. Trigger selection3 – ntdll with NtAllocateVirtualMemory
    Write-Host "Executing selection3 (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
    
    # Cleanup
    Remove-Item -Path $dllPath -Force
    Write-Host "Simulation completed."
  • Команди очищення:

    # Переконайтеся, що будь-які залишкові процеси rundll32 або завдання завершені
    Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force
    Get-Job | Remove-Job -Force
    # Видалити тимчасовий DLL, якщо він все ще присутній
    $tempDll = "$env:TEMPCOPYING3.dll"
    if (Test-Path $tempDll) { Remove-Item $tempDll -Force }