CVE-2020-2555:weblogic反序列化漏洞分析


背景

2020年3月6日,Oracle Coherence 反序列化远程代码执行漏洞(CVE-2020-2555)的细节被公开,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果。

环境搭建

参考官方发的补丁公告:Oracle Critical Patch Update Advisory - January 2020 Description
-w1191
-w1456

这里我们用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
-w1235
文章中diff的函数就是这个toString函数了,补丁中去掉了该函数所有的extractor.extract方法:
-w1473

toString()方法,在很多JRE的class中readObject方法都有实现,比如:javax/management/BadAttributeValueExpException.java
-w1065

这个点和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()的调用:
-w1445

这里读过common-collection5的都会熟悉,接下来就要找一个链式调用的点,构造命令执行: /com/tangosol/util/extractor/ChainedExtractor.class
-w1052

编写EXP

到这里基本已经分析完了,EXP编写参考这个完成gadget调用链:

1
2
3
4
5
6
7
8
9
10
11
12
13
ObjectInputStream.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了。
-w1648

最后

因为是参考分析写的EXP,分析文章中关键类的位置已经给出了,个人感觉挖掘漏洞过程中最重要的点还是寻找数据传输的过程,之后的学习得在寻找gadget调用关系上多研究研究。