CobaltStrike逆向學習系列(12):RDI 任務釋出流程分析
這是[信安成長計劃]的第 12 篇文章
0x00 目錄
0x01 任務構建
0x02 結果處理
0x03 功能 DLL 分析
之前的分析都是針對整個 CS 的框架來進行的,但是功能也是整個 C2 中相當重要的部分,接下來幾篇文章會對基本的功能型別的流程進行分析
0x01 任務構建
CS 自帶的 RDI 型別的功能也有好多,但所有的構建等也都是大同小異了,這裡以 HashDump 來進行分析,HashDump 有兩種觸發方式,一種是在介面上直接點選,一種是通過命令
這兩種方式在執行前都會去判斷當前使用者的許可權是否是管理員,如果是才會去執行,而這兩種不同的觸發方式所使用的檢測許可權也是在不同位置的
如果是在介面上點選的話,它會在 cna 指令碼中直接進行判斷
如果通過命令的話,它會在 BeaconConsole 處理的時候直接來判斷
而判斷方法就是直接判斷使用者名稱是否帶星號,因為在初始化 BeaconEntry 的時候就已經進行了設定,如果是管理員的話,會直接在名字尾部追加星號
但是無論他們走哪個流程來處理,最終都會通過 TaskBeacon 來進行任務的構建
判斷架構也是 BeaconEntry 就已經處理好的
然後先來看一下 HashdumpJob 的內容,可以看到它繼承自 Job,而且裡面也沒有上面所要呼叫的 spawn,所以這也一定是繼承過來的
在 Job 中明顯能夠看出來有六個函式需要自己來實現
其中最關鍵的就是 getDLLName、getPipeName、getCallbackType,至於其他設定描述等對於實際的執行也沒有那麼大的影響
getDLLName 是用來獲取所需要呼叫的 DLL 的,getPipeName 是用來通過制定管道將資訊回傳給 Beacon 的,這裡是特殊字元的佔位符,用來後面做 Patch 時候來尋找對應位置的,getCallbackType 是用來決定資訊回傳到 TeamServer 以後用什麼樣的格式來回傳給 Controller 的
理解了上面的內容以後就可以繼續跟入了
首先會通過剛才獲取到的名字,將對應的 DLL 讀取出來
接著根據架構來 Patch 對應的引導頭,並開始構建任務,設定對應的任務號
接著就需要對管道進行處理
它會根據 C2Profile 中設計的命名格式來生成對應的管道名,並在最後將值 Patch 到 DLL 當中
因為 HashDump 功能並不需要進行修復、執行緒修復、混淆等操作,所以這幾步內容都是不需要的
我們也沒有設定 SmartInject,這裡也忽略掉,然後就構建好了一個任務
當前這個任務的內容就是任務號(4個位元組)+ DLLSize(4個位元組)+ DLL
緊接著又構建了一個任務,包括了 JobType、CallbackType、WaitTime、PipeName 以及描述等資訊,這裡的 JobType 之前的任務對應一下,這裡很明顯就是任務號
最後將兩個任務都進行了傳送
這裡它實際上是呼叫了兩次任務釋出,而且這裡也很明顯能看到之前設定的 Description 是用來在控制檯展示的
0x02 結果處理
在結果解密之後,他會先讀取 CallbackType
這裡也很明顯就與之前的設定對應上了
然後會對結果進行處理,對格式進行處理,將憑證新增到 credentials 中,並在最後直接更新上去
這樣也就完成了整個流程
0x03 功能 DLL 分析
在 DLL 中可以很容易的看到 Java 在處理時候所設定的這一串值
然後會直接用這片記憶體的值來連線管道
所以情況也就很明瞭了,在程式中提前寫好固定的值,在 Java 處理的時候,將處理後的值直接替換到這片位置上,用於後續結果通過管道來進行回傳