チェーンスクリプト:ブロックチェーンを通じたNode.js RATの追跡
Detection stack
- AIDR
- Alert
- ETL
- Query
概要
ChainScriptは、新たに発見されたNode.jsベースのリモートアクセス型トロイの木馬(RAT)で、コマンド&コントロール(C2)発見に分散型ブロックチェーンインフラを利用します。このマルウェアはEtherHiding技術を使用し、Polygonスマートコントラクトを問い合わせて、アクティブなWebSocketエンドポイントを動的に解決し、迅速にインフラを切り替えます。インタラクティブシェル、ファイル操作、暗号通貨ウォレットの偵察などの機能を持っています。
調査
BlackpointのAdversary Pursuit Group(APG)は、悪意のあるWindowsインストーラーパッケージを含むClickFix活動を調査する中でChainScriptを特定しました。アナリストは、複数のMicrosoftをテーマにしたディレクトリに配備されたマルウェアコンポーネントと、リゾルバーとして使用されるPolygonスマートコントラクトを観察しました。調査により、脅威アクターがリゾルバーコントラクトをマルウェアビルドとともに自動展開し、シームレスなC2トランジションを可能にしていることが示されました。
軽減策
組織は、Windowsの「実行」ダイアログを不要な場合には無効にし、ユーザーが書き込めるディレクトリからのMSIインストールを制限することで、ClickFixの実行パスを減らすべきです。セキュリティチームは、特に msiexec.exe によるプロセス生成 wscript.exe またはPowerShell関係の異常なプロセスを監視すべきです。ユーザーは手動コマンド実行の促しを認識できるように訓練されるべきです Win+R.
対応策
ChainScript活動が検出された場合、影響を受けたシステムは直ちに隔離し、インタラクティブシェルを通じた側方移動やデータ流出を防ぐべきです。対応者は、スケジュールタスクやレジストリのRunキーにおける二次的なペイロードと不正な永続性を徹底的に分析すべきです。特にブラウザ拡張機能やローカル暗号通貨ウォレットに関連付けられた資格情報が露出している場合、それらを刷新すべきです。
攻撃フロー
この部分はまだ更新中です。
検出
持続的可能性のあるポイント [ASEP – Software/NTUSER Hive](レジストリエベント経由)
隠されたPowerShellコマンドラインを介した実行の可能性(cmdline経由)
非一般的な場所から実行されるNodeJSバイナリ(cmdline経由)
疑わしいNodeJS子プロセス【Windows】(cmdline経由)
LOLBAS WScript / CScript(プロセス作成経由)
スケジュールタスク作成の可能性(powershell経由)
疑わしいスケジュールタスク(監査経由)
識別子(HashSha256)を検出:ChainScript:ブロックチェーンを通過するNode.js RATの追跡
ChainScriptブロックチェーンベースのC2インフラ発見を検出【Windowsネットワーク接続】
PowerShellを介したChainScript RATの実行検出【Windows PowerShell】
MsiexecとWscriptを介したChainScript Node.js RATの実行検出【Windowsプロセス創造】
シミュレーション実行
-
攻撃の流れとコマンド: 攻撃者はChainScriptを模倣するよう設計されたNode.jsベースのペイロードを展開します。目的は、公開Ethereum RPCエンドポイントを問い合わせることでC2インフラを発見することです。スクリプトはWebSocket接続を開始し、JSON-RPC
eth_callリクエストを送信します。重要なのは、リクエストがペイロード内の特定の関数セレクタ0x4ab7874eを含んでいることです。このアクションは、マルウェアライフサイクルの「発見」フェーズをシミュレートすることを意図しており、C2アドレスがブロックチェーン上のスマートコントラクトから引き出されます。 -
リグレッションテストスクリプト:
# WebSocketを介したChainScriptブロックチェーン発見を模倣するシミュレーションスクリプト # これは、特定のWebSocket JSON-RPCペイロードを送信可能なNode.js環境またはツールが必要です。 # このシミュレーションでは、PowerShellスクリプトを使用して生のペイロードを送信します。 $wsUri = "wss://eth-mainnet.g.alchemy.com/v2/YOUR_API_KEY" # プレースホルダRPCエンドポイントを使用 $ws = New-Object System.Net.WebSockets.ClientWebSocket $ct = New-Object System.Threading.CancellationToken try { Write-Host "[+] WebSocket RPCに接続中..." $connectTask = $ws.ConnectAsync($wsUri, $ct) $connectTask.Wait() Write-Host "[+] 接続が確立されました。" # 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 "[+] ChainScriptの発見ペイロードを送信中(eth_call + 0x4ab7874e)..." $sendTask = $ws.SendAsync($segment, [System.Net.WebSockets.WebSocketMessageType]::Text, $true, $ct) $sendTask.Wait() Write-Host "[+] ペイロードが送信されました。" } catch { Write-Error "[-] シミュレーションが失敗しました: $($_.Exception.Message)" } finally { if ($ws.State -eq 'Open') { $ws.CloseAsync([System.Net.WebSockets.WebSocketCloseStatus]::NormalClosure, "閉じる", $ct).Wait() } $ws.Dispose() Write-Host "[+] クリーンアップ完了。" } -
クリーンアップコマンド:
# スクリプトによって永続的な変更は行われません。 # 一時的なNode.jsプロセスやローカルリスナファイルを削除することを確認。 Stop-Process -Name "node" -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPchainscript_sim.tmp" -ErrorAction SilentlyContinue