Phantom Stealer Analyse: Einblick in eine zweistufige Angriffskette
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Phantom Stealer ist ein zweistufiges Windows-Infostealer, das mit einem bösartigen pdh.dll Loader beginnt und mit einer .NET-Nutzlast endet, die in jsc.exeinjektiert wird. Der Loader verwendet DLL-Hijacking, Process Hollowing und native AOT-Kompilierung, um die Erkennungschancen zu verringern. Sobald er aktiv ist, stiehlt die Nutzlast der zweiten Stufe Anmeldedaten, Browserdaten, Kryptowährungs-Wallet-Informationen, Zwischenablage-Inhalte und andere sensible Daten und kann auch kopierte Wallet-Adressen durch von Angreifern kontrollierte Werte ersetzen. Die Malware wird als kommerzielles Crimeware-Angebot vermarktet und derzeit in aktiven Angriffen eingesetzt.
Untersuchung
Forscher fanden heraus, dass der Loader sich selbst zu %APPDATA%MicrosoftRasManagementMpDlpService.exe kopiert und einen Run-Schlüssel erstellt, um die Persistenz zu gewährleisten. Dann entschlüsselt er eine doppelt RC4-verschlüsselte Nutzlast, injiziert sie in einen angehaltenen jsc.exe Prozess und führt mehrere Anti-Analysetechniken durch, bevor der Datendiebstahl beginnt. Der innere .NET-Stealer kann die Chrome-127+-App-gebundene Verschlüsselung umgehen und exfiltriert gestohlene Informationen über SMTP unter Verwendung einer gefälschten Domain. Separate Threads verwalten das Kryptoclipping und die Keylogging-Funktionen.
Abwehrmaßnahmen
Verteidiger sollten unerwartete pdh.dll Ladevorgänge von nicht-systemeigenen Pfaden überwachen und Kontrollen durchsetzen, die das Risiko des DLL-Hijackings reduzieren. Sicherheitsteams sollten auch unbekannte ausführbare Dateien, die in %APPDATA%MicrosoftRasManagement abgelegt wurden, erkennen und den RasManSvc Run-Schlüssel überwachen. Verhaltensbasierte Erkennungen sollten sich auf Process Hollowing, das jsc.exebetrifft, konzentrieren, während die Netzwerküberwachung verdächtige Verbindungen zu den identifizierten Command-and-Control-Domains kennzeichnen sollte. Eine zusätzliche Härtung der Browser-Anmeldeinformationsspeicherung und strengere Kontrollen des Zwischenablagezugriffs für nicht vertrauenswürdige Anwendungen können die Gefährdung weiter reduzieren.
Reaktion
Alarmieren Sie bei der Erstellung von MpDlpService.exe im RasManagement-Verzeichnis und bei Änderungen am zugehörigen Run-Registry-Schlüssel. Untersuchen Sie jeden jsc.exe Prozess, der Anzeichen von injiziertem Code zeigt, und beenden Sie die böswilligen Aktivitäten sofort. Sammeln Sie die relevanten Indikatoren für kompromittierte Systeme, isolieren Sie die zugehörigen Dateien und führen Sie eine forensische Analyse durch, um festzustellen, welche Anmeldedaten und Wallet-Daten möglicherweise offengelegt wurden. Setzen Sie betroffene Konten zurück und benachrichtigen Sie betroffene Benutzer nach Bedarf.
graph TB classDef technique fill:#ffcc99 classDef file fill:#c2f0c2 classDef process fill:#add8e6 classDef action fill:#ffd699 step1_ext[„<b>Technik</b> – <b>T1176 Software-Erweiterungen</b><br/><b>Beschreibung</b>: Platzieren von pdh.dll im selben Verzeichnis wie eine legitime Anwendung, die die Windows-PDH-Bibliothek lädt.“] class step1_ext technique step1_masq[„<b>Technik</b> – <b>T1036.005 Tarnung: Übereinstimmung mit legitimen Namen oder Speicherort</b><br/><b>Beschreibung</b>: DLL wird wie eine legitime Windows-Bibliothek benannt.“] class step1_masq technique step1_dynapi[„<b>Technik</b> – <b>T1027.007 Obfuskation: Dynamische API-Auflösung</b><br/><b>Beschreibung</b>: API-Aufrufe werden zur Laufzeit aufgelöst.“] class step1_dynapi technique file_dll[„<b>Datei</b> – pdh.dll (bösartig)“] class file_dll file step1_ext –>|nutzt| step1_masq step1_ext –>|nutzt| step1_dynapi step1_ext –>|legt_ab| file_dll file_dll –>|geladen_von| step1_ext step2_compromise[„<b>Technik</b> – <b>T1554 Kompromittierung von Host-Software-Binärdateien</b><br/><b>Beschreibung</b>: Austausch oder Modifikation vertrauenswürdiger Binärdateien.“] class step2_compromise technique step2_activeSetup[„<b>Technik</b> – <b>T1547.014 Autostart: Active Setup</b><br/><b>Beschreibung</b>: Active-Setup-Eintrag erstellt Loader in AppData.“] class step2_activeSetup technique step2_runkey[„<b>Technik</b> – <b>T1547.001 Autostart: Registry Run Keys</b><br/><b>Beschreibung</b>: Persistenz über Run-Key “RasManSvc”.“] class step2_runkey technique file_loader[„<b>Datei</b> – MpDlpService.exe (Loader)“] class file_loader file step1_ext –>|führt_zu| step2_compromise step2_compromise –>|ermöglicht| step2_activeSetup step2_activeSetup –>|erstellt| file_loader file_loader –>|registriert_über| step2_runkey step3_evasion[„<b>Technik</b> – <b>T1497.002 Sandbox/Virtualisierungs-Evasion</b><br/><b>Beschreibung</b>: Prüfung von System-, GPU-, Prozess- und Sandbox-Indikatoren.“] class step3_evasion technique step3_queryReg[„<b>Technik</b> – <b>T1012 Registry-Abfrage</b>“] class step3_queryReg technique step2_compromise –>|triggert| step3_evasion step3_evasion –>|nutzt| step3_queryReg step4_hollow[„<b>Technik</b> – <b>T1055.012 Process Hollowing</b>“] class step4_hollow technique step4_threadHijack[„<b>Technik</b> – <b>T1055.003 Thread-Hijacking</b>“] class step4_threadHijack technique process_jsc[„<b>Prozess</b> – jsc.exe“] class process_jsc process process_mal[„<b>Prozess</b> – injizierte .NET Payload“] class process_mal process step3_evasion –>|führt_zu| step4_hollow step4_hollow –>|erstellt| process_jsc step4_hollow –>|ersetzt_Speicher_von| process_jsc process_jsc –>|hostet| process_mal step4_hollow –>|nutzt| step4_threadHijack step5_browserDisc[„<b>Technik</b> – <b>T1217 Browser-Erkennung</b>“] class step5_browserDisc technique step5_credWeb[„<b>Technik</b> – <b>T1555.003 Browser-Anmeldedaten</b>“] class step5_credWeb technique step5_privateKey[„<b>Technik</b> – <b>T1552.004 Unsichere Schlüssel</b>“] class step5_privateKey technique step4_hollow –>|führt_zu| step5_browserDisc step5_browserDisc –>|aktiviert| step5_credWeb step5_credWeb –>|fügt_hinzu| step5_privateKey step6_keylog[„<b>Technik</b> – <b>T1056.001 Keylogging</b>“] class step6_keylog technique step5_credWeb –>|aktiviert| step6_keylog step7_screen[„<b>Technik</b> – <b>T1113 Bildschirmaufnahme</b>“] class step7_screen technique step6_keylog –>|führt_zu| step7_screen step8_clipboard[„<b>Technik</b> – <b>T1115 Zwischenablage</b>“] class step8_clipboard technique step7_screen –>|führt_zu| step8_clipboard step9_emailCollect[„<b>Technik</b> – <b>T1114 E-Mail-Sammlung</b>“] class step9_emailCollect technique step9_identity[„<b>Technik</b> – <b>T1589.002 E-Mail-Identitäten</b>“] class step9_identity technique step9_exfil[„<b>Technik</b> – <b>T1048.003 SMTP-Exfiltration</b>“] class step9_exfil technique step8_clipboard –>|führt_zu| step9_emailCollect step9_emailCollect –>|enthält| step9_identity step9_identity –>|exfiltration_via| step9_exfil step10_reflective[„<b>Technik</b> – <b>T1620 Reflective Code Loading</b>“] class step10_reflective technique step9_exfil –>|triggert| step10_reflective
Angriffsfluss
Erkennungen
Mögliche Persistenzpunkte [ASEPs – Software/NTUSER Hive] (über registry_event)
Ansehen
Ungewöhnlicher Wechsel der Codepage-Ausführung (über cmdline)
Ansehen
Mögliche Entdeckung von WLAN-Passwörtern (über cmdline)
Ansehen
IOCs (HashSha256) zur Erkennung: Phantom Stealer-Analyse: Innerhalb der zweistufigen Angriffskette verborgene Windows-DLL
Ansehen
IOCs (HashMd5) zur Erkennung: Phantom Stealer-Analyse: Innerhalb der zweistufigen Angriffskette verborgene Windows-DLL
Ansehen
Registrierungspersistenz über RasManSvc Run Key [Windows-Registry-Ereignis]
Ansehen
Prozess-Hollowing in jsc.exe und Persistenz über MpDlpService.exe [Windows-Prozesserstellung]
Ansehen
Simulation Execution
Voraussetzung: Der Telemetrie- & Baseline-Pre-flight-Check muss bestanden sein.
Begründung: In diesem Abschnitt werden die präzise Ausführung der adversarialen Technik (TTP) beschrieben, die darauf abzielt, die Erkennungsregel auszulösen. Die Befehle und Erzählungen spiegeln direkt die identifizierten TTPs wider und sollen die genaue Telemetrie erzeugen, die von der Erkennungslogik erwartet wird.
-
Angriffserzählung und Befehle:
Ein Angreifer stiehlt zuerst eine bösartige Nutzlast (z. B. eine Reverse-Shell-DLL) und speichert sie im Verzeichnis des Benutzers%APPDATA%ab. Mitjsc.exeals Hollowing-Host erstellt der Angreifer einen neuen Prozess, injiziert die Nutzlast und setzt die Ausführung fort – erfüllt T1055.012 and T1055.003.
Um die Persistenz sicherzustellen, kopiert der Angreifer die bösartige DLL nach%APPDATA%MicrosoftRasManagementMpDlpService.exeund registriert sie als Dienst, der beim Anmelden ausgeführt wird und den legitimen Dienstnamen ausnutzt (T1620). -
Regressionstest-Skript:
# --------------------------------------------------------- # Simuliertes Angreiferskript – Prozess-Hollowing + Persistenz # --------------------------------------------------------- # Variablen $appData = "$env:APPDATAMicrosoftRasManagement" $loaderPath = Join-Path $appData "MpDlpService.exe" $maliciousDll = "$env:TMPmalicious.dll" # Platzhalter für Nutzlast # 1. Persistenzverzeichnis vorbereiten New-Item -Path $appData -ItemType Directory -Force | Out-Null # 2. Dummy-gefährliche DLL ablegen (simulierte Nutzlast) # In einem echten Angriff wäre dies eine kompilierte Nutzlast; hier erstellen wir eine Null-Byte-Datei. New-Item -Path $maliciousDll -ItemType File -Force | Out-Null # 3. Kopieren Sie die DLL an den gefälschten Dienststandort Copy-Item -Path $maliciousDll -Destination $loaderPath -Force # 4. Registrieren Sie einen temporären Dienst, der auf die kopierte Datei verweist (erfordert Adminrechte) $svcName = "MpDlpService" sc.exe create $svcName binPath= "`"$loaderPath`"" DisplayName= "Microsoft Ras Management Service" start= auto | Out-Null # 5. Starten Sie den Dienst (löst die Ausführung von MpDlpService.exe aus) sc.exe start $svcName | Out-Null # 6. Führen Sie Process Hollowing mit jsc.exe als Host durch # Wir werden jsc.exe angehalten starten, seinen Speicher mit der Dummy-Nutzlast ersetzen, # dann fortsetzen. Dies verwendet die Funktion Invoke-ProcessHollowing von PowerSploit. function Invoke-ProcessHollowing { param( [string]$HostPath, [string]$PayloadPath ) # .NET-APIs laden Add-Type @" using System; using System.Diagnostics; using System.Runtime.InteropServices; public class Hollow { [DllImport("kernel32.dll")] public static extern bool CreateProcess(string appName, string cmdLine, IntPtr procSec, IntPtr threadSec, bool inherit, uint flags, IntPtr env, string cwd, ref STARTUPINFO si, out PROCESS_INFORMATION pi); [StructLayout(LayoutKind.Sequential)] public struct STARTUPINFO { public int cb; public string lpReserved; public string lpDesktop; public string lpTitle; public uint dwX; public uint dwY; public uint dwXSize; public uint dwYSize; public uint dwXCountChars; public uint dwYCountChars; public uint dwFillAttribute; public uint dwFlags; public short wShowWindow; public short cbReserved2; public IntPtr lpReserved2; public IntPtr hStdInput; public IntPtr hStdOutput; public IntPtr hStdError; } [StructLayout(LayoutKind.Sequential)] public struct PROCESS_INFORMATION { public IntPtr hProcess; public IntPtr hThread; public uint dwProcessId; public uint dwThreadId; } "@ # Prozess angehalten erstellen $si = New-Object Hollow+STARTUPINFO $pi = New-Object Hollow+PROCESS_INFORMATION $si.cb = [Runtime.InteropServices.Marshal]::SizeOf($si) $CREATE_SUSPENDED = 0x00000004 $ok = [Hollow]::CreateProcess($null, "`"$HostPath`"", [IntPtr]::Zero, [IntPtr]::Zero, $false, $CREATE_SUSPENDED, [IntPtr]::Zero, $null, [ref]$si, [ref]$pi) if (-not $ok) { Write-Error "Fehler beim Erstellen des angehaltenen Prozesses" ; return } # (Payload-Injektionsschritte weggelassen – Platzhalter für echte Technik) # Faden fortsetzen $RESUME_THREAD = 0x00000001 [System.Runtime.InteropServices.Marshal]::WriteInt32($pi.hThread, 0, $RESUME_THREAD) | Out-Null } # Führen Sie Hollowing aus (mit dem echten jsc.exe als Host) $jscPath = "$env:SystemRootSystem32jsc.exe" Invoke-ProcessHollowing -HostPath $jscPath -PayloadPath $maliciousDll # --------------------------------------------------------- # Ende der Simulation # --------------------------------------------------------- -
Bereinigungskommandos:
# Temporären Dienst stoppen und löschen sc.exe stop MpDlpService | Out-Null sc.exe delete MpDlpService | Out-Null # Loader und Dummy-Nutzlast entfernen Remove-Item -Path "$env:APPDATAMicrosoftRasManagementMpDlpService.exe" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TMPmalicious.dll" -Force -ErrorAction SilentlyContinue # Optional: Beenden Sie eventuell zurückgebliebene jsc.exe-Prozesse, die durch den Test gestartet wurden Get-Process -Name jsc -ErrorAction SilentlyContinue | Stop-Process -Force