Weblogic CVE-2018-3191分析
背景
北京時間10月17日,Oracle官方釋出的10月關鍵補丁更新CPU(Critical Patch Update)中修復了一個高危的WebLogic遠端程式碼執行漏洞(CVE-2018-3191)。該漏洞允許未經身份驗證的攻擊者通過T3協議網路訪問並破壞易受攻擊的WebLogic Server,成功的漏洞利用可導致WebLogic Server被攻擊者接管,從而造成遠端程式碼執行。這個漏洞由Matthias Kaiser,loopx9,Li Zhengdong申報。
補丁分析
如下圖所示
這回的補丁主要增加了兩個大類黑名單,分別是java.rmi.server.RemoteObject和com.bea.core.repackaged.springframework.transaction.support.AbstractPlatformTransactionManager,RemoteObject是用於修補漏洞編號為CVE-2018-3245的漏洞,當時筆者在報這個漏洞的過程中就將所有涉及到RemoteObject相關的poc都提交給了Oracle官方。AbstractPlatformTransactionManager這個黑名單就是用於防止Spring JNDI注入,從官方以前的黑名單上就能看到org.springframework.transaction.support.AbstractPlatformTransactionManager,但是官方沒有想到在com.bea.core.repackaged的相關包還有spring的相關類。其實這兩個包中的類實現幾乎一樣,只是來源於不同的包。
動態分析
通過前一章的靜態分析已經知道CVE-2018-3191所對應的補丁,就是AbstractPlatformTransactionManager,用於防止Spring JNDI注入。在我們的PoC中主要用到JtaTransactionManager這個類。下面來看一下這個類中關鍵的幾個地方。
JtaTransactionManager類繼承自AbstractPlatformTransactionManager,實現了Serializable介面,其中私有屬性userTransactionName是用於JNDI定址。 在Java反序列化中,入口有很多,readObject是最常見的,定位到JtaTransactionManager.readObject方法,實現如下:
繼續跟蹤initUserTransactionAndTransactionManager方法的實現:
在 initUserTransactionAndTransactionManager的方法中就有基於JNDI定址方法lookupUserTransaction 關鍵定址部分程式碼如下:
有了如上的分析,構造PoC也是水到渠成,下面是PoC的關鍵程式碼:
更詳細的關於JNDI的使用可參考作者以前的博文,這裡不再重複。漏洞效果如下圖:
由於這個漏洞利用的gadget是weblogic中自帶的,跟JDK版本無關,所以只要系統能連外網,未禁止T3協議,漏洞就可以利用,威力巨大,請儘快升級到Weblogic最新版。