影响范围
- Oracle WebLogic Server 10.3.6.0.0
- Oracle WebLogic Server 12.1.3.0.0
- Oracle WebLogic Server 12.2.1.3.0
- Oracle WebLogic Server 12.2.1.4.0
漏洞概述
2020年4月Oracle官方发布关键补丁更新公告CPU(Critical Patch Update),其中曝出两个针对WebLogic Server ,CVSS 3.0评分为 9.8的严重漏洞(CVE-2020-2883、CVE-2020-2884),允许未经身份验证的攻击者通过T3协议网络访问并破坏易受攻击的WebLogic Server,成功的漏洞利用可导致WebLogic Server被攻击者接管,从而造成远程代码执行。
补丁分析
该漏洞是对CVE-2020-2555的绕过,Oracle官方提供的CVE-2020-2555补丁中将LimitFilter类的toString()方法中的extract()方法调用全部移除了:
修复之后的Gadget缺失了下面的一环:
BadAttributeValueExpException.readObject()
com.tangosol.util.filter.LimitFilter.toString() // <--- CVE-2020-2555在此处补丁(缺少这一环)
com.tangosol.util.extractor.ChainedExtractor.extract()
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
//...
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
Runtime.exec()
而这里的ChainedExtractor.extract()仍然可以通过ExtractorComparator和AbstractExtractor类来实现访问,例如我们可以通过设置ChainedExtractor为this.m_extractor的实例来实现对ChainedExtractor.extract()的调用:
于此同时有安全研究人员还发现另外一个类——MultiExtractor,该类继承关系如下:
MultiExtractor的extract如下所示,在这里我们可以通过构造aExtractor[i]为ChainedExtractor来调用ChainedExtractor.extract:
这里的aExtractor[i]源自this.getExtractors()方法,该方法如下所示:
所以我们可以通过反射来设置m_aExtrator为ChainedExtractor来实现对ChainedExtractor.extractor的调用,之后发现该类并没有自己的compare函数,使用的是父类的 AbstractExtractor的compare函数:
以上两种方法都需要用到compare(),借鉴ysoserial的CC链,可以通过PriorityQueue来实现,两条Gadget也呼之欲出:
第一条Gadget:
ObjectInputStream.readObject()
PriorityQueue.readObject()
PriorityQueue.heapify()
PriorityQueue.siftDown()
siftDownUsingComparator()
com.tangosol.util.comparator.ExtractorComparator.compare()
com.tangosol.util.extractor.ChainedExtractor.extract()
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
.......
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
Runtime.exec()
第二条Gadget:
ObjectInputStream.readObject()
PriorityQueue.readObject()
PriorityQueue.heapify()
PriorityQueue.siftDown()
siftDownUsingComparator()
com.tangosol.util.extractor.AbstractExtractor.compare()
com.tangosol.util.extractor.MultiExtractor.extract()
com.tangosol.util.extractor.ChainedExtractor.extract()
com.tangosol.util.extractor.ChainedExtractor.extract()
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
.......
com.tangosol.util.extractor.ReflectionExtractor().extract()
Method.invoke()
Runtime.exec()
更多Gadget尽在地下活动中~