ChainScript: Rastreando um RAT Node.js Através da Blockchain
Detection stack
- AIDR
- Alert
- ETL
- Query
Resumo
ChainScript é um trojan de acesso remoto (RAT) recém-descoberto baseado em Node.js que utiliza infraestrutura de blockchain descentralizada para descoberta de comando e controle (C2). O malware usa uma técnica EtherHiding, interrogando um contrato inteligente Polygon para resolver dinamicamente endpoints WebSocket ativos e girar rapidamente a infraestrutura. Suas capacidades incluem shells interativos, manipulação de arquivos e reconhecimento de carteiras de criptomoeda.
Investigação
O Blackpoint’s Adversary Pursuit Group (APG) identificou o ChainScript enquanto investigava atividades do ClickFix envolvendo pacotes maliciosos do Windows Installer. Os analistas observaram componentes de malware distribuídos em múltiplos diretórios temáticos da Microsoft e um contrato inteligente Polygon usado como resolvedor. A investigação mostrou que o ator da ameaça automatiza a implantação de contratos de resolução juntamente com as compilações de malware para permitir transições de C2 suaves.
Mitigação
As organizações devem reduzir os caminhos de execução do ClickFix desativando o diálogo Executar do Windows onde não é necessário e restringindo a instalação de MSI a partir de diretórios graváveis pelo usuário. As equipes de segurança devem monitorar relações de processos incomuns, particularmente msiexec.exe gerando wscript.exe ou PowerShell. Os usuários também devem ser treinados para reconhecer prompts de engenharia social que solicitam execução manual de comandos através do Win+R.
Resposta
Se atividade do ChainScript for detectada, o sistema afetado deve ser isolado imediatamente para evitar movimento lateral ou exfiltração de dados através do shell interativo. Os respondedores devem realizar uma revisão forense completa para cargas secundárias e persistência não autorizada em tarefas agendadas ou chaves de execução do registro. Credenciais potencialmente expostas também devem ser rotacionadas, especialmente aquelas associadas a extensões de navegador ou carteiras de criptomoeda locais.
Fluxo de Ataque
Ainda estamos atualizando esta parte.
Detecções
Possíveis Pontos de Persistência [ASEPs – Hive Software/NTUSER] (via registry_event)
A Possibilidade de Execução Através de Linhas de Comando PowerShell Ocultas (via cmdline)
Binário NodeJS Executando de Localização Incomum (via cmdline)
Processos Filhos NodeJS Suspeitos [Windows] (via cmdline)
LOLBAS WScript / CScript (via process_creation)
Possível Criação de Tarefa Agendada (via powershell)
Tarefa Agendada Suspeita (via audit)
IOCs (HashSha256) para detectar: ChainScript: Rastreando um RAT de Node.js Através do Blockchain
Detectar Descoberta de Infraestrutura C2 Baseada em Blockchain do ChainScript [Conexão de Rede do Windows]
Detecção da Execução do ChainScript RAT via PowerShell [Windows PowerShell]
Detecção da Execução do ChainScript Node.js RAT via Msiexec e Wscript [Criação de Processos no Windows]
Execução de Simulação
-
Narrativa de Ataque e Comandos: O atacante implanta uma carga útil baseada em Node.js projetada para imitar o ChainScript. O objetivo é descobrir a infraestrutura C2 consultando um endpoint público Ethereum RPC. O script inicia uma conexão WebSocket e envia um JSON-RPC
eth_callsolicitação. Criticamente, a solicitação inclui o seletor de função específico0x4ab7874edentro da carga útil. Esta ação destina-se a simular a fase de “descoberta” do ciclo de vida do malware, onde o endereço C2 é extraído de um contrato inteligente no blockchain. -
Script de Teste de Regressão:
# Script de simulação para imitar a descoberta de blockchain do ChainScript via WebSocket # Isso requer um ambiente Node.js ou uma ferramenta capaz de enviar cargas úteis específicas de WebSocket JSON-RPC. # Para essa simulação, usamos um script PowerShell para enviar a carga útil bruta. $wsUri = "wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY" # Usando um endpoint RPC de espaço reservado $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken try { Write-Host "[+] Conectando ao WebSocket RPC..." $connectTask = $ws.ConnectAsync($wsUri, $ct) $connectTask.Wait() Write-Host "[+] Conexão estabelecida." # A carga útil específica contendo o seletor de função 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 "[+] Enviando carga útil de descoberta do ChainScript (eth_call + 0x4ab7874e)..." $sendTask = $ws.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) $sendTask.Wait() Write-Host "[+] Carga útil enviada." } catch { Write-Error "[-] Falha na simulação: $($_.Exception.Message)" } finally { if ($ws.State -eq 'Open') { $ws.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "Closing", $ct).Wait() } $ws.Dispose() Write-Host "[+] Limpeza completa." } -
Comandos de Limpeza:
# O script não faz alterações persistentes. # Certifique-se de que quaisquer processos temporários do Node.js ou arquivos de ouvintes locais sejam removidos. Stop-Process -Name "node" -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPchainscript_sim.tmp" -ErrorAction SilentlyContinue