ChainScript: Inseguire un RAT Node.js Attraverso la Blockchain
Detection stack
- AIDR
- Alert
- ETL
- Query
Sommario
ChainScript è un nuovo trojan di accesso remoto (RAT) basato su Node.js che utilizza un’infrastruttura blockchain decentralizzata per la scoperta del command and control (C2). Il malware si basa su una tecnica EtherHiding, interrogando un contratto intelligente Polygon per risolvere dinamicamente gli endpoint WebSocket attivi e ruotare rapidamente l’infrastruttura. Le sue capacità includono shell interattive, manipolazione dei file e ricognizione dei portafogli di criptovaluta.
Indagine
Il gruppo Adversary Pursuit Group (APG) di Blackpoint ha identificato ChainScript durante l’indagine su un’attività di ClickFix che coinvolge pacchetti di installazione di Windows malevoli. Gli analisti hanno osservato componenti malware distribuiti in più directory a tema Microsoft e un contratto intelligente Polygon utilizzato come risolutore. L’indagine ha mostrato che l’attore della minaccia automatizza la distribuzione dei contratti di risoluzione insieme alle build del malware per abilitare transizioni C2 senza soluzione di continuità.
Mitigazione
Le organizzazioni dovrebbero ridurre i percorsi di esecuzione di ClickFix disabilitando la finestra di dialogo Esegui di Windows dove non è necessaria e limitando l’installazione di MSI dalle directory scrivibili dagli utenti. I team di sicurezza dovrebbero monitorare relazioni di processo insolite, in particolare msiexec.exe che attiva wscript.exe o PowerShell. Gli utenti dovrebbero anche essere addestrati a riconoscere i prompt di ingegneria sociale che richiedono l’esecuzione manuale di comandi tramite Win+R.
Risposta
Se viene rilevata un’attività di ChainScript, il sistema interessato dovrebbe essere isolato immediatamente per prevenire movimenti laterali o esfiltrazione di dati attraverso la shell interattiva. Gli addetti alla risposta dovrebbero eseguire una revisione forense completa per payload secondari e persistenza non autorizzata in attività pianificate o chiavi di esecuzione del registro. Le credenziali potenzialmente esposte dovrebbero essere anche ruotate, in particolare quelle associate alle estensioni del browser o ai portafogli di criptovaluta locali.
Flusso di Attacco
Stiamo ancora aggiornando questa parte.
Rilevazioni
Possibili Punti di Persistenza [ASEPs – Hive Software/NTUSER] (via registry_event)
La Possibilità di Esecuzione Tramite Comandi PowerShell Nascosti (via cmdline)
Esecuzione di Binario NodeJS Da Posizione Insusuale (via cmdline)
Processi Figli NodeJS Sospetti [Windows] (via cmdline)
WScript / CScript di LOLBAS (via process_creation)
Possibile Creazione di Attività Pianificata (via powershell)
Attività Pianificata Sospetta (via audit)
IOC (HashSha256) per rilevare: ChainScript: Tracciare un RAT Node.js Attraverso la Blockchain
Rilevamento della Scoperta dell’Infrastruttura C2 Basata su Blockchain di ChainScript [Connessione di Rete di Windows]
Rilevamento dell’Esecuzione di ChainScript RAT tramite PowerShell [Windows PowerShell]
Rilevamento dell’Esecuzione di ChainScript Node.js RAT tramite Msiexec e Wscript [Creazione di Processi Windows]
Esecuzione di Simulazione
-
Narrativa dell’Attacco & Comandi: L’attaccante distribuisce un payload basato su Node.js progettato per imitare ChainScript. L’obiettivo è scoprire l’infrastruttura C2 interrogando un endpoint RPC pubblico di Ethereum. Lo script avvia una connessione WebSocket e invia una JSON-RPC
eth_callrichiesta. Criticamente, la richiesta include il selettore di funzione specifico0x4ab7874eall’interno del payload. Questa azione è intesa a simulare la fase di “scoperta” del ciclo di vita del malware, dove l’indirizzo C2 viene estratto da un contratto intelligente sulla blockchain. -
Script di Test di Regressione:
# Script di simulazione per imitare la scoperta della blockchain di ChainScript tramite WebSocket # Questo richiede un ambiente Node.js o uno strumento in grado di inviare payload specifici JSON-RPC per WebSocket. # Per questa simulazione, utilizziamo uno script PowerShell per inviare il payload grezzo. $wsUri = "wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY" # Utilizzando un endpoint RPC segnaposto $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken try { Write-Host "[+] Collegamento a WebSocket RPC..." $connectTask = $ws.ConnectAsync($wsUri, $ct) $connectTask.Wait() Write-Host "[+] Connessione stabilita." # Il payload specifico contenente il selettore di funzione 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 "[+] Invio del payload di scoperta ChainScript (eth_call + 0x4ab7874e)..." $sendTask = $ws.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) $sendTask.Wait() Write-Host "[+] Payload inviato." } catch { Write-Error "[-] Simulazione fallita: $($_.Exception.Message)" } finally { if ($ws.State -eq 'Open') { $ws.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "Chiusura", $ct).Wait() } $ws.Dispose() Write-Host "[+] Pulizia completata." } -
Comandi di Pulizia:
# Nessuna modifica permanente effettuata dallo script. # Assicurarsi che eventuali processi temporanei di Node.js o file di ascolto locali siano rimossi. Stop-Process -Name "node" -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPchainscript_sim.tmp" -ErrorAction SilentlyContinue