三個開源 C&C 框架的流量檢測
工作來源
MALWARE 2018
工作背景
C&C 框架的隱蔽性越來越強且隨著框架代碼的開源,檢測 C&C 框架變得越來越困難。Shodan 的 Malware Hunter 旨在發現在野 C&C 服務器,但側重于已知端口的子集、只能構建可能無法觸發精確響應的通用探測器,并且只能識別已經可以指紋識別的惡意軟件。
端點側的檢測會存在可見性問題,流量側的檢測則更為通用。過往對惡意流量的研究較多,但對 RAT 流量的研究較少。深入理解 C&C 框架使用的常見技術,可以用來幫助設計識別檢測系統。
分析主要針對三個流行的開源 C&C 框架:Metasploit、Empire 和 Pupy:
- Metasploit 是一個綜合的網絡滲透測試工具。Metasploit 的 Meterpreter 是一個多功能 RAT,可以在大多數平臺上運行,并通過許多動態模塊保證靈活性。
- Empire 是一個用 Python 和 Powershell 編寫的 RAT,用戶可以自由選擇傳輸協議和 Payload。Empire 主要使用 HTTPS 進行通信,并通過 Dropbox 或 OneDrive 等公開服務作為 C&C 信道。所有的 Empire 消息都使用 AES 加密,并預先添加一個字段以保存有關會話的元數據,字段使用由指定用戶的 SHA 哈希組成的密鑰進行 RC4 加密。
- Pupy 是一個基于 Python 的跨平臺 RAT,擅長混淆 C&C 通信。Pupy 支持用戶從包含 11 種協議的列表中選擇一種傳輸協議,再使用預先計算的密鑰進行加密。用戶可以將其嵌套使用以進一步增加混淆程度。
通過對輪詢等 C&C 框架的通用行為進行分析,再針對 Metasploit、Empire 和 Pupy 三種典型的 C&C 框架進行適應性調整。依賴被動監測和半主動掃描,期望構建對 RAT 行為的檢測模型。其中半主動掃描分為兩類,一類是非介入掃描,與可疑服務器嘗試建立連接。另一類是介入性掃描,在活動會話中修改數據包查看響應行為。
工作設計
明文
許多 Payload 只是通過通信通道發送純文本命令。實現了一個執行簡單模式匹配的檢測器,并在數據包數據的前 32 個字節中搜索常用命令,例如 ls、cd 和 dir,以及眾所周知的惡意軟件關鍵字,例如 remoteControl。
異或編碼
當未使用 TLS 加密時,Meterpreter Payload 使用自定義協議進行通信,該協議的每個數據字段使用類型長度值 (TLV) 格式定義。通過使用隨機的四字節掩碼 Payload 數據進行異或編碼,然后將掩碼添加到 Payload 之前,可以對這些數據進行混淆。完整的數據包格式如下所示:

可以使用數據包 Payload 中的前四個字節來解碼數據包的前 32 個字節,以嘗試識別“大小”字段、“類型”字段和會話標識符。在 Meterpreter 使用 HTTP 的情況下,只需要檢查頭中的長度是否與數據包的長度相對應。TCP 則更復雜,因為某些 Meterpreter 消息可能比 MTU 大,并且會跨越多個 TCP 數據包。在這種情況下,算法會緩沖所有可能的 Meterpreter 數據包,直到一條消息完整,即緩沖消息的長度等于緩沖數據包的總長度。
HTTP
通用特征:
- 傳輸數據時,傳輸內容是 base64 編碼的,但內容類型仍然是
text/html。 - GET 請求總是類似的,但服務器以可變的 Payload 作為響應,這會導致對同一個 URI 的兩個請求產生不同的響應。
- 大多數情況下,對于給定的會話來說,請求的 URI 不會變。該 URI 要么是固定的,要么是在一組 URI 中隨機選擇的。而正常流量則經常訪問不同的頁面,區別很大。
- 使用的請求頭通常是有限的,但正常流量需要更多額外的功能就會使用更多高級特性,如會話控制或高級安全性。
獨有特征:
- Metasploit 的 GET 請求通常包含特定的請求頭,如
Accept-Encoding: identity和Content-Type: application/octet-stream - Empire 的 HTTP 模塊使用 Cookie 來發送有關客戶端的加密信息,相對于正常流量來說其 Cookie 是動態的。另外,Empire 的 HTTP-COM 模塊也使用 CR-RAY 標頭傳輸客戶端信息,如果 CR-RAY 值與有效的 Cloudflare 服務器哈希不對應,就可以認為這是 Empire 的 HTTP 請求
- Pupy 在所有 GET 請求中都使用相同的 User-Agent:
Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, Gecko) Chrome/41.0.2228.0 Safari/537.36。此外,Pupy 還會生成一個隨機主機名作為 Host 字段的值
一共提煉 25 個特征:User-Agent;Host 字段的熵值;Host 字段的輔音元音比例;變化的會話 Cookie 的比例;TOP3 URI 比例;GET/POST 請求的長度、比例、完整度(請求頭字段的數量加上 cookie 的數量);Server;URI 熵值;URI 長度極值;URI 的輔音元音比例;Meterpreter HTTP 過濾器;Empire HTTP 過濾器;包數;text/html 類型的加密內容。
TLS/SSL
攻擊工具很多采用自簽名的證書,在證書中包含很多可識別的信息。
通用特征:
- 由于 C&C 服務器的存續時間通常較短,因此相關證書通常具有更臨近時期的有效開始時間。
- 攻擊工具通常使用許多不同的 TLS 連接,每個連接都向同一服務器發送少量請求。
獨有特征:
- Meterpreter 的默認證書是自簽名的,并且包含可預測的組織機構名稱,這些名稱是從預置的列表中隨機選擇的
- Pupy 使用的組織機構名稱中包含 CLIENT 和 CONTROL
一共提煉了 11 個特征:TLS 版本;自簽發證書;流平均長度;TCP 數據包數;證書擴展字段數量;證書鏈長度;證書 subject 字段;證書科目成績;Meterpreter 證書過濾器;Pupy 證書過濾器;過期時間;有效時間。
輪詢
輪詢通常會包含三個特征:
- 失陷主機發送常規探針從 C&C 服務器檢索信息
- TCP 連接中斷后會嘗試定期發起新的 TCP 握手
- 攻擊者未發送命令時,失陷主機發送 TCP keep-alive ACK 保活
各個工具的特點如下所示:

構建兩個檢測器,這兩個檢測器都依賴于雙向、TCP 感知時間解析器(TCP-aware time parser),該解析器在不同的網絡環境中提供一致的正規化數據包時間。往返時間 (RTT) 可以使用前人的方法進行校準。
首先使用 TCP 感知時間解析器處理數據包的時間并將數據包合并為消息(應用程序套接字寫入的數據包集合),再將消息聚合到事件(一組反映事務的消息,即 GET 請求和后續響應或 TLS 握手)中。下圖描述了這個過程:

第一個輪詢檢測器
第一個檢測器用于檢測指數退避輪詢,擬合為:

其中 N、k 和 Xi 分別表示基本延遲、未應答包數和事件開始時間。該算法首先查看長度為 6 的窗口內的固定段,并計算 N、k 和 σ 的經驗值。然后通過驗證 N 和 k 都是正數并且具有合理的標準差來檢查這些參數是否一致。如果檢查失敗,算法會將窗口向右移動一個。然后算法循環下一組時間值,如果新計算的參數仍然一致并且它們落在以下范圍內,則將這些值附加到序列中:

其中,參數 15 可以防止小于 15ms 的微小變化影響檢測。最后,在可能的情況下合并輪詢范圍。
第二個輪詢檢測器
第二個檢測器用于檢測均勻分布抖動 ∈ [0, 1] 的恒定延遲輪詢,擬合為:

用 N,d 和 Xk 分別表示基本延遲、平均等待時間和事件開始時間的序列。獲取數據點并使用 Box-Muller 變換將它們轉換為高斯樣本,然后使用 Shapiro-Wilk 檢驗測試擬合的質量。
第三個輪詢檢測器
第三種與輪詢相關的檢測方法是檢查事件長度,它基于與輪詢相關的事件具有相似的長度的假設。該算法計算基于事件的長度的直方圖,如果直方圖偏向一小組長度,則將事件序列標記為潛在的輪詢行為。
非介入掃描
能夠確定惡意流量與特定的工具實現有關時,可以發送特制的數據包觸發響應行為進行進一步確認。例如,一個請求帶有數據中捕獲的會話 Cookie,一個為隨機生成的 Cookie,確定是否部署 Empire。
不能夠確定惡意流量與特定的工具實現有關時,基于深度包檢測獲取響應時間、響應大小和各個處理器生成的特征。例如字節分析處理器用來查看固定窗口的熵值和字節分布,以區分正文中的代碼、文本和隨機值。緩沖區溢出漏洞的攻擊數據包中通常包含 NOP 填充。使用不同索引位置的子串計算香農信息熵作為特征:

下圖顯示了 EDB40869 漏洞利用在不同窗口大小下的熵特征,并為前 5000 個字節中的每個字節提供了起始索引。

介入掃描
識別 C&C 服務器的最有效但最具侵入性的方法是干擾活動連接。重點介紹 Empire 的情況,對 RC4 加密頭中的 session identifier、language、meta、extra flags 與 length 進行比特翻轉測試。Empire 的數據會通過 HTTP 請求頭發送,例如,在 Cookie 或 CF-RAY 中或直接在 HTTP 的正文中。
Empire 的數據格式:

Empire 的 RC4 加密頭:

各字段含義:
- Session ID 是標識 C&C 會話的唯一標識符
- Lang 標識 Payload 使用的語言,可以指定 PowerShell、Python 或 None
- Meta 描述數據包所處的階段,Stage 0 (S0)、Stage 1 (S1)、Stage 2 (S2)、Tasking Request (TR)、Result Post (RP)、Server Response (SR) 或無(不適用)
- Extra 是保留字段
- Length 是 AES 加密數據的長度
Payload Stager 首先向 C&C 服務器發送一個 HTTP GET 請求,并將 Meta 設置為 S0,以檢索下一個階段的命令。接下來發送 HTTP POST 請求,其中包含有關操作系統的信息,并將 Meta 設置為 S1 和 S2。在正常的運行期間,會輪詢發送 HTTP GET 請求,并將 Meta 設置為 TR。如果服務器有命令,將響應 200 并將 Meta 設置為 SR 發送命令。接著,客戶端將發送帶有 SR 標記并包含加密響應內容的 HTTP POST 請求。如果服務器沒有命令,服務器將響應 404,返回 file not found 的 HTML 頁面。
客戶端通常處于 TR 狀態下,這也就是說更改 Lang 或者 Extra 不會改變行為,但將 Meta 與 RP 進行異或將會把 TR 變為 S0,這也就強制服務器重新回到第一階段,而將 Meta 與其他值異或將會導致服務器的解析錯誤。
工作準備
從企業網絡中獲取真實良性流量,并通過實驗環境來獲取真實的 RAT 流量,實驗環境由一個 Kali Linux 組成作為 C&C 服務器,以及未打補丁的 Windows 10、Windows 7、Windows XP SP2、Ubuntu 14.04 和 Ubuntu 15.10 共計五臺主機。
在不同的環境和不同的設置下測試了 Metasploit、Empire 和 Pupy。攻擊流量絕大多數是 TCP,對所有 UDP 流量丟棄處理。良性數據集是從具有大約 3000 個端點的企業網絡中收集的,同樣只保留 TCP 流量。按客戶端切分流量,并隨機均勻采樣 5 分鐘的時間窗口,以避免在訓練分類器時出現嚴重的分類不平衡。

其中一些算法對單個雙向流進行檢測,而其他算法對雙向流或元流(一組源 IP 相同、目的 IP 相同和目的端口相同的流)的集合進行檢測。所有機器學習分類器都使用標準的隨機森林,其中包含 1000 棵樹。
工作評估
通用分類器的結果如下所示,能夠以 92% 的準確率識別攻擊工具,合并準確率為 98.5% 且誤報率低于 0.01%。

工作思考
盡管思科的這個工作比較早,過去了好幾年有些特征實際已經有了很大的變化,但整體對 RAT 流量的研究方法還是值得學習的。而且,這個實驗數據中的噪音太少,和實際環境中的情況還是存在較大差別的。相關的特征也都廣泛應用在了威脅狩獵和各種利用機器學習進行流量分析的方案中,嘗試挖掘檢測效果更好的特征也是防御者持續研究的核心。