Розкриття OysterLoader: Всередині багатоступеневий завантажувач ухилення
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
Потік Атаки
Виявлення
Schtasks Points to Suspicious Directory / Binary / Script (via cmdline)
Переглянути
Розпізнавання підозрілих шляхів виконання Rundll32 Dll (через process_creation)
Переглянути
IOCs (SourceIP) для виявлення: OysterLoader без маски: багатоступеневий loader ухилення
Переглянути
IOCs (DestinationIP) для виявлення: OysterLoader без маски: багатоступеневий loader ухилення
Переглянути
Виявлення зв’язків із C2 OysterLoader [Windows Network Connection]
Переглянути
Виявлення технік анти-аналізу та виконання OysterLoader [створення процесу Windows]
Переглянути
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.- DLL Registration via Rundll32 – The loader copies a malicious DLL (
COPYING3.dll) into the temporary directory and registers it usingrundll32.exewith theDllRegisterServerentry point, producing a command line that matchesselection1. - Anti‑Debug Check – To evade analysis, the payload loads
ntdll.dlland callsIsDebuggerPresent. This generates a process record whereImagecontainsntdll.dlland the command line includesIsDebuggerPresent, satisfyingselection2. - Memory Allocation – For in‑memory execution, the loader invokes
NtAllocateVirtualMemoryviantdll.dll. The resulting process creation event containsNtAllocateVirtualMemoryin the command line, satisfyingselection3.
- DLL Registration via Rundll32 – The loader copies a malicious DLL (
-
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 }