ChainShell: MuddyWater & Russischer MaaS
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
MuddyWater, ein mit Iran verbundener Spionageakteur, nutzt die russische Plattform TAG-150 Malware-as-a-Service, um CastleRAT und einen neueren, blockchain-fähigen Node.js-C2-Agent, der als ChainShell verfolgt wird, gegen israelische und andere hochrangige Ziele zu verbreiten. Die Aktivität wird von einem exponierten, falsch konfigurierten C2-Webserver, einem PowerShell-Bereitstellungsskript (reset.ps1) und über Steganographie verborgenen PE-Nutzlasten unterstützt. Mehrere CastleRAT-Versionen (einschließlich Build 120 und Build 13) enthalten gemeinsame hartcodierte Kennungen, die auf dieselbe MaaS-Abstammung hinweisen. Die Backend-Infrastruktur scheint kampagnenspezifisch zu sein und verwendet gemeinsame Domains (zum Beispiel serialmenot.com) und für jeden Einsatz spezifische JWT-Zugangsdaten, um den Zugriff und die Verfolgung über die Bereitstellungen hinweg zu trennen.
Untersuchung
JUMPSEC überprüfte den exponierten C2-Host, stellte 15 Malware-Proben sicher und verknüpfte die Bereitstellungslogik von reset.ps1 mit der Lieferung von sowohl ChainShell als auch mehreren CastleRAT-Builds. Die Ermittler korrelierten auch Code-Signaturzertifikate (Amy Cherne und Donald Gay), die in bekannten MuddyWater-Tools gesehen wurden, mit dem TAG-150 MSI-Installer, was eine hochgradige Zuordnungsfährte bildete. Zusätzlich wurde übergreifende Ähnlichkeit bei den Proben in hartcodierten Build-Markern, wiederkehrenden geplanten Namenskonventionen von Aufgaben und in den Tools und serverseitigen Artefakten eingebetteten JWT-Kampagnen-IDs beobachtet.
Abschwächung
Überwachen Sie nach reset.ps1, zugehörigen geplanten Aufgaben und einzigartigen Mutex- oder Dateipfad-Artefakten, die mit CastleRAT und ChainShell in Verbindung stehen. Blockieren Sie bekannte TAG-150-Infrastrukturen, einschließlich serialmenot.com, ttrdomennew.com und sharecodepro.com, und untersuchen Sie PowerShell-gesteuerte Installationen von Node.js-Komponenten. Erzwingen Sie strikte Kontrollen der Code-Signatur und validieren Sie verdächtige Zertifikate gegen bekannte MuddyWater-verknüpfte Signaturmaterialien.
Reaktion
Falls Indikatoren gefunden werden, isolieren Sie betroffene Endpunkte, erfassen Sie vollständige Festplatten- und Speicherabbilder und durchsuchen Sie weitere Überreste von CastleRAT und ChainShell. Widerrufen oder misstrauen Sie kompromittierten Code-Signaturzertifikaten, setzen Sie betroffene Anmeldedaten zurück und koordinieren Sie Berichterstattung mit relevanten nationalen CERTs. Überprüfen Sie Netzwerk-Telemetrie auf Ethereum-RPC-Zugriffsmuster und JWT-Nutzung, die mit dem serialmenot.com-Kommando-und-Kontroll-Workflow verbunden sind.
"graph TB %% Class definitions classDef action fill:#99ccff classDef tool fill:#ffcc99 classDef technique fill:#c2f0c2 classDef malware fill:#ff9999 classDef process fill:#ffd966 %% Nodes action_phishing["<b>Aktion</b> – <b>T1566.002 Phishing</b><br/>Bösartiges makroinaktiviertes Dokument (ClickFix/BatClickFix), das per E-Mail geliefert wird"] class action_phishing action action_user_exec["<b>Aktion</b> – <b>T1204.002 Benutzer-Ausführung</b><br/>Das Opfer öffnet das Dokument und löst PowerShell aus"] class action_user_exec action tool_powershell["<b>Werkzeug</b> – <b>T1059.001 PowerShell</b><br/>Skript-Interpreter, der den Loader lädt"] class tool_powershell tool tool_cmstp["<b>Werkzeug</b> – <b>T1218.003 CMSTP</b><br/>Systembinär-Proxy-Ausführung, die bösartige INF lädt"] class tool_cmstp tool technique_dll_sideload["<b>Technik</b> – <b>T1574.002 DLL-Sideloading</b><br/>Bösartige DLLs, die über INF geladen werden"] class technique_dll_sideload technique technique_dll_hijack["<b>Technik</b> – <b>T1574.005 Ausführung des Hijack-Flusses</b><br/>Bösartige userenv.dll und xmllite.dll, die neben legitimen Binärdateien platziert werden"] class technique_dll_hijack technique technique_scheduled_task["<b>Technik</b> – <b>T1543.001 Systemprozess erstellen oder ändern</b><br/>Geplante Aufgaben (VirtualSmokestGuy120/666) für Persistenz"] class technique_scheduled_task technique technique_steganography["<b>Technik</b> – <b>T1027.003 Steganographie</b><br/>Native PE-Nutzlasten, die innerhalb von JPEG-Bildern verborgen sind"] class technique_steganography technique technique_embedded_payload["<b>Technik</b> – <b>T1027.009 Eingebettete Nutzlasten</b><br/>Weitere Nutzlasten weiter verschleiert"] class technique_embedded_payload technique technique_data_obfusc["<b>Technik</b> – <b>T1001 Datenverschleierung</b><br/>AES-256-CBC-Verschlüsselung des C2-Verkehrs"] class technique_data_obfusc technique technique_uac_bypass["<b>Technik</b> – <b>T1548.002 Missbrauch des Steuermechanismus für Erhebungen</b><br/>CMSTP-Ausführung umgeht UAC"] class technique_uac_bypass technique technique_steal_cookie["<b>Technik</b> – <b>T1539 Websession-Cookie stehlen</b><br/>Chrome v127+ anwendungsgebundene Cookies entschlüsseln"] class technique_steal_cookie technique technique_forge_cookie["<b>Technik</b> – <b>T1606.001 Web-Zugangsdaten fälschen</b><br/>Extrahierte Cookies zur Authentifizierung verwenden"] class technique_forge_cookie technique technique_alt_auth["<b>Technik</b> – <b>T1550.004 Alternativ authentifiziertes Material verwenden</b><br/>Cookies für laterale Bewegungen missbrauchen"] class technique_alt_auth technique technique_vnc["<b>Technik</b> – <b>T1021.005 Remote Services VNC</b><br/>Verstecktes VNC bietet unsichtbare Desktop-Kontrolle"] class technique_vnc technique technique_remote_service["<b>Technik</b> – <b>T1021 Remote Services</b><br/>Zusätzliche laterale Bewegung über Remotedienste"] class technique_remote_service technique technique_dead_drop["<b>Technik</b> – <b>T1102.001 Dead Drop Resolver</b><br/>C2-Adresse gelöst aus Ethereum Smart Contract"] class technique_dead_drop technique technique_websocket_bidirectional["<b>Technik</b> – <b>T1102.002 WebSocket-Bidirektional</b><br/>WebSocket-Kanal für Befehlsaustausch"] class technique_websocket_bidirectional technique technique_websocket_oneway["<b>Technik</b> – <b>T1102.003 Einweg-Kommunikation</b><br/>Ausweich-C2-Pfad"] class technique_websocket_oneway technique technique_web_protocol["<b>Technik</b> – <b>T1071.001 Anwendungsprotokoll Webprotokolle</b><br/>Verkehr über WebSocket via HTTPS"] class technique_web_protocol technique malware_chainshell["<b>Malware</b> – <b>Name</b>: ChainShell<br/>Nutzlast-Orchestrator, der C2, Verschlüsselung und laterale Bewegungen verarbeitet"] class malware_chainshell malware %% Connections action_phishing –>|leads_to| action_user_exec action_user_exec –>|executes| tool_powershell tool_powershell –>|loads| tool_cmstp tool_cmstp –>|uses| technique_dll_sideload tool_cmstp –>|bypasses| technique_uac_bypass technique_dll_sideload –>|enables| technique_dll_hijack technique_dll_hijack –>|supports| technique_scheduled_task technique_scheduled_task –>|creates| malware_chainshell malware_chainshell –>|contains| technique_steganography malware_chainshell –>|contains| technique_embedded_payload malware_chainshell –>|encrypts| technique_data_obfusc malware_chainshell –>|steals| technique_steal_cookie technique_steal_cookie –>|enables| technique_forge_cookie technique_forge_cookie –>|enables| technique_alt_auth technique_alt_auth –>|enables| technique_vnc technique_vnc –>|uses| technique_remote_service malware_chainshell –>|resolves C2 via| technique_dead_drop technique_dead_drop –>|communicates via| technique_websocket_bidirectional technique_websocket_bidirectional –>|fallback to| technique_websocket_oneway technique_websocket_bidirectional –>|uses protocol| technique_web_protocol "
Angriffsfluss
Erkennungen
Möglicher Versuch zur Erkennung der lokalen Systemsprache (via cmdline)
Ansehen
Möglicher Versuch zur Erkennung der lokalen Systemsprache (via PowerShell)
Ansehen
NodeJS-Binary, das von einem ungewöhnlichen Ort ausgeführt wird (via cmdline)
Ansehen
Möglicher Publicnode Ethereum-Missbrauchsversuch als C2-Kanal (via dns_query)
Ansehen
IOC (SourceIP) zur Erkennung: ChainShell: MuddyWater & russische MaaS
Ansehen
IOC (DestinationIP) zur Erkennung: ChainShell: MuddyWater & russische MaaS
Ansehen
IOC (HashSha256) zur Erkennung: ChainShell: MuddyWater & russische MaaS
Ansehen
Erkennung der CastleRAT-C2-Kommunikation auf bestimmten Ports [Windows Netzwerkverbindung]
Ansehen
Erkennung der ChainShell-Bereitstellung via Node.js in MuddyWater-Operationen [Windows-Prozesserstellung]
Ansehen
Erkennung des PowerShell-Skripts Reset.ps1 für die ChainShell-Bereitstellung [Windows PowerShell]
Ansehen
Simulationsexekution
Voraussetzung: Der Telemetrie- & Basislinien-Vorab-Check muss bestanden worden sein.
-
Angriffserzählung & Befehle:
-
Phase 1 – Einen einfachen C2-Server vorbereiten (auf einem Angreifergerät oder einer kontrollierten VM ausführen). Der Server hört auf Port 9999 und gibt empfangene Daten zurück.
-
Phase 2 – Auf dem Ziel-Windows-Host eine PowerShell-Hintertür starten die eine TCP-Verbindung zum C2-Server auf Port 9999 öffnet. Die Nutzlast nutzt native .NET-Klassen, um die Erstellung eines separaten ausführbaren Programms zu vermeiden und eine „living-off-the-land“-Vorgehensweise zu simulieren.
-
Phase 3 – Optionaler Proxy-Hop: Das PowerShell-Skript kontaktiert zuerst einen lokalen HTTP-Proxy (der auf 127.0.0.1:8080 lauscht), der den TCP-Verkehr an den entfernten C2-Server weiterleitet und demonstriert, dass der Zielport unverändert bleibt.
Diese Schritte erzeugen Firewall-Ereignisse mit
DestinationPort = 9999und erfüllen damit die Sigma-Regel. -
-
Regressionstest-Skript:
# ------------------------------------------------- # CastleRAT‑stil C2-Simulation – PowerShell # ------------------------------------------------- # 1. C2-Server-Adresse definieren (ersetzen Sie durch Ihre Test-IP) $c2Ip = "10.0.0.50" $c2Port = 9999 # 2. OPTIONAL: Lokalen Proxy definieren (wenn Sie den Proxy-Hop testen möchten) $useProxy = $false $proxyHost = "127.0.0.1" $proxyPort = 8080 # 3. Funktion zum Öffnen eines TCP-Streams (direkt oder über Proxy) function Invoke-C2Connection { param ( [string]$destIp, [int]$destPort, [bool]$viaProxy ) if ($viaProxy) { # Einfache HTTP-CONNECT-Tunnel $proxyUri = "http://$proxyHost`:$proxyPort" $client = New-Object System.Net.Sockets.TcpClient($proxyHost,$proxyPort) $stream = $client.GetStream() $connectRequest = "CONNECT $destIp`:$destPort HTTP/1.1`r`nHost: $destIp`r`n`r`n" $bytes = [System.Text.Encoding]::ASCII.GetBytes($connectRequest) $stream.Write($bytes,0,$bytes.Length) # Proxy-Antwort verwerfen $buffer = New-Object byte[] 1024 $null = $stream.Read($buffer,0,$buffer.Length) Write-Host "[+] Proxy-Tunnel hergestellt" return $stream } else { $client = New-Object System.Net.Sockets.TcpClient($destIp,$destPort) Write-Host "[+] Direkte TCP-Verbindung hergestellt" return $client.GetStream() } } # 4. Verbindung öffnen $stream = Invoke-C2Connection -destIp $c2Ip -destPort $c2Port -viaProxy:$useProxy # 5. Einfaches Signal senden $beacon = "CastleRAT Beacon $(Get-Date -Format o)`n" $bytes = [System.Text.Encoding]::UTF8.GetBytes($beacon) $stream.Write($bytes,0,$bytes.Length) Write-Host "[+] Beacon gesendet" # 6. Kanal für kurze Zeit geöffnet halten (Persistenz simulieren) Start-Sleep -Seconds 15 # 7. Bereinigung $stream.Close() Write-Host "[+] Verbindung geschlossen" -
Bereinigungskommandos:
# Sicherstellen, dass alle verbleibenden TCP-Verbindungen geschlossen sind Get-NetTCPConnection -RemotePort 9999 -State Established | ForEach-Object { try { $proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue if ($proc) { Stop-Process -Id $proc.Id -Force } } catch {} } # Entfernen Sie alle temporären Proxy-Listener, falls sie lokal gestartet wurden Stop-Process -Name "python" -Force -ErrorAction SilentlyContinue
Zusätzliche Beobachtungen & Härtungsempfehlungen
- Portbasierte Erkennung anreichern: Kombinieren Sie die Portprüfung mit bekannten bösartigen C2-IPs/Domains, TLS-Fingerprinting oder Abnormalitäten im Datenverkehrsaufkommensheuristik.
- Zulässige Liste legitimer Dienste: Erstellen Sie eine Ausnahmeliste für Anwendungen, die legitimerweise Ports 9999 oder 8888 verwenden (z. B. bestimmte Datenbank- oder Management-Tools).
- Verhaltensbaselines: Richten Sie statistische Modelle ein, um seltene ausgehende Verbindungen zu Hochrisiko-Ports von Nicht-Server-Endpunkten zu kennzeichnen.
- Prozesskontext: Korrelation von Firewall-Ereignissen mit dem ursprünglichen Prozess (
ImageFileName,Befehlzeile). Verbindungen von unerwarteten Prozessen kennzeichnen (z.B.powershell.exe,cmd.exe).
Durch die Anwendung dieser Abwehrmaßnahmen kann die Widerstandsfähigkeit der Regel von der aktuellen 2 auf eine 4-5 Reichweite erhöht werden, was die Anzahl der Fehlalarme erheblich reduziert und gleichzeitig die Erkennung von echtem CastleRAT C2-Datenverkehr bewahrt.