ysoserial源碼結構分析


1.前言

  之前也花了幾天晚上熟悉了一下commonscollections系列的構造,那么學習一下這個項目是如何設計的也挺重要,多學習大佬如何寫代碼應該也能對自己的代碼能力有提升吧~2333

2.項目結構:

首先代碼結構如上圖所示

exploit文件夾下主要是放一些主要的利用模塊,比如如下兩個例子

 

 這里用java -cp指定在包ysoserial/exploit的JRMPClinent中尋找主類來執行,那么其中的payload位於payloads文件夾下

 比如就如RMIRegistryExploit.java舉例:

首先main函數從命令行接收一些初始化參數,比如目標主機的地址和端口以及要執行的命令,接着訪問遠程注冊表服務

初始化結束后,此時要初始化gadget,這里直接通過包名和payload的值確定我們要利用的類完整路徑,比如這里payload用commonscollections1為例

這里將通過class.forname加載所需要的payload類,接着判斷是否遠程是否為ssl鏈接,如果不是默認非ssl的rmi請求,則upgrade為ssl的rmi請求

 

接着調用exploit進行payload發送,在exploit函數中這種調用方式還有點意思,封裝了一個call方法

這里首先checkingSecurityManager初始化拋出異常

看看callWrapped函數,,這里如何就是個Clallable類的實例,可以看到這里調用call方法

 

而call是定義callable類時就定義好的,因此這里進入call方法內部,主要就是①根據之前的payload調用其getobject方法,來返回對應gadget的實例

然后②這處用了個releasePayload方法,傳入了上文拿到的objectpayload和object,然后感覺這樣設計只是為了代碼的健壯性,這里最后驗證通過class.forname加載的類調用newinstance后是否是releaseableObjectPayload的實例或其父類接口的實例,它父類接口就是ObjectPayload,如果if條件滿足則調用releasese方法

 

payloads文件夾中主要包括注解和一些工具類,包括找class文件,以及生成gadget,判斷java版本的,以及paloadrunner里本地測試gadget,以及也直接封裝了一些反射的方法 

 

 比如payloadrun就可以直接調試gadget,默認也存儲了一些命令

最后幾個類封裝的序列化和反序列化的類,以及封裝的字符串操作的類,以及命令行下根據輸入參數生成payload的generatePayload類

 

以cc1鏈為例,payloadRunner.run來測試gadget

 

那么添加自己的鏈也很容易,只需要實現ObjectPayload接口即可,只需要定義好getObject的返回類型即可

 

 所以整個項目而言,主要包括:

1.exploit類,用於遠程attack

2.payload生成類,用於根據gadget生成序列化字節碼

3.輔助類,序列化、反序列化、字符串處理、反射等重復性操作封裝為輔助類

4.gadget,主要定義為定義好的利用鏈


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM