ChainScript: Verfolgung eines Node.js RATs durch die Blockchain
Detection stack
- AIDR
- Alert
- ETL
- Query
Zusammenfassung
ChainScript ist ein neu entdeckter Remote Access Trojaner (RAT) auf Node.js-Basis, der eine dezentralisierte Blockchain-Infrastruktur für die Entdeckung der Command-and-Control (C2)-Server nutzt. Die Malware setzt auf eine EtherHiding-Technik, bei der ein Polygon-Smart-Contract abgefragt wird, um dynamisch aktive WebSocket-Endpunkte zu ermitteln und die Infrastruktur schnell zu wechseln. Zu ihren Fähigkeiten gehören interaktive Shells, Datei-Manipulationen und die Erkundung von Kryptowährungs-Wallets.
Untersuchung
Die Adversary Pursuit Group (APG) von Blackpoint identifizierte ChainScript während der Untersuchung von ClickFix-Aktivitäten, die bösartige Windows Installer-Pakete beinhalteten. Die Analysten beobachteten Malware-Komponenten, die über mehrere Microsoft-ähnliche Verzeichnisse verteilt waren, sowie einen Polygon-Smart-Contract, der als Resolver diente. Die Untersuchung ergab, dass der Bedrohungsakteur die Bereitstellung von Resolver-Verträgen zusammen mit Malware-Builds automatisiert, um nahtlose C2-Übergänge zu ermöglichen.
Abmilderung
Organisationen sollten die Ausführungspfade von ClickFix reduzieren, indem sie den Windows-Ausführen-Dialog dort deaktivieren, wo er nicht benötigt wird, und die MSI-Installation von benutzerbeschreibbaren Verzeichnissen einschränken. Sicherheitsteams sollten ungewöhnliche Prozessbeziehungen überwachen, insbesondere msiexec.exe spawning wscript.exe oder PowerShell. Benutzer sollten auch darin geschult werden, soziale Ingenieurangriffe zu erkennen, die zu einer manuellen Befehlsausführung über Win+R.
Reaktion
Wird ChainScript-Aktivität erkannt, sollte das betroffene System sofort isoliert werden, um laterale Bewegungen oder Datenausfuhr durch die interaktive Shell zu verhindern. Einsatzkräfte sollten eine vollständige forensische Überprüfung auf sekundäre Nutzlasten und unautorisierte Persistenz in geplanten Aufgaben oder Registry-Run-Schlüsseln durchführen. Potenziell exponierte Anmeldedaten sollten ebenfalls geändert werden, insbesondere solche, die mit Browser-Erweiterungen oder lokalen Kryptowährungs-Wallets verbunden sind.
Angriffsverlauf
Wir aktualisieren diesen Teil noch.
Erkennungen
Mögliche Persistenzpunkte [ASEPs – Software/NTUSER Hive] (via registry_event)
Die Möglichkeit der Ausführung durch versteckte PowerShell-Befehlszeilen (via cmdline)
NodeJS-Binärdatei wird von ungewöhnlichem Ort ausgeführt (via cmdline)
Verdächtige NodeJS-Kindprozesse [Windows] (via cmdline)
LOLBAS WScript / CScript (via process_creation)
Mögliche Erzeugung von geplanten Aufgaben (via powershell)
Verdächtige geplante Aufgabe (via audit)
IOCs (HashSha256) zur Erkennung: ChainScript: Einen Node.js RAT über die Blockchain verfolgen
Erkennung der ChainScript Blockchain-basierten C2-Infrastruktur-Entdeckung [Windows-Netzwerkverbindung]
Erkennung der Ausführung von ChainScript-RAT über PowerShell [Windows PowerShell]
Erkennung der Ausführung des ChainScript Node.js RAT über Msiexec und Wscript [Windows Prozess Erstellung]
Simulation Ausführung
-
Angriffserzählung & Befehle: Der Angreifer setzt eine auf Node.js basierende Nutzlast ein, die darauf ausgelegt ist, ChainScript zu imitieren. Das Ziel ist es, die C2-Infrastruktur zu entdecken, indem ein öffentliches Ethereum-RPC-Endpunkt abgefragt wird. Das Skript initiiert eine WebSocket-Verbindung und sendet eine JSON-RPC
eth_callAnfrage. Entscheidend ist, dass die Anfrage den spezifischen Funktionsselektor0x4ab7874einnerhalb der Nutzlast enthält. Diese Aktion soll die „Entdeckungs“-Phase des Malware-Lebenszyklus simulieren, bei der die C2-Adresse aus einem Smart Contract auf der Blockchain abgerufen wird. -
Regressionstest-Skript:
# Simulationsskript, um die Blockchain-Erkennung von ChainScript über WebSocket zu imitieren # Dies erfordert eine Node.js-Umgebung oder ein Tool, das in der Lage ist, bestimmte WebSocket JSON-RPC-Nutzlasten zu senden. # Für diese Simulation verwenden wir ein PowerShell-Skript, um die Roh-Nutzlast zu senden. $wsUri = "wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY" # Verwenden eines Platzhalter-RPC-Endpunkts $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken try { Write-Host "[+] Verbindung zu WebSocket RPC herstellen..." $connectTask = $ws.ConnectAsync($wsUri, $ct) $connectTask.Wait() Write-Host "[+] Verbindung hergestellt." # Die spezifische Nutzlast, die den ChainScript-Funktionsselektor enthält $payload = '{ "jsonrpc":"2.0", "method":"eth_call", "params":[{ "to":"0x742d35Cc6634C0532925a3b844Bc454e4438f44e", "data":"0x4ab7874e0000000000000000000000000000000000000000000000000000000000000000" }], "id":1 }' $bytes = [System.Text.Encoding]::UTF8.GetBytes($payload) $segment = New-Object ArraySegment[Byte] -ArgumentList @(,$bytes) Write-Host "[+] Senden der ChainScript-Erkennungsnutzlast (eth_call + 0x4ab7874e)..." $sendTask = $ws.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) $sendTask.Wait() Write-Host "[+] Nutzlast gesendet." } catch { Write-Error "[-] Simulation fehlgeschlagen: $($_.Exception.Message)" } finally { if ($ws.State -eq 'Open') { $ws.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "Closing", $ct).Wait() } $ws.Dispose() Write-Host "[+] Aufräumen abgeschlossen." } -
Aufräumkommandos:
# Vom Skript werden keine dauerhaften Änderungen vorgenommen. # Stellen Sie sicher, dass alle temporären Node.js-Prozesse oder lokalen Listener-Dateien entfernt werden. Stop-Process -Name "node" -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPchainscript_sim.tmp" -ErrorAction SilentlyContinue