CobaltStrike分析-beacon 解析
一、beacon loader
1.1 靜態分析
IDA 逆向,在入口處很容易能夠找到 main 函數的地址 修改前是403040。


重點關注sub_4017F8()。

基于一些特征隨機利用格式化字符串生成了一個字符串buffer, 同時創建了一個新的線程,執行函數sub_4016E6。

直接看sub_401630。

以上面生成的buffer為名字創建了一個命名管道,然后進行判斷,如果命名管道創建成功,ConnectNamedPipe函數將等待客戶端連接到管道。如果成功連接到管道, 使用WriteFile函數將shellcode數據寫入已連接的命名管道。如果寫入成功,則更新指針lpBuffer和剩余要寫入的字節數nNumberOfBytesToWrite。其中 lpbuffer是將要寫入的數據指針,&dword_404020[5]。
返回sub_4017F8返回的是一個函數sub_4017A6(0i64)。

開辟了一塊內存,然后等待sub_401704函數執行返回一個非0值。

sub_401704主要是從FileA也就是前面創建的命名管道中讀取數據,然后寫入lpBuffer指向的位置,也就是說 從FileA中讀取內容,然后寫入v0。
然后調用sub_401595,修改一下數據類型之后有:

利用a3所在的密鑰循環解密shellcode,然后創建線程執行。
至此,loader所做的事已經十分清晰了:
1.創建一個命名管道,格式為%c%c%c%c%c%c%c%c%cMSSE-%d-server
2.將shellcode寫入命名管道
3.從命名管道中取出shellcode然后和密鑰亦或解密
4.執行shellcode
其跳轉順序和參數如下所示:

接下來動態分析一下。
1.2 動態分析
由于cobaltstrike并沒有地址空間隨機化,每次都是在固定位置加載的,所以在上面靜態分析的基礎上很容易下斷動態分析。
創建命令管道。

![image-20230424224308896]
解密過程:

解密后的shellcode寫入這里:

二、beacon 執行
jump rcx之后跳轉到shellcode執行 可以將其dump下來,也就是beacon.dll, Cobaltstrike 的 payload 許多都是和msf相似的,因此如果想要深入的理解CS的相關原理,推薦同時閱讀msf的相關源碼。


使用IDA分析
檢查導出函數:

第一個是反射式DLL注入,限于篇幅,在本篇中不展開分析
第二個是DLL的入口函數。
一直跟進到DLLmain,其分析可以參考https://github.com/bestspear/ReBeacon_ForClang,是wbglil在XCon2022分析的議題,slide可以在這里(https://github.com/Mount4in/Security-Conference-Topic/blob/main/2022XCON/Beacon%E5%AE%8C%E6%95%B4%E9%80%86%E5%90%91%E5%B7%A5%E7%A8%8B%E7%A0%94%E7%A9%B6.pdf)下載。余下內容不再一一詳解,如果感興趣,可以參考雞哥的文章和wbglil的研究展開分析。在后續的文章中,會根據檢測特征和csprofile的繞過按照專題進行分析。

三、總結
本篇主要是總結了一下beacon模式下payload加載的方式,CS馬有大量的思路和msf是相似的,因此,在分析的時候可以同時看一看msf相關的資料。在本人第一次分析的時候,花了比較長時間才dump下來beacon的payload。同時,大部分的CS檢測特征都是在此。而在后續的文章分析中,將會著重的分析CS beacon中使用到的幾種DLL注入方式;beacon config的檢測;同時結合CS profile 的配置,研究一下CS的對抗檢測方式。