SOC Prime Bias: Високий

13 Feb 2026 17:05

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

Author Photo
Ruslan Mikhalov Керівник досліджень загроз у 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.

graph TB %% Визначення класів classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Вузли initial_access[“<b>Початковий доступ</b> – <b>T1218.007 Proxy-виконання системного бінарного файлу: Msiexec</b><br/>Підписаний шкідливий MSI доставлено через скомпрометований вебсайт.”] class initial_access action process_msiexec[“<b>Процес</b> – msiexec.exe<br/>Виконує шкідливий MSI”] class process_msiexec process stage1[“<b>Етап 1</b> – Пакувальник/Обфускатор<br/><b>Техніки</b>: T1027 Обфусковані файли або інформація, T1027.007 Динамічне визначення API, T1614.001 Виявлення мови системи, T1480.002 Обмеження виконання: взаємне виключення, T1497.002 Обхід віртуалізації/пісочниці: перевірки активності користувача”] class stage1 malware stage2[“<b>Етап 2</b> – Шелкод<br/><b>Техніки</b>: T1140 Деобфускація/декодування файлів (RC4), LZMA-розпакування”] class stage2 malware stage3[“<b>Етап 3</b> – Завантажувач і C2<br/><b>Техніки</b>: T1102 Вебсервіс, T1001.003 Імітація протоколу або сервісу, T1001.002 Стеганографія, T1102.001 Dead Drop Resolver”] class stage3 malware c2_server[“<b>C2</b> – HTTPS-сервер<br/>Користувацькі заголовки та підроблений User-Agent”] class c2_server c2 dll_payload[“<b>Шкідливе ПЗ</b> – Скинута DLL<br/>Збережена у %APPDATA%”] class dll_payload malware process_rundll32[“<b>Процес</b> – rundll32.exe<br/>Виконує DLL через DllRegisterServer”] class process_rundll32 process task_schtasks[“<b>Закріплення</b> – Заплановане завдання<br/>Запускає rundll32 із скинутою DLL”] class task_schtasks persistence stage4[“<b>Етап 4</b> – Закріплення та виконання<br/><b>Техніки</b>: T1546.009 Виконання за подією: AppCert DLL, T1027.003 Стеганографія, T1102.002 Двосторонній зв’язок”] class stage4 malware %% З’єднання initial_access –>|виконує| process_msiexec process_msiexec –>|доставляє| stage1 stage1 –>|генерує| stage2 stage2 –>|завантажує| stage3 stage3 –>|зв’язується з| c2_server c2_server –>|надає payload для| stage3 stage3 –>|записує DLL у| dll_payload dll_payload –>|використовується| process_rundll32 process_rundll32 –>|запускається через| task_schtasks task_schtasks –>|заплановано з| stage4

Потік Атаки

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 }