1. 程式人生 > 其它 >CobaltStrike逆向學習系列(13):RDI 任務執行流程分析

CobaltStrike逆向學習系列(13):RDI 任務執行流程分析

這是[信安成長計劃]的第 13 篇文章

0x00 目錄

0x01 任務號

0x02 功能執行

0x03 結果接收

在上一篇文章中已經講明瞭 RDI 型別的任務在釋出時候的流程,接下來就是執行了,文中不提任務接收與結果回傳,這部分內容在之前也已經分析過了,繼續使用 HashDump 來進行分析

0x01 任務號

按照上一次流程的分析,RDI 在構建的時候實際釋出了兩個任務,一個是 HashDump 的任務號,還有一個是通過 getJobType 獲取到的

根據上一篇文章的流程 HashDump 所呼叫的任務號是 44,這裡的 getJobType 值也是直接在 Job 類當中寫死了 40

同時還有一點比較重要的就是,在第二個任務中所儲存的,正是前面 Patch 到 HashDump 中的管道名

其實根據這些,也就大致能夠推測出後面這個功能就是用來接收 RDI 功能執行結果的

0x02 功能執行

直接看功能執行函式,接收了兩個引數,一個是功能資料,一個是資料大小

再回到 Controller 這邊對比一下,剛開始任務號,然後就是處理過的功能 DLL,前四個位元組是大小

所以,當前總大小應該是 0x14208,但是從引數傳進來的大小並不是這樣

所以跟到功能 DLL 的結尾處看一下,可以發現正是另外的一個任務,

這裡總共有 0x65 個位元組,合起來剛好是 0x1426D

再根據這邊的情況可以看出來,會 while 迴圈來執行

然後通過兩次 ntohl 的轉換,也就得到了任務號和功能長度,然後就直接進執行函數了,這裡就是 switch 找任務號然後執行了

所對應的函式如下

其實裡面所實現的內容是非常多的,包含了他所支援的多種記憶體分配、注入執行等,這些內容全都是通過 C2Profile 的設定來決定到底走哪一個流程

比如說,記憶體申請使用 VirtualAllocEx 還是 NtMapViewOfSection

它所對應的是 0x34,也就是 52

根據相對應的函式走具體的實現 NtMapViewOfSection

VirtualAllocEx

對於實際的注入也是一樣 CreateRemoteThread

RtlCreateUserThread

再或者 NtQueueApcThread 等等

在當前注入等完成以後,會有一個 rundll32 一直在執行,因為它一直在連線管道

0x03 結果接收

然後繼續就回到了功能執行,來執行結果接收,解析等等都是一樣的,直接跟進執行函式,可以很明顯的看到與管道相關的內容

直接取到管道名

接著後續就是建立管道等等操作了

在後續再通過 PeekNamedPipe 獲取管道資訊,確保內容已經寫入了