CVE-2020-2555 Weblogic RCE
前言
WebLogic
对于T3
协议和IIOP
协议的处理,天然就会进行反序列化的漏洞点。因此,对于WebLogic
反序列化漏洞的挖掘,主要就是在gadget
的寻找和补丁绕过上。
2020年的1月、4月和7月,WebLogic
先后爆出了三个一脉相承的反序列化CVE
,涉及了七个gadget
。
CVE-2020-2555主要源于在coherence.jar存在着用于gadget构造的类(反序列化构造类)并且利用weblogic默认存在的T3协议进行传输和解析进而导致weblogic服务器反序列化恶意代码最后执行攻击语句。
所以这里就直接去找coherence.jar
包中的gadget
漏洞影响范围:
Oracle Coherence 3.7.1.17
Oracle Coherence & Weblogic 12.1.3.0.0
Oracle Coherence & Weblogic 12.2.1.3.0
Oracle Coherence & Weblogic 12.2.1.4.0
通过研究发现Weblogic 10.3.6.0
版本不受影响范围内,虽然该版本默认自带了Coherence(3.7)
,通过调试发现该版本默认并未启用Coherence
,所以Weblogic 10.3.6.0
不在受影响范围内。
漏洞原理
1 | gadget: |
1 | ReflectionExtractor#extract -> method.invoke(oTarget, this.m_aoParam); |
com.tangosol.util.extractor.ReflectionExtractor
ReflectionExtractor
类的exctract
方法,可以看到通过传输一个oTarget
对象,通过findMethod
反射来获取oTarget
对象指定参数的方法,将其赋值给m_methodPrev
字段,然后最后进行method.invoke
方法调用
试着执行一下:
结果如预期。现在还需要一个方法执行ReflectionExtractor#extract()
com.tangosol.util.extractor.ChainedExtractor
发现ChainedExtractor
的extract
方法可以实现链式调用ChainedExtractor
中传入ReflectionExtractor
数组对象,然后通过ChainedExtractor
对象的extract
方法进行链式调用
试着执行一下:
结果如预期。现在还需要一个方法执行ChainedExtractor#extract()
com.tangosol.util.filter.LimitFilter
直接看toString
,可以看到其中的extractor.extract(this.m_oAnchorTop)
有进行调用
继续看extractor.extract(this.m_oAnchorTop)
中的m_oAnchotTop
,可以看到变量可控,那么就可以替换为Runtime.class
来进行执行命令
1 | Field m_comparator = limitFilter.getClass().getDeclaredField("m_comparator"); |
这里需要注意下,因为ChainedExtractor
是实现了Comparator
接口的。
此时需要一个方法触发LimitFilter#toString()
BadAttributeValueExpException
BadAttributeValueExpException
的反序列化会调用指定对象的toString
方法
此时利用链完成。
POC建议全用反射来进行赋值,要不然会有问题
这篇文章介绍了另外两条链,但是我在
coherence-3.7.1.jar
中没有找到MvelExtractor
类。
文章使用MvelExtractor
替换掉利用链的ChainedExtractor
和ReflectionExtract
;
使用MultiExtractor
作为连接第一条利用链中LimitFilter.toString()
和ChainedExtractor.extract()
的桥梁。LimitFilter.toString()
间接通过MultiExtractor.extract()
调用到ChainedExtractor.extract()
中。
修复方案
Oracle 打在了 LimitFilter.toString() 函数里。Oracle官方提供的CVE-2020-2555补丁中将LimitFilter类的toString()方法中的extract()方法调用全部移除了。
这个修复很神奇,仅仅封锁了三条调用链的入口,而从 MultiExtractor.extract() 经过 ChainedExtractor.extract() 调用到 ReflectionExtractor.extract() 的利用链、以及MvelExtractor.extract() 的利用链依然存在,只要再找一个入口就好了。
后面的CVE-2020-2883
和CVE-2020-14645
都是对相应修复的绕过。
可参考github和github
后两个漏洞复现过程挺迷的,过程都知道了,但是环境一言难尽。
Reference
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2020-2555
https://www.yaowendao.com/2020/09/06/%E4%BB%8EWebLogic%E4%B8%80%E8%84%89%E7%9B%B8%E6%89%BF%E7%9A%84%E4%B8%89%E4%B8%AA%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96CVE%E8%AF%B4%E8%B5%B7/
https://www.cnblogs.com/zpchcbd/p/15629063.html
https://xz.aliyun.com/t/7387