背景
2020年3月6日,Oracle Coherence 反序列化远程代码执行漏洞(CVE-2020-2555)的细节被公开,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果。
环境搭建
参考官方发的补丁公告:Oracle Critical Patch Update Advisory - January 2020 Description
这里我们用12.2.1.4测试,拉到idea中,动态调试环境参考:WebLogic-XMLDecoder反序列化分析
漏洞分析
主要参考这篇文章来构建gadgets,CVE-2020-2555: RCE THROUGH A DESERIALIZATION BUG IN ORACLE’S WEBLOGIC SERVER
根据文章所述的source点,cmd + o
快速定位到/coherence_3.7/lib/coherence.jar!/com/tangosol/util/filter/LimitFilter.class
文章中diff的函数就是这个toString
函数了,补丁中去掉了该函数所有的extractor.extract
方法:
toString()
方法,在很多JRE的class中readObject
方法都有实现,比如:javax/management/BadAttributeValueExpException.java
这个点和common-collection5的gadget很像,参考文章:https://y4er.com/post/ysoserial-commonscollections-5/
接着就是寻找哪个可序列化class中的有extract
函数,且方便构造命令执行的,一般来说有这么些点:
Runtime.exec()
Method.invoke()
RMI/JNDI/JRMP
在com/tangosol/util/extractor/ReflectionExtractor.class
中实现了Method.invoke()
的调用:
这里读过common-collection5
的都会熟悉,接下来就要找一个链式调用的点,构造命令执行: /com/tangosol/util/extractor/ChainedExtractor.class
编写EXP
到这里基本已经分析完了,EXP编写参考这个完成gadget调用链:1
2
3
4
5
6
7
8
9
10
11
12
13ObjectInputStream.readObject()
BadAttributeValueExpException.readObject()
LimitFilter.toString()
ChainedExtractor.extract()
ReflectionExtractor.extract()
Method.invoke()
Class.getMethod()
ReflectionExtractor.extract()
Method.invoke()
Runtime.getRuntime()
ReflectionExtractor.extract()
Method.invoke()
Runtime.exec()
这个漏洞基本思路和common-collection一样,编写EXP只有一点点差异,仔细读代码理解调用关系就好了,这里就不公开EXP了。
最后
因为是参考分析写的EXP,分析文章中关键类的位置已经给出了,个人感觉挖掘漏洞过程中最重要的点还是寻找数据传输的过程,之后的学习得在寻找gadget调用关系上多研究研究。