Розкриття 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.
Потік Атаки
Виявлення
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 }