0x00 概述
近年來,Cobalt Strike框架受到了紅隊成員和威脅參與者的廣泛歡迎。由於具有較強的功能性、靈活性和穩定性,它也順理成章成為了商業化命令與控制框架的領導者。
與此同時,防禦人員為了構建Cobalt Strike及其植入物Beacon的可靠籤名,已經進行了大量的研究和努力。這篇文章主要研究一些此前未知的威脅指標(IoC)。由於此前已經有大量的研究人員對Cobalt Strike默認配置的籤名進行過研究,因此我們在這裡就不再重複這方面,而是重點關注一些Cobalt Strike的後漏洞利用功能的內置模塊,例如鍵盤記錄器、Mimikatz和屏幕截圖模塊。
需要說明的是,這裡涉及到的威脅指標和行為特徵都是根據Cobalt Strike作者提供的信息,在4.2版本的Malleable配置文件中作為可以自定義的選項供攻擊者自行設置。
希望這篇文章可以有助於藍隊成員增強其檢測能力,同時能夠促進紅隊成員使用更加複雜和定製化的技術。
0x01 分析
我們知道,Cobalt Strike在執行某些命令時會使用一種特定的模式,被稱為「Fork-n-Run」。Fork-n-Run模式會產生一個新的進程(也被稱為Sacrificial Process),並將功能注入到其中。這種模式有很多好處,其中之一就是可以執行需要長時間運行的任務,不會阻塞Beacon主線程,鍵盤記錄器Keylogger就是一個很好的例子。通常情況下,這些功能需要以反射式DLL的方式來實現。
該框架的最新版本為攻擊者提供了很大的靈活性,使其可以自定義注入進程的功能。但除此之外的其他地方並沒有太大的變動,而這些地方就是我們需要重點關注的位置。
更具體地來說,沒有變動的地方,就是檢索注入模塊的輸出的能力。例如,鍵盤記錄器(Keylogger)模塊可以將按鍵發送回主Beacon進程。但是,鍵盤記錄器模塊是無文件形式的,那麼與主Beacon進程的通信如何發生?
答案是——通過管道。
管道是用於進程之間相互通信的共享內存,具體可以分為兩種類型——命名管道和未命名管道。
顧名思義,命名管道帶有名稱,可以通過引用該名稱的方式進行訪問。
未命名管道需要將其句柄傳遞給其他通信進程,從而交換數據。這個過程可以通過多種方式來完成。
Cobalt Strike同時使用了命名管道和未命名管道在Beacon和Sacrificial Process之間交換數據。
0x02 命名管道
我們發現,當使用一些Cobalt Strike的模塊,將反射式DLL注入Sacrificial Process時,會創建具有可預測的規律的命名管道。
請注意,這些命名管道不是用於橫向移動的SMB命名管道,可以通過Malleable配置文件對其進行自定義。在4.2版本之前,這個命名管道的名稱不能由攻擊者修改。
具體而言,一旦啟動了作業(Job),Beacon就會創建一個命名管道。管道的名稱僅包含十六進位字符,且長度等於模塊名稱的長度(例如:屏幕截圖模塊screenshot,長度為10個字符)。我們發現如下模塊符合上述特徵:
1、鍵盤記錄器 Keylogger
2、屏幕截圖工具 Screenshot
3、Mimikatz (dcsync、dpapi、logonpasswords)
4、Powerpick
5、Net (netview)
下面的截圖中分別展示了執行「keylogger」命令後,Sysmon事件ID 17和18(分別是管道創建和管道訪問)的示例:
我們進行了一些實驗,沒有發現其他的合法應用程式會創建具有相同命名特徵的命名管道。我們隨後打算使用這個特徵來創建Splunk搜索,搜索過程中使用Sysmon和Yara規則來掃描進程內存。
0x03 匿名管道
並非每個Cobalt Strike命令都會創建一個命名管道,其中一些也會使用匿名(未命名)管道來實現相同的目標。下圖展示了發出「execute-assembly」命令後創建的管道:
我們可以對啟動長時間運行的程序集所產生的Sacrificial Process進行調試,以確認這一點:
我們在「ntdll!NtWriteFile」函數上設置了一個斷點,可以看到,Sacrificial Process在試圖寫入的句柄與屬於管道文件系統(NPFS)的未命名文件相關聯:
我們發現,例如「execute-assembly」這類的命令並不像上述示例那樣瑣碎。那麼,我們使用管道可以做些什麼呢?
從理論上說,我們可以針對使用匿名管道的進程建立基線。值得關注的是,本地Windows進程通常不會使用匿名管道。因此,我們就可以尋找連接到匿名管道的Windows進程,並從那裡開始調查。
之所以在這裡要著重提到Windows進程,是因為攻擊者經常會將本地Windows二進位文件作為Malleable配置文件中的Sacrificial Process。我們可以從C2Concealer存儲庫中找到一些已經列出的二進位文件,C2Concealer存儲庫是一個用於創建隨機Malleable配置文件的項目。從下述C2Concealer默認配置中,我們可以發現可執行文件:
''
#################################################
Data set containing post_ex block data, including
spawn-to processes.
#################################################
'''
#CUSTOMIZE THIS LIST#
spawn_processes = ['runonce.exe','svchost.exe','regsvr32.exe','WUAUCLT.exe']
可以看到,上述進程是用於後漏洞利用作業。它們通常都不使用匿名管道與不同的進程進行通信。因此,可以藉助這一點來進行搜索,並最終建立檢測規則。
在實驗過程中,發現以下Windows二進位文件會使用匿名管道進行進程間通信:
·wsmprovhost.exe
·ngen.exe
·splunk.exe
·splunkd.exe
·firefox.exe
上述方法同樣適用於通過Cobalt Strike的dllspawn API執行的自定義反射式DLL,因為基本的通信機制是相同的。對應的一個例子是Outflank的Ps-Tools存儲庫。Ps-Tools是與Cobalt Strike完全兼容的rDLL集合,允許攻擊者監視活動。我們嘗試執行「psw」模塊,該模塊用於枚舉活動的Windows,如下所示:
執行此模塊後,我們可以識別出以前看到的相同的匿名管道行為:
0x04 檢測規則
可以通過多種方法來檢測異常命名管道。作為概念驗證,我們開發了可以用於掃描進程內存和查找活動實例的Yara籤名,以及可以與Sysmon結合使用的Splunk搜索。
Yara規則如下所示:
rule cs_job_pipe
{
meta:
description = "Detects CobaltStrike Post Exploitation Named Pipes"
author = "Riccardo Ancarani & Jon Cave"
date = "2020-10-04"
strings:
$pipe = /\\\\\.\\pipe\\[0-9a-f]{7,10}/ ascii wide fullword
$guidPipe = /\\\\\.\\pipe\\[0-9a-f]{8}\-/ ascii wide
condition:
$pipe and not ($guidPipe)
}
針對Sacrificial Process執行的示例:
.\yara64.exe .\cs-job-pipe.yar -s 9908
cs_job_pipe 9908
0x13372b7b698:$pipe: \\.\pipe\928316d80
0x13372bf3940:$pipe: \\x00\\x00.\x00\\x00p\x00i\x00p\x00e\x00\\x009\x002\x008\x003\x001\x006\x00d\x008\x000\x00
下面的Splunk搜索可用於提醒創建與上述模式匹配的命名管道:
index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName!="" | regex PipeName="^\\\\[a-f0-9]{7,10}$"
在對命名管道進行自動化檢測的過程中,這種方法可能更容易出現誤報。但是,它可以與其他威脅指標結合使用,以獲得更準確的結果。
Splunk搜索的示例可以用於獲取創建匿名管道的進程,會按照頻率由低到高排序:
index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName=""| rare limit=20 Image
0x05 逃避檢測的注意事項
站在紅隊的視角來看,Cobalt Strike 4.2版本可以修改上述命名管道的命名規則。實際上,可以在「post-ex」塊中配置「pipename」參數,名稱最好能與環境中使用的管道近似。
下面展示了一個「post-ex」塊的示例:
post-ex {
set spawnto_x86 "%windir%\\syswow64\\dllhost.exe";
set spawnto_x64 "%windir%\\sysnative\\dllhost.exe";
set obfuscate "true";
set smartinject "true";
set amsi_disable "true";
set pipename "pipe\\CtxSharefilepipe###,";
}
此外,在「spawnto_x86」和「spawnto_x64」參數中,可以選擇合法使用匿名管道的二進位文件,從而減少被檢測到的概率。
可以參考官方的Malleable命令說明,以及ThreatExpress的jQuery示例配置文件,從而更加深入地了解Cobalt Strike的Malleable配置文件選項。
0x06 總結
這篇文章展示了兩種不同的策略,用於識別終端上使用Cobalt Strike的情況。首先,我們分析與默認模塊相關的異常命名管道,然後再將重點轉移到統計學的方法上,以識別更為複雜的攻擊。
對於紅隊隊員來說,不要使用默認設置和默認模塊則變得更為關鍵。對於藍隊防禦者來說,我們希望能夠提供一些如何發現該工具的實用建議,讓大家可以更加廣泛地使用Sysmon等工具對管道異常進行監控。
參考及來源:https://labs.f-secure.com/blog/detecting-cobalt-strike-default-modules-via-named-pipe-analysis/