Java安全之Weblogic 2016-3510 分析


Java安全之Weblogic 2016-3510 分析

首發安全客:Java安全之Weblogic 2016-3510 分析

0x00 前言

續前面兩篇文章的T3漏洞分析文章,繼續來分析CVE-2016-3510漏洞,該漏洞一樣是基於,前面的補丁進行一個繞過。

Java安全之初探weblogic T3協議漏洞

Java安全之Weblogic 2016-0638分析

0x01 工具分析

這里還需要拿出上次的weblogic_cmd的工具來看一下CVE-2016-3510的命令執行payload怎么去進行構造。

來到源碼中的Main這個入口點這里,前面的TYPE需要修改為marshall,因為這次是需要使用到MarshalledObject來進行封裝對象。

填入參數,打個斷點測試一下。

前面的都分析過了,在此略過,主要是這張圖片里面的地方傳入命令,並且生成payload,跟蹤進行查看。

這里的blindExecutePayloadTransformerChain方法是返回構造利用鏈的Transformer[]數組內容,這里主要來跟蹤serialData方法。

該方法中是將剛剛構造好的Transformer[]數組傳入進來,聯合下面的代碼構造成了一個惡意的對象,然后調用BypassPayloadSelector.selectBypass方法處理這個惡意的對象。跟蹤查看該方法的實現。

這個位置調用了marshalledObject方法處理payload,跟蹤查看。

marshalledObject內部使用了MarshalledObject的構造方法,將payload作為參數傳遞進去。然后得到該值。這里payload就構造好了。

跟蹤進MarshalledObject里面進行查看。

這個地方又new了一個MarshalledObject.MarshalledObjectOutputStream對象,跟蹤查看。

MarshalledObject.MarshalledObjectOutputStream繼承了ObjectOutputStream對象,並且調用的是父類的構造器。這就和直接new一個ObjectOutputStream沒啥區別。

var1是我們傳遞進來的payload,在這里使用的是CC1的利用鏈,var1也就是一個惡意的AnnotationInvocationHandler對象。var2是ByteArrayOutputStream對象,var3相當於是一個ObjectOutputStream對象。在這里會將var1 的內容進行序列化后寫入到var2里面。

而序列化后的對象數據會被賦值給MarshalledObjectthis.objBytes里面。

執行完成,退回到這一步過后,則是對構造好的MarshalledObject對象調用Serializables.serialize方法進行序列化操作。

0x02 漏洞分析

在前面並沒有找到CVE-2016-0638漏洞的補丁包,那么在這里也可以直接來看到他的利用方式。

前面CVE-2016-0638這個漏洞是基於前面的補丁將payload序列化過后封裝在weblogic.jms.common.StreamMessageImpl類里面,然后進行反序列化操作,StreamMessageImpl類會調用反序列化后的對象的readobject方法達成命令執行的操作。而補丁包應該也是在ClassFileter類里面將上次我們利用的weblogic.jms.common.StreamMessageImpl類給進行拉入黑名單中。

那么在該漏洞的挖掘中又找到了一個新的類來對payload進行封裝,然后繞過黑名單的檢測。

而這次使用得是weblogic.corba.utils.MarshalledObject類來進行封裝payload,將payload序列化過后,封裝到weblogic.corba.utils.MarshalledObject里面,然后再對MarshalledObject進行序列化MarshalledObject,MarshalledObject不在WebLogic黑名列表里面,可以正常反序列化,在反序列化時MarshalledObject對象調用readObject時,對MarshalledObject封裝的序列化對象再次反序列化,這時候繞過黑名單的限制,對payload進行反序列化操作觸發命令執行。

下面來直接看到weblogic.corba.utils.MarshalledObject#readResolve方法的位置

這地方就有意思了,前面在分析工具的時,我們得知構造的繞過方式是將payload序列化放在這個this.objBytes中,而在此如果調用MarshalledObject.readResolve方法就可以對被封裝的payload進行反序列化操作。達到執行命令的效果。

在這里還需要思考到一個問題readResolve這個方法會在什么時候被調用呢?

在Weblogic從流量中的序列化類字節段通過readClassDesc-readNonProxyDesc-resolveClass獲取到普通類序列化數據的類對象后,程序依次嘗試調用類對象中的readObject、readResolve、readExternal等方法。而上一個CVE-2016-0638的漏洞就是借助的readExternal會被程序所調用的特點來進行繞過。我們這次使用的是readResolve這個方法,這個方法也是同理。

后面也還需要知道一個點,就是反序列化操作過后,readResolve具體是如何觸發的?下來來斷點查看就清楚了。

先在InboundMsgAbbrev.ServerChannelInputStream#resolveClass方法先打一個斷點,payload發送完成后,在該位置停下。

在這這里可以看到傳遞過來的是一個MarshalledObject對象,不在黑名單中。

那么下面在readResolve上下個斷點看一下調用棧。

在這里面會被反射進行調用,再前面的一些方法由於不是源代碼進行調式的跟蹤不了。

回到weblogic.corba.utils.MarshalledObject#readResolve方法中查看

和前面說的一樣,這里new了一個ByteArrayInputStream對象,對this.objBytes進行讀取,前面說過我們的payload封裝在this.objBytes變量里面,而這時候new了一個ObjectInputStream並且調用了readObject方法進行反序列化操作。那么這時候我們的payload就會被進行反序列化操作,觸發CC鏈的命令執行。

先來查看docker容器里面的內容

然后執行來到下一行代碼中。

readobject執行過后,再來查看一下docker里面的文件有沒有被創建。

文件創建成功,說明命令能夠執行。

0x03 結尾

本文內容略少,原因是因為很多內容都是前面重復的,並不需要拿出來重新再敘述一遍。這樣的話並沒有太大的意義,如果沒有分析過前面的兩個漏洞,建議先從前面的CVE-2015-4852和CVE-2016-0638這兩個漏洞調試分析起,調試分析完前面的后面的這些繞過方式理解起來會比較簡單。


免責聲明!

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



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