ChainScript : Tracer un RAT Node.js à travers la Blockchain
Detection stack
- AIDR
- Alert
- ETL
- Query
Résumé
ChainScript est un cheval de Troie d’accès à distance (RAT) nouvellement découvert basé sur Node.js qui utilise une infrastructure blockchain décentralisée pour la découverte de commandes et de contrôles (C2). Le malware s’appuie sur une technique EtherHiding, interrogeant un contrat intelligent Polygon pour résoudre dynamiquement des points de terminaison WebSocket actifs et faire pivoter rapidement l’infrastructure. Ses capacités incluent des shells interactifs, la manipulation de fichiers et la reconnaissance de portefeuilles de cryptomonnaie.
Enquête
L’Adversary Pursuit Group (APG) de Blackpoint a identifié ChainScript lors de l’enquête sur une activité ClickFix impliquant des packages Windows Installer malveillants. Les analystes ont observé des composants de malware mis en scène dans plusieurs répertoires à thème Microsoft et un contrat intelligent Polygon utilisé comme résolveur. L’enquête a montré que l’acteur de la menace automatise le déploiement des contrats résolveurs avec les constructions de malware pour permettre des transitions C2 transparentes.
Atténuation
Les organisations devraient réduire les chemins d’exécution de ClickFix en désactivant le dialogue d’exécution Windows là où il n’est pas requis et en restreignant l’installation MSI à partir de répertoires accessibles en écriture par les utilisateurs. Les équipes de sécurité devraient surveiller les relations de processus inhabituelles, en particulier msiexec.exe engendrant wscript.exe ou PowerShell. Les utilisateurs devraient également être formés à reconnaître les invites d’ingénierie sociale demandant l’exécution manuelle des commandes via Win+R.
Réponse
Si une activité ChainScript est détectée, le système affecté doit être immédiatement isolé pour empêcher les mouvements latéraux ou l’exfiltration de données via le shell interactif. Les intervenants doivent effectuer un examen médico-légal complet pour des charges utiles secondaires et une persistance non autorisée dans les tâches planifiées ou les clés d’exécution du registre. Les éventuels identifiants exposés doivent également être changés, en particulier ceux associés aux extensions de navigateur ou aux portefeuilles de cryptomonnaie locaux.
Flux d’attaque
Nous mettons encore à jour cette partie.
Détections
Points de persistance possibles [ASEPs – Ruche Software/NTUSER] (via registry_event)
Possibilité d’exécution par lignes de commande PowerShell cachées (via cmdline)
Exécution de binaire NodeJS depuis un emplacement inhabituel (via cmdline)
Processus enfants NodeJS suspects [Windows] (via cmdline)
WScript / CScript LOLBAS (via process_creation)
Création de tâche planifiée possible (via powershell)
Tâche planifiée suspecte (via audit)
IOCs (HashSha256) à détecter : ChainScript : Traquer un RAT Node.js à travers la Blockchain
Détecter la découverte d’infrastructure C2 basée sur la blockchain ChainScript [Connexion Réseau Windows]
Détection de l’exécution de ChainScript RAT via PowerShell [PowerShell Windows]
Détection de l’exécution de ChainScript Node.js RAT via Msiexec et Wscript [Création de Processus Windows]
Exécution de Simulation
-
Narration de l’attaque & Commandes : L’attaquant déploie une charge utile basée sur Node.js conçue pour imiter ChainScript. L’objectif est de découvrir l’infrastructure C2 en interrogeant un point de terminaison publique RPC Ethereum. Le script initie une connexion WebSocket et envoie un JSON-RPC
eth_callrequête. Critiquement, la requête inclut le sélecteur de fonction spécifique0x4ab7874edans la charge utile. Cette action est destinée à simuler la phase de « découverte » du cycle de vie du malware, où l’adresse C2 est extraite d’un contrat intelligent sur la blockchain. -
Script de Test de Régression :
# Script de simulation pour imiter la découverte blockchain de ChainScript via WebSocket # Cela nécessite un environnement Node.js ou un outil capable d'envoyer des charges utiles JSON-RPC spécifiques par WebSocket. # Pour cette simulation, nous utilisons un script PowerShell pour envoyer la charge utile brute. $wsUri = "wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY" # Utilisation d'un point de terminaison RPC de remplacement $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken try { Write-Host "[+] Connexion au RPC WebSocket..." $connectTask = $ws.ConnectAsync($wsUri, $ct) $connectTask.Wait() Write-Host "[+] Connexion établie." # La charge utile spécifique contenant le sélecteur de fonction ChainScript $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 "[+] Envoi de la charge utile de découverte ChainScript (eth_call + 0x4ab7874e)..." $sendTask = $ws.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) $sendTask.Wait() Write-Host "[+] Charge utile envoyée." } catch { Write-Error "[-] Échec de la simulation : $($_.Exception.Message)" } finally { if ($ws.State -eq 'Open') { $ws.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "Fermeture", $ct).Wait() } $ws.Dispose() Write-Host "[+] Nettoyage complet." } -
Commandes de Nettoyage :
# Aucune modification persistante n'est effectuée par le script. # Assurez-vous que tous les processus temporaires Node.js ou les fichiers de l'auditeur local sont supprimés. Stop-Process -Name "node" -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPchainscript_sim.tmp" -ErrorAction SilentlyContinue