CS的流量行為特征
關于CS流量行為
首先生成一個payload,在虛擬機中啟用wireshark之后直接執行,可以捕獲一個完整的流量信息。


上線之后執行 whoami,然后退出
打開 wireshark,過濾對話,通過 C2 地址可以過濾出 Cobalt Strike 的流量。我這里按照傳遞數據包的大小排序了,可以看到最上面有一個傳遞 payload (攻擊載荷,Beacon)的會話。

隨后過濾相關數據包,直接推薦直接使用ip來過濾,防止漏掉會話流

我這里因為執行了sleep 0,所以流量看起來非常不清晰,所以這里我重新抓包分析。

隨后加上http協議過濾,可以看到業務流程

首先是checksum8,這個原理來自這兩處
metasploit-framework/uri_checksum.rb at master · rapid7/metasploit-framework (github.com)
Cobalt Strike: Using Known Private Keys To Decrypt Traffic – Part 2 – NVISO Labs[

我們可以看到沒有檢測出我剛剛創建的 payload 存在該特征,但是示例中的URI確實被檢測出該特征。而且在另一次實驗中獲取的該值也符合該設定。所以暫且按下不表。

可以看到這個是符合 CS x64 特征的,而且我確實生成的是該類木馬。

從流量中來看,第一個數據包直接傳輸 CS 的 Beacon,并且沒有加密流量,因為 Beacon本身就是需要自解密的。

第二個數據包中就出現了Cookie字段,里面存放的是一段 Base64 之后的數據。這段數據被稱之為元數據。

分析元數據的部分參考這篇文章
CS Beacon通信分析 - Cobalt Strike (gitbook.io)
https://wbglil.gitbook.io/cobalt-strike/cobalt-strike-yuan-li-jie-shao/cs-mu-biao-shang-xian-guo-cheng
首先我們反編譯cobaltstrike.jar找到 HTTP Beacon每次回連發送元數據請求時使用的方法,Cobalt Strike關于Beacon GET處理的核心代碼在BeaconHTTP里。

從代碼中分析就可以知道,元數據本質上是 Beacon 本地產生一個 16 byte的數據,該數據做 SHA-256 處理之后,前16位作為AES秘鑰,16-32位作為HmacSHA256,用于加解密傳遞的數據。

元數據本身則通過 RSA 公鑰加密,這樣 C2 就和 Beacon 完成了秘鑰協商,接下來通過檢查任務列表中是否存在任務,存在任務則下發任務,Beacon完成任務之后,通過POST返回執行之后的結果。

接下來,我們就需要獲取到本地的 RSA 公鑰,然后就可以解密并生成 AES 的 key,并以此來解密流量。
首先找到cobaltstrike.beacon_keys文件,然后打開它,可以發現它是一個序列化之后的文件。

同樣的從代碼中找到解析文件的地方,使用它的方法來獲取 key。

(KeyPair) CommonUtils.readObject(file, null));
使用BeaconTool直接解析出公私鑰。

darkr4y/geacon: Practice Go programming and implement CobaltStrike's Beacon in Go (github.com)
隨后RSA解密元數據,并且按照代碼中的格式解析,就可以計算出 AES 的 key 和一些額外信息

接下來,在某個心跳包的回包中,我們就可以發現我們的服務器對受控終端發出了一條指令。

解密就可以看到我們服務器下發的指令

至于%COMSPEC%就是 cmd.exe 的絕對路徑。

接下來就可以順理成章的解密返回數據。
對應的返回數據包

對應的解密數據
