OysterLoader Enthüllt: Einblick in einen Mehrstufigen Tarnlader
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
OysterLoader ist ein C++-Multi-Stage-Loader, der verwendet wird, um Ransomware und generische Malware wie Vidar bereitzustellen. Er verbreitet sich über kompromittierte Websites, die legitime Softwareinstallationsprogramme imitieren, und wird als Microsoft Installer (MSI) geliefert. Um die Analyse zu erschweren, verwendet er API-Call-Flooding, eine benutzerdefinierte dynamische API-Auflösung, Anti-Debug-Checks und eine benutzerdefinierte LZMA-Dekomprimierungsroutine. Der Loader kommuniziert mit einer gestaffelten HTTPS C2-Infrastruktur unter Verwendung verschleierter HTTP-Header und einer proprietären Base64-ähnlichen Kodierung.
Untersuchung
Der Bericht skizziert vier Stufen: einen gepackten Verschleierer (TextShell), eine Shellcode-Ebene, die Inhalte mit LZMA entpackt, einen Downloader, der Umgebungsprüfungen durchführt und ein Mutex erstellt, und eine letzte Phase, die eine DLL ablegt und eine geplante Aufgabe installiert. C2-Kommunikation basiert auf fest codierten IPs/Domains, benutzerdefinierten User-Agents und steganografischer Payload-Übertragung über PNG-Icons. Persistenz wird durch eine geplante Aufgabe aufrechterhalten, die alle 13 Minuten ausgeführt wird.
Abschwächung
Blockieren Sie nicht signierte MSI-Installationsprogramme aus unzuverlässigen Quellen und überwachen Sie die Erstellung bekannter Mutex-Muster. Alarmieren Sie bei bekannten Mustern von geplanten Aufgabennamen und der Verwendung von rundll32.exe, um DLLs aus %APPDATA% zu laden. Wo möglich, erzwingen Sie TLS-Inspektion, um die benutzerdefinierten HTTP-Header und User-Agents des Loaders zu identifizieren.
Reaktion
Wenn erkannt, isolieren Sie den Host, beenden Sie die geplante Aufgabe und entfernen Sie die abgelegte Datei COPYING3.dll. Suchen Sie nach zusätzlichen Payloads, listen Sie Prozesse auf, die zu den Mutex-Werten passen, blockieren Sie die aufgelisteten C2-Domains/IPs und aktualisieren Sie die Erkennungen für das Verhalten des API-Floodings und die benutzerdefinierte Base64-Kodierung.
graph TB %% Klassendefinitionen classDef action fill:#99ccff classDef malware fill:#ffcc99 classDef process fill:#ffeb99 classDef persistence fill:#c2f0c2 classDef c2 fill:#d9b3ff %% Knoten initial_access[„<b>Erstzugriff</b> – <b>T1218.007 Systembinary-Proxy-Ausführung: Msiexec</b><br/>Signiertes bösartiges MSI über kompromittierte Website bereitgestellt.“] class initial_access action process_msiexec[„<b>Prozess</b> – msiexec.exe<br/>Führt bösartiges MSI aus“] class process_msiexec process stage1[„<b>Stufe 1</b> – Packer/Obfuskator<br/><b>Techniken</b>: T1027 Verschleierte Dateien oder Informationen, T1027.007 Dynamische API-Auflösung, T1614.001 Systemsprachenerkennung, T1480.002 Ausführungs-Guardrails: Gegenseitiger Ausschluss, T1497.002 Virtualisierungs-/Sandbox-Umgehung: Benutzeraktivitätsbasierte Prüfungen“] class stage1 malware stage2[„<b>Stufe 2</b> – Shellcode<br/><b>Techniken</b>: T1140 Dateien deobfuskieren/dekodieren (RC4), LZMA-Dekomprimierung“] class stage2 malware stage3[„<b>Stufe 3</b> – Downloader & C2<br/><b>Techniken</b>: T1102 Webdienst, T1001.003 Protokoll- oder Dienst-Imitation, T1001.002 Steganografie, T1102.001 Dead-Drop-Resolver“] class stage3 malware c2_server[„<b>C2</b> – HTTPS-Server<br/>Benutzerdefinierte Header und gefälschter User-Agent“] class c2_server c2 dll_payload[„<b>Malware</b> – Abgelegte DLL<br/>Gespeichert in %APPDATA%“] class dll_payload malware process_rundll32[„<b>Prozess</b> – rundll32.exe<br/>Führt DLL über DllRegisterServer aus“] class process_rundll32 process task_schtasks[„<b>Persistenz</b> – Geplante Aufgabe<br/>Startet rundll32 mit der abgelegten DLL“] class task_schtasks persistence stage4[„<b>Stufe 4</b> – Persistenz & Ausführung<br/><b>Techniken</b>: T1546.009 Ereignisgesteuerte Ausführung: AppCert-DLLs, T1027.003 Steganografie, T1102.002 Bidirektionale Kommunikation“] class stage4 malware %% Verbindungen initial_access –>|führt aus| process_msiexec process_msiexec –>|liefert| stage1 stage1 –>|erzeugt| stage2 stage2 –>|lädt herunter| stage3 stage3 –>|kommuniziert mit| c2_server c2_server –>|liefert Payload an| stage3 stage3 –>|schreibt DLL nach| dll_payload dll_payload –>|verwendet von| process_rundll32 process_rundll32 –>|ausgelöst durch| task_schtasks task_schtasks –>|geplant von| stage4
Angriffsfluss
Erkennungen
Schtasks zeigt auf verdächtiges Verzeichnis/Binary/Skript (über cmdline)
Ansehen
Rundll32 DLL verdächtige Pfadausführung (über process_creation)
Ansehen
IOCs (SourceIP) zur Erkennung: OysterLoader entlarvt: Der Multi-Stage-Evasion-Loader
Ansehen
IOCs (DestinationIP) zur Erkennung: OysterLoader entlarvt: Der Multi-Stage-Evasion-Loader
Ansehen
Erkennung der OysterLoader C2-Kommunikation [Windows-Netzwerkverbindung]
Ansehen
Erkennung von OysterLoader Anti-Analyse- und Ausführungstechniken [Windows-Prozesserstellung]
Ansehen
Simulation Ausführung
Voraussetzung: Der Telemetrie & Baseline Pre‑flight Check muss erfolgreich gewesen sein.
Begründung: Dieser Abschnitt beschreibt die präzise Ausführung der gegnerischen Technik (TTP), die zur Auslösung der Erkennungsregel entwickelt wurde. Die Befehle und Erzählungen MÜSSEN die identifizierten TTPs direkt widerspiegeln und darauf abzielen, genau die Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird. Abstrakte oder nicht relevante Beispiele führen zu Fehldiagnosen.
-
Angriffserzählung & Befehle:
Der Gegner, der einen ersten Zugriff auf den Endpunkt erlangt hat, setzt die OysterLoader-Payload ein.- DLL-Registrierung über Rundll32 – Der Loader kopiert eine bösartige DLL (
COPYING3.dll) in das temporäre Verzeichnis und registriert sie mitrundll32.exemit demDllRegisterServerEinstiegspunkt, was zu einer Befehlszeile führt, die übereinstimmt mitAuswahl1. - Anti-Debug-Prüfung – Um einer Analyse zu entgehen, lädt die Payload
ntdll.dllund ruftIsDebuggerPresentauf. Dies erzeugt einen Prozessdatensatz, bei demImageenthältntdll.dllund die Befehlszeile enthältIsDebuggerPresent, was mitAuswahl2. - Speicherzuweisung – Für die im Speicher ausgeführte Ausführung ruft der Loader
NtAllocateVirtualMemoryviantdll.dllauf. Das daraus resultierende Ereignis der Prozesserstellung enthältNtAllocateVirtualMemoryin der Befehlszeile, was mitAuswahl3.
- DLL-Registrierung über Rundll32 – Der Loader kopiert eine bösartige DLL (
-
Regressionstest-Skript:
# OysterLoader-Erkennungsvalidierungsskript – PowerShell # ---------------------------------------------------- # 1. Erstellen Sie eine Dummy-schädliche DLL (leere Datei zur Simulation) $dllPath = "$env:TEMPCOPYING3.dll" New-Item -Path $dllPath -ItemType File -Force | Out-Null # 2. Auswahl1 auslösen – rundll32 mit DllRegisterServer Write-Host "Ausführung von Auswahl1 (rundll32 DLL-Registrierung)..." Start-Process -FilePath "rundll32.exe" -ArgumentList "`"$dllPath`" DllRegisterServer" -NoNewWindow # 3. Auswahl2 auslösen – ntdll mit IsDebuggerPresent Write-Host "Ausführung von Auswahl2 (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. Auswahl3 auslösen – ntdll mit NtAllocateVirtualMemory Write-Host "Ausführung von Auswahl3 (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 # Bereinigung Remove-Item -Path $dllPath -Force Write-Host "Simulation abgeschlossen." -
Bereinigung Befehle:
# Stellen Sie sicher, dass verbliebene rundll32- oder Jobprozesse beendet werden Get-Process -Name "rundll32" -ErrorAction SilentlyContinue | Stop-Process -Force Get-Job | Remove-Job -Force # Löschen Sie die temporäre DLL, falls noch vorhanden $tempDll = "$env:TEMPCOPYING3.dll" if (Test-Path $tempDll) { Remove-Item $tempDll -Force }