ysoserial源碼結構分析

1.前言

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

2.項目結構:

首先代碼結構如上圖所示app

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方法3d

這裏首先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,主要定義爲定義好的利用鏈

這裏面也用到了泛型,這塊還不太熟悉,下一步學習學習 ==

相關文章
相關標籤/搜索