通過命名管道分析檢測 Cobalt Strike
基本分析
Cobalt Strike 在執行其某些命令時會使用一種稱為“Fork-n-Run”的特定模式。“Fork-n-Run”模式包括產生一個新進程(也稱為犧牲進程)并將shellcode注入其中。
這種模式提供了許多好處,一個是能夠執行長時間運行的任務,例如:“鍵盤記錄器”,不會阻塞主 Beacon 線程。一般來說都是由反射 DLL 實現的。
在Cobalt Strike的最新版本 在如何自定義能力注入過程方面為紅隊提供了極大的靈活性。我們應該更加關注一些沒有太大變化的東西。
更具體地說,一個保持不變的特性是能夠檢索注入模塊的輸出。例如,“鍵盤記錄器”模塊能夠將按下的鍵發送回主信標進程。但是由于“鍵盤記錄器”模塊是完全無文件的,與主信標進程的通信是如何發生的?
答案是:管道!
管道是用于進程相互通信的共享內存。基本上有兩種類型的管道:
命名管道和未命名管道。命名管道,顧名思義,有一個名字,可以通過引用這個名字來訪問。匿名管道,需要將其句柄傳遞給其他通信進程以交換數據。這可以通過多種方式完成。
Cobalt Strike 使用命名管道和未命名管道在信標與其犧牲進程之間交換數據。
命名管道
F-Secure 觀察到,當使用 Cobalt Strike 的一些模塊將反射 DLL 注入犧牲進程時,會創建一個具有可預測模式的命名管道。
請注意,這些命名管道不是用于橫向移動的 SMB 命名管道,可以通過可塑性配置文件進行自定義。在 4.2 版之前,操作員無法修改此命名管道的名稱。
更具體地說,觀察到一旦啟動了“作業”,信標就創建了一個命名管道;管道的名稱僅包含十六進制字符,并且發現其長度等于模塊名稱的長度(例如,屏幕截圖模塊的長度為 10 個字符)。
一些被發現具有這種行為的模塊:
KeyloggerScreenshotMimikatz (dcsync, dpapi, logonpasswords)PowerpickNet (netview
下面的屏幕截圖顯示了執行“keylogger”命令后 Sysmon 事件 ID 17 和 18(分別創建和訪問管道)的示例:


進行了有限數量的實驗,但沒有發現其他合法應用程序可以創建具有相同命名約定的命名管道。我們稍后將使用此信息創建 Splunk 搜索,這些搜索使用 Sysmon 和 Yara 規則來掃描進程內存
匿名管道
并非每個 Cobalt Strike 命令都會創建一個命名管道,其中一些將使用匿名管道來實現相同的結果。
下圖顯示了發出“execute-assembly”命令后創建的管道實例:

我們可以通過調試啟動長時間運行的程序集后產生的犧牲進程來確認:

在“ntdll!NtWriteFile”函數上設置了一個斷點,并且可以看到,犧牲進程試圖寫入的句柄與屬于管道文件系統(Npfs)的未命名文件相關聯:

正如我們所見,發現諸如“execute-assembly”之類的命令并不像上面那么簡單。
理論上,我們可以對使用匿名管道的流程進行基線處理。我們知道本機 Windows 進程并不經常使用匿名管道。因此,我們可以查找連接到匿名管道的 Windows 進程并從那里進行檢測。
攻擊者通常使用本地 Windows 二進制文件作為其可塑性配置文件中的犧牲進程。
'' ############################################# #包含 post_ex 塊數據的數據集,包括spawn-to 進程。################################################# “ '' #自定義此列表# spawn_processes = ['runonce.exe','svchost.exe','regsvr32.exe','WUAUCLT.exe']
可以看出,上述過程用于后開發作業。它們通常都不會使用匿名管道與不同的進程進行通信;因此,可以使用它來執行搜索并最終創建檢測規則。
在實驗過程中,發現以下 Windows 二進制文件使用匿名管道進行進程間通信:
wsmprovhost.exengen.exesplunk.exesplunkd.exefirefox.exe
這同樣適用于通過 Cobalt Strike 的 dllspawn API 執行的自定義反射 DLL,因為底層的通信機制是相同的。
其中一個例子是 Outflank 的Ps-Tools存儲庫。Ps-Tools 是與 Cobalt Strike 完全兼容的 rDLL 集合,允許監控過程活動。讓我們執行“psw”模塊,用于枚舉活動的Windows,如下圖:

執行這個模塊,我們可以識別出我們之前看到的相同的匿名管道行為:

檢測規則
異常命名管道的檢測可以通過多種方式實現。作為概念驗證,我們開發了可用于掃描進程內存和查找實時實例的 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)}
針對犧牲進程的執行示例:
.\yara64.exe .\cs-job-pipe.yar -s 9908 cs_job_pipe 9908 0x13372b7b698:$pipe: \\.\pipe\928316d80 0x13372bf3940:$x0\x0p\x0\\x0\x0p \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}$"
關于使用匿名管道進行自動檢測,這種方法更容易出現誤報。但是,它可以與其他 IOC 結合使用以達到更好的效果。
Splunk 搜索的示例,可用于獲取創建匿名管道的進程,按最低頻率排序:
index="YOUR_INDEX" source="XmlWinEventLog:Microsoft-Windows-Sysmon/Operational" EventCode=17 PipeName=""| rare limit=20 Image
注意事項
從紅隊的角度來看,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”參數中選擇合法使用匿名管道的二進制文件將減少被檢測到的機會。