譯者:知道創宇404實驗室翻譯組
原文鏈接:https://www.volexity.com/blog/2022/03/22/storm-cloud-on-the-horizon-gimmick-malware-strikes-at-macos/

img

2021年底,Volexity 發現了一起入侵事件,發生在網絡安全監控服務的局部環境。Volexity 檢測到一個運行frp的系統,或稱為快速反向代理,隨后不久檢測到內部端口掃描。這個流量被確定為未經授權的,該運行 macOS 11.6(Big Sur)的 MacBook Pro系統,被分離出來進行進一步的分析。Volexity 能夠運行 Surge Collect 以獲取系統內存(RAM)并從機器中選擇需要的文件進行分析。因而 一個macOS 變種的惡意軟件植入被發現, Volexity 稱其為 GIMMICK 。在之前的幾個事件中,Volexity 都遇到過 Windows 版本的惡意軟件。

中國間諜黑客 Storm Cloud,以攻擊亞洲各地的組織而聞名,他在定向攻擊中使用了 GIMMICK。它是一個功能豐富、多平臺的惡意軟件組,使用公共云托管服務(如 Google Drive)作為命令控制(C2)通道。新發現的 macOS 變體主要使用 Objective c 編寫,Windows 版本使用兩種語言編寫,.NET 和 Delphi。盡管使用的編程語言和針對的操作系統存在核心差異,但 Volexity 通過共享的C2架構、文件路徑和所有變體使用的行為模式,判斷兩個變體是同款惡意軟件。

img

圖1. GIMMICK 工作流

這篇博文深入分析了GIMMICK的 macOS 變體,同時也展示了 Windows版本 變體的特點。Volexity 通過對受感染系統的內存分析發現了這個樣本,并且從內存和磁盤中恢復了植入程序。文件名和安裝路徑對受害者系統來說是唯一的,并且以一種旨在與用戶的工作性質相融合的方式進行了配置。此外,GIMMICK 被配置為只在工作日與其基于 Google drive 的 c2服務器通信,以便進一步融入目標環境中的網絡通信。

Volexity 能夠從硬盤獲得的文件 SHA1散列是“ fe3a3e65b86d2b07654f9a6104c8cb392c88b7e8”。

與蘋果密切合作,在他們的用戶中加入了對 GIMMICK 惡意軟件的防護。2022年3月17日,蘋果向 XProtect 和 MRT 推出了新的簽名,以阻止和刪除 GIMMICK。雖然在默認情況下,用戶可以通過驗證“‘安裝系統數據文件和安全更新’框在他們的設置中被選中”來確認他們是受到保護的(說明點此處)。

啟動和初始化

在 macOS 上,GIMMICK 支持作為系統上的守護進程啟動或由用戶啟動。如果直接由用戶啟動,它將通過植入一個包含內容的 PLIST 文件來安裝自身作為啟動代理,安裝到/Users//Library/LaunchAgents,如下所示。二進制、 PLIST 和代理的名稱根據樣本而有所不同。在 Volexity 觀察到的案例中,植入物被設計成模仿目標用戶通常啟動的應用程序。值得注意的是,Volexity 發現的GIMMICK 的 Windows 版本沒有想要建立自己的持久性。

<?xml version="1.0" encoding="UTF-8"?>

<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">

<plist version="1.0">

<dict>

<key>Label</key>

<string>com. /[applicationname].va.plist</string>

<key>ProgramArguments</key>

<array>

<string>/Users/#####/Library/Preferences/[pathto/binary]>/</string>

</array>

<key>RunAtLoad</key>

<true/>

<key>StartInterval</key>

<integer>30</integer>

<key>ThrottleInterval</key>

<integer>2</integer>

<key>WorkingDirectory</key>

<string>/Users/<removed>/Library/Preferences/[applicationname]string>

</dict>

</plist>

同樣,植入程序提供了一個卸載函數,可以通過在命令行上添加參數“ uninstall”來實現。這會刪除植程序物和所有相關文件,然后終止進程。

在初始化過程中,樣本使用旋轉加法算法解碼惡意軟件操作中至關重要的幾段數據。

第一個解碼循環產生一個 JSON 對象,其中包含OAuth2憑據,用于建立到 Google Drive 的會話。圖2顯示了一個 JSON 對象的例子:

img

圖2. 一個示例 JSON 對象,其中包含使用 Google Drive 進行身份驗證所需的憑據

第二個循環解碼32字節的字符串“943c3743f72f06e58e60fa147481db83”。此字符串通過一個附加的轉換階段運行,該轉換階段一次將兩個字符轉換為數字表示形式,并將生成的字節寫入緩沖區。在對CCCrypt() 函數的多個調用中,這個緩沖區被用作 AES 密鑰。

img

圖3. AES 密鑰轉換

最后的解碼完成,其結果是一個200字節的配置數據二進制 blob對象,只有一些看似可見的數據邊界。

img

圖4: Config blob

除了這種數據混淆,以及對某些外部文件使用 AES 之外,惡意軟件幾乎不會嘗試混淆系統中它的功能或它的存在。

C2 協議

初始化后, GIMMICK惡意軟件的操作是高度異步的。之前的 Windows 惡意軟件變種已經使用 程序內部線程池技術來應對這個問題。技術是由Delphi的 System.Threading.TThreadPool.NET的 System.Thread and System.Action提供的。然而,macOS 的變種使用蘋果的Grand Central Dispatch (GCD)技術來管理協議。此特性允許開發人員將任務分發到系統管理的線程池中,以便以后進行處理。這些任務被封裝到稱為blocks的自包含對象中,這些對象被安排在調度隊列上進行處理。GCD的確切結構和執行細節相當復雜,超出了本文件的范圍,dan 附錄中提供了一些資源。

惡意軟件中有三個自定義的 ObjectiveC 類,管理C2協議的關鍵方面: DriveManager、 FileManager 和 GCDTimerManager。

DriveManager有幾個職責:

  • 管理 Google Drive 和代理會話。
  • 在內存中維護 googledrive 目錄層次結構的本地映射。
  • 管理 Google Drive 會話上同步任務的鎖。
  • 處理 Google Drive 會話的下載和上傳任務。

根據惡意軟件枚舉命令文件的方式,谷歌驅動器似乎被每個受感染主機的目錄填充。此目錄的名稱因平臺而略有不同。Windows植入程序會生成一個獨特的 GUID 作為其 ID,而 macOS 植入程序則使用蘋果自己的 Hardware UUID。

FileManager 管理一個本地目錄層次結構,其中包含C2信息和處于不同完成階段的命令任務。一些舊版本的 GIMMICK 使用了略有不同的目錄名稱,但它們在最近的幾個變體中保持了一致性。macOS 植入程序將這個層次結構存儲在應用程序主[包]((https://developer.apple.com/library/archive/documentation/CoreFoundation/Conceptual/CFBundles/BundleTypes/BundleTypes.html) 的根目錄中一個名為“ MGD”的目錄中。目錄結構中的每個文件夾都被指定用于在 c2進程中保存單一類型的文件。下表給出了所有目錄及其用途。

Name 解釋 內容
tmp Temporary 用于寫入文件的臨時安全位置; 此目錄中沒有檢查文件的調度代碼
c Credentials 存儲初始化期間解碼的 AES 加密憑據 JSON
e Errors 將錯誤日志存儲為單獨的文件; 錯誤報告為四位數的不透明整數值
p Proxies 存儲由主機和端口組成的代理定義文件,中間以“:”分隔
u Upload Command 存儲的 AES 加密的命令結果,等待上傳
d Download Command 存儲掛起的下載命令文件,每個文件包含要下載的命令文件的Google Drive 路徑
ds D Download Success 下載的等待處理的AES加密命令文件的存儲位置
df Download Failed 失敗的下載命令的臨時位置,在可以重試或清除它們前放在這里
l List Command 存儲命令文件的掛起列表,這些文件指示Google Drive 目錄
ls List Success 存儲包含要下載的遠程 Google Drive 文件路徑的臨時列表文件
lf List Failed T失敗列表命令的臨時位置,在可以重試或清除它們前放在此處

并不是所有GIMMICK的變體使用所有的目錄。例如,macOS 植入程序不使用“ df”目錄,它創建但不訪問“ lf”和“ p”目錄。

GCDTimerManager 管理各種 GCD 對象,以確保植入程序的正常調度,并保存調度計時器的集合及其相應的塊。該惡意軟件創建了幾個命名的調度隊列,用于管理特定的與 c2相關的任務:

名字 目的
SendBaseinfoQueue Regularly generates and sends a system reconnaissance heartbeat message to the C2 containing the following: 定期生成并向 c2發送一個系統偵察信息,包含以下內容:Hardware UUID;Eth0接口的 MAC 地址;CPU 模型字符串;OS 版本字符串
list_request_queue 在“l”目錄中生成一個列表請求文件,其中包含一個格式為“/”的路徑
ls_cmd_queue 解析“ ls”目錄中的文件,并為每一行寫一個相應的下載命令文件到“ d”目錄
ReadCmdQueue 1. readcmdlet 從“ ds”目錄解密和解析文件,并執行包含在其中的命令,將結果保存到“ u”目錄
CredsCheck 檢查 Google Drive 會話是否超時,并在必要時重新進行身份驗證
DriveClearTrashQueue 定期刪除 Google Drive 的垃圾文件
DriveDownQueue 解析存儲在“ d”中的文件,并將相應的文件從 Google Drive 下載到“ ds”目錄
DriveUploadQueue 上傳存儲在“ u”目錄中的反饋文件
DriveFailUploadQueue 第二次嘗試上傳失敗的上傳項目。第二次嘗試無論結果如何,標記為成功。
fileListQueue 解析存儲在“ l”目錄中的文件,并為每個文件更新 Google Drive 的 DriveManager 目錄映射,并生成要下載到“ ls”目錄中的文件列表

此外,GCDTimerManager 使用在初始化過程中解碼的靜態配置信息來設置植入程序的運作時間,限制可能引起防御者注意的連接。它在配置數據的最開始從字符串解析工作時間。這個字符串以一組由連字符分隔的單位數字開始,然后是兩個冒號字符和兩個由連字符分隔的兩位數字。第一組數字表示惡意軟件活動的日期,第0天是星期天。第二組兩位數字表示活動時間范圍。以“1-2-3-4-5: : 00-23”的初始值為準,植入程序將在工作日上午12點至晚上11點激活ー這是圖4所示的配置 blob 中的第一個數據。

命令的生命周期

由于惡意軟件操作的異步特性,命令執行需要分階段的方法。雖然每個步驟是異步執行的,但每個命令都遵循相同的步驟:

1.攻擊者將加密的有效載荷上傳到 Google Drive。

2.“list_request_queue”觸發調度計時器

  • 將寫入“ l”目錄的新請求文件

3.“fileListQueue”觸發調度計時器

  • 從“ l”目錄讀取列表請求
  • 從 Google Drive 會話更新 DriveManager 狀態
  • 將列表文件拖放到“ ls”目錄中

4.“ls_cmd_queue” 觸發調度計時器

  • 從“ ls”目錄解析列表文件
  • 為“ d”目錄中的每個遠程文件放入下載命令文件
  • 從“ ls”目錄中刪除列表文件

5.“DriveDownloadQueue” 觸發調度計時器

  • 枚舉“d”目錄中的文件
  • 將下載的命令文件排隊到“ ds”目錄
  • 下載完成后,刪除遠程 Google Drive 文件和本地下載命令文件的隊列

6.“ReadCmdQueue” 觸發調度計時器

  • 從“ ds”目錄讀取和解密命令文件
  • 處理命令執行
  • 刪除本地命令文件
  • 將加密的“反饋”文件寫入“ u”目錄

7.“DriveUploadQueue” 觸發調度計時器

  • 枚舉“u”目錄中的文件
  • 將結果文件的上傳排成隊列
  • 上載完成后,對本地結果文件的刪除進行排隊

命令和反饋

命令作為“ds”目錄中的加密文件到達系統,一旦使用植入程序的靜態 AES 密鑰解密,將生成 JSON 對象。命令解析器只讀取四個 JSON 字段。

Name Type
CMDType Number
content String
params String
savepath String

雖然每個命令 JSON 必須有一個CMDType 字段,但是所需的字段因命令而異。下表總結了可用的命令及其必需字段。

Enum 描述 附加必需的 JSON 字段
0 傳輸基本系統信息 None
1 上傳文件到 C2 params
2 Download file to client content, savepath
3 執行 shell 命令并將輸出寫入 C2 params
4 設置客戶端的 Google Drive 計時器間隔 params
5 為客戶端信息心跳消息設置客戶端計時器間隔 params
6 覆蓋目標工作時間信息 params

對C2的反饋也被格式化為 JSON,其字段與命令非常相似。但是,所有反饋 JSON 對象都有一個額外的必需字段“ UUID”,該字段由設備的 Hardware UUID 填充。

總結

Storm Cloud 是一個高級的和多功能的黑客,調整其工具集,以配合攻擊目標的不同的操作系統。他們利用內置的操作系統工具、開源工具和定制的惡意軟件植入來實現他們的目標。利用 c2的云平臺,比如使用 Google Drive,增加了不被網絡監控解決方案發現的可能性。加上惡意軟件只在受害者工作日發出信號這一事實,其隱蔽性更甚。

排除平臺因素,GIMMICK 惡意軟件組的樣本相當龐大和復雜,部分原因在于其異步設計的復雜性,例如它的線程和鎖定機制。將這個惡意軟件移植到一個新的操作系統(macOS)并使其適應這個系統的工作并非輕而易舉的事情,這表明它背后的黑客擁有充足的資源、嫻熟的技能和多才多藝。值得注意的是,Volexity 只觀察到過 Storm Cloud 使用過 GIMMICK (macOS 和 Windows版本)。然而,這個惡意軟件植入程序是否由 Storm Cloud開發或專有還是不確定的

附錄

以下資源描述了蘋果的Grand Central Dispatch:


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1854/