Cobalt Strike|Beacon原理淺析
- 2020 年 3 月 6 日
- 筆記


Cobalt Strike 作為一種後滲透工具,可以完成偵察、魚叉式釣魚、瀏覽器代理等攻擊。上文中我們介紹了Cobalt Strike 分為客戶端和伺服器兩部分,伺服器端被稱之為Team Server。Team Server既是Beacon payload的控制器,也是Cobalt Strike提供社工功能的主機。Team Server還存儲了Cobalt Strike收集的數據以及日誌記錄。工作模式如下圖所示:

很多同學在Cobalt Strike教程中見到最多的詞就是Beacon,我們今天主要來介紹一下Beacon和Listener。
0x00 Beacon簡介
Beacon是Cobalt Strike運行在目標主機上的payload,Beacon在隱蔽信道上我們提供服務,用於長期控制受感染主機。它的工作方式與Metasploit Framework Payload類似。在實際滲透過程中,我們可以將其嵌入到可執行文件、添加到Word文檔或者通過利用主機漏洞來傳遞Beacon。
Beacon的功能包括以下幾點:
1. 使用HTTP或DNS檢查是否有待執行任務
2. 可連接到多個C2域名
3. 能夠在分段傳輸後自動遷移
4. 與Cobalt Strike緊密集成,通過社工、主機漏洞和會話來傳遞Beacon
Beacon的中文名為信標,像是在網路中告訴我們:「嘿,我是肉雞,我在這…」。我們可以通過下圖來看Beacon的工作原理:

Beacon在目標主機上運行之後,會主動向我們提前設置好的Listener發送請求資訊(叮,您有新的主機已上線)。

Team Server控制器接收到請求後會檢查是否有待執行的任務,如果有就會將任務下發到Beacon。

此處值得一提的是payloading staging,很多攻擊框架都是使用分段的shellcode,以防止shellcode過長,覆蓋到了上一函數棧幀的數據,導致引發異常。要說分段shellcode就不得不提stager,stager是一段很精短的程式碼,它可以連接下載真正的payload並將其注入記憶體。我們使用stager就可以解決shellcode過長的問題。

Cobalt Strike中也支援分段payload:

關於分段payload優勢與劣勢的問題,本文不予討論,這就像是選擇雞還是雞蛋一樣,Cobalt Strike的作者最終選擇了雞蛋,所以…..在Cobalt Strike 3.5.1後的版本可以通過在Malleable C2中添加host_stage選項,以限制分段payload。
在Cobalt Strike 4中應該儘可能多的使用unstage,一方面以保證安全性(因為你無法確保stager下載的stage是否受到中間人攻擊,除非像MSF一樣使用SSL保證安全性)。另一方面如果我們通過層層的代理,在內網進行漫遊,這個時候使用分段的payload如果網路傳輸出現問題,stage沒有載入過去,可能就會錯失一個Beacon,unstage的payload會讓人放心不少。
更多關於stage的參考資料:
https://cloud.tencent.com/developer/news/335831 https://blog.cobaltstrike.com/2016/06/22/talk-to-your-children-about-payload-staging/ https://blog.cobaltstrike.com/2016/06/15/what-is-a-stageless-payload-artifact/
Beacon有兩種通訊策略(與團隊伺服器通訊-CS 中以團隊伺服器作為 C2) 1. 非同步式通訊 = 非同步模式下通訊頻率低、速度慢,如上圖所示:Beacon會主動請求任務列表、然後進入SLEEP狀態。 2. 互動式通訊 = C2 對 Beacon 實時控制 摘抄(Plagiarism)雪師傅文章?
0x01 Beacon分類
根據內置Listener的分類可以將Beacon分為:
1. HTTP and HTTPS Beacon
2. DNS Beacon
3. SMB Beacon
Listener是用來接收Beacon請求資訊的Cobalt Strike模組,本文僅介紹Cobalt Strike內置Listener。
1. HTTP and HTTPS Beacon
HTTP and HTTPS Beacon非常簡單,關鍵是Beacon通過GET請求來下載任務。

需要強調的一點是這兩個窗口中輸入的地址作用並不相同。

2. DNS Beacon
DNS Beacon是我最喜歡的方式,沒有之一。Cobalt Strike使用DNS來完成Beacon check in的工作,如果DNS返回的記錄解析為有需要執行的任務,那Beacon會使用HTTP來完成獲取任務這一過程。具體原理參看下圖:

需要注意的是DNS Beacon現在已經有兩種方式(第二種方式是使用TXT記錄)傳輸Beacon和task list,關於此內容後期的DNS Beacon文章中會特彆強調,歡迎師傅關注後續文章。
3. SMB Beacon
SMB Beacon需要連接到Parent Beacon使用,所有任務均從parent Beacon接收,並通過parent Beacon返回任務結果。它使用了Windows的命名管道,命名管道是Windows進程間通訊機制,允許兩者間通訊、互相查看和操作對方的文件。Cobalt Strike使用這種方式在進程與進程或主機與主機之間通訊,因為基於SMB協議所以被稱之為SMB Beacon。

本文對SMB Beacon不詳細展開,歡迎師傅關注下一篇文章,專門講解SMB Beacon。
0x02 Beacon安全性
設想這樣一個問題,如果有人劫持了你的通訊流量,並可以監聽到你的Beacon向Team Server傳回的數據,這時會發生什麼呢?

答案是什麼都不會發生。因為Beacon內置了多種安全特性(除了第四條):
1. Beacon stage 在連接時會驗證Team Server
2. Beacon 的任務請求和任務輸出都是被加密的
3. Beacon 有重放保護機制
4. Beacon stagers 沒有任何安全機制
當你啟動Team Server並創建了Beacon Listener時,Team Server就會創建公鑰對來保證後續傳輸過程的安全性。我們以分段傳輸payload為例,詳細講解一下Cobalt Strike的安全特性。
1. 當stager下載stage時,公鑰也會被一起發送:

2. 當Beacon stage準備check in的時候,第一步就是要發送關於beacon session的元數據(Metadata)元數據中包含了用戶、PID、電腦名稱、IP地址等等基礎資訊,同時元數據中也包括了Beacon stage創建的一個隨機會話密鑰。為了保證安全性,Beacon stage會使用公鑰加密元數據(含會話密鑰),這意味著只有Team Server才能夠解密該數據包。

3. 當Beacon從Team Server下載任務的時候,團隊伺服器會使用會話密鑰加密這些任務,Beacon stage也會使用會話密鑰來解密任務列表。

4. 同樣在返回任務結果的時候,Beacon stage也會使用會話密鑰對任務輸出加密。

可以看到Raphael在設計Cobalt Strike的時候已經充分的考慮到了它的安全性問題,所以..師傅放心用吧,wink~
0x03 致謝
本文參考引用修改了以下文章的部分或節選內容,感謝各位師傅。
強烈推薦雪師傅的CS硬文:http://blog.leanote.com/post/snowming/62ec1132a2c9 探尋Metasploit Payload模式背後的秘密:https://cloud.tencent.com/developer/news/335831 Out of the Blue:https://www.recordedfuture.com/identifying-cobalt-strike-servers/ Cobalt Strike系列2listener與payload:https://blog.csdn.net/weixin_42140534/article/details/104163391 SMB Beacon Setup and Use:https://www.youtube.com/watch?v=J3BEeIx6Xzk Volatility Plugin for Detecting Cobalt Strike Beacon:https://blogs.jpcert.or.jp/en/2018/08/volatility-plugin-for-detecting-cobalt-strike-beacon.html Meterpreter載荷執行原理分析:https://xz.aliyun.com/t/1709/ CobaltStrike基本功能與使用:https://www.jianshu.com/p/8d823adbc6b5