Hackthebox bagel.dll 程式碼審計

lisenMiller發表於2024-07-02

利用ilspy將bagel.dll開啟

關於此目錄有可以說的內容

目錄解析

最上方的bagel是組裝名字(assemble name)

bagel_server 是命令空間(namespace)

下一級分支是類如File,Base,Handler,Orders等(class)

反序列化導致的命令執行漏洞程式碼審計思路

首先看主程式Bagel

1.透過明顯的英語翻譯可以看到main函式執行了兩個函式一個是initialzieserver()和startserver(),初始化服務和開啟服務 服務為wsserver(websocket)

值得關注的是初始化服務中存在MessageReceived(),根據下方關於messagerecevied函式的設計,可以知道此函式利用了handler類中的deserialize方法和serialize方法(反序列化函式)

而此反序列化函式獲取到的內容是json格式的內容。

因此跳轉到handlerle類中看deserialize函式是否被重寫

Handler類

可疑點

1.看到存在typenamehandling=4的設定

2.反序列化的語句是JsonConvert.DeserializeObject<Base>(json,val);

反序列化的物件是從Base類獲取的key-value值

觀察Base類

關注點:

1.Base類繼承於Orders類,因此繼承父類的所有公共函式(public函式)

2.userid和session都是私有成員,且session為Unauthorized

觀察Orders類

提煉:

1.orders類存在三個私有成員filename、order_info和new一個file類

2.存在三個公有函式RemoveOrder、WriteOrder、ReadOrder

其中Readorder讀取檔案內容存在目錄路徑過濾

writeOrder函式使用get時直接返回writefile內容

RemoveOrder函式僅僅設定了getter、setter

Order類內new了一個FIle類,因此可以使用File類設定的函式

觀察File類

提煉:

1.存在兩個類為ReadFile和WriteFile

呼叫readcontent和writecontent函式進行讀寫操作

因此我們可以確定一個路徑,如下圖

圖片來源:0xdf 師傅

需要注意的是使用getter時是不需要引數的情況下,如果呼叫setter就是傳了一個引數才會呼叫

相關文章