Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

栏目: IT技术 · 发布时间: 5年前

内容简介:这个利用链看着很简单,实际上很难挖,值得好好研究和学习。Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于

这个利用链看着很简单,实际上很难挖,值得好好研究和学习。

0x01 漏洞概述

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

Oracle官方在1月补丁中修复了CVE-2020-2555漏洞,该漏洞位于 Oracle Coherence 组件中。该组件是业内领先的用于解决集群应用程序数据的缓存的解决方案,其默认集成在Weblogic12c及以上版本中。

该漏洞提出了一条新的反序列化gadget,未经身份验证的攻击者通过精心构造的T3请求触发可以反序列化gadget,最终造成远程命令执行的效果。

0x02 漏洞分析

ZDI已经给出了一部分的 分析 ,根据ZDI发出的diff图,不难看出补丁是将 extract 的利用全部移除了,具体的代码可以在 com.tangosol.util.filter.LimitFilter#toString 中找到:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

所以只要跟踪 extract() 的执行流,就能理解漏洞产生的原理。其实总体来说该漏洞应该分为两部分来分析:

  • 反射调用链
  • 反序列化触发点

2.1 反射调用链

首先先来具体看一下 com.tangosol.util.filter.LimitFilter#toString 的逻辑:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

红线所标注的就是漏洞触发的关键点,这里的 m_comparatorm_oAnchorTopm_oAnchorBottom 是我们能通过 LimitFilter 的构造函数进行构造的。当 m_comparator 是继承于 ValueExtractor 接口的类时,会尝试调用 m_comparator.extract() 方法,并将结果放入StringBuffer中。

我们接着来看一下 ValueExtractor 的实现类:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

其中 ReflectionExtractorChainedExtractor 值得我们关注。通过名字不难想到这两个类一个是用于完成反射相关操作的,一个是用于执行链式操作的。

ReflectionExtractor#extract 中,可以很明显的看到存在反射调用的流程:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

简单来说就是获取 oTargetMethod ,并反射调用该对象的具体方法。具体方法由 this.getMethodName() 来控制:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

同样,这个值也是可以通过 ReflectionExtractor 的构造函数来去指定的。现在我们可以指定任意一个方法通过反射调用该方法。但是想要执行代码的话并不是单次反射就能完成的,我们还需要找到一个方法将多条反射调用串起来(就如CommonCollections的利用链相同)。 ChainedExtractor 就完成了这个工作:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

这里的 ValueExtractor 数组是通过 this.getExtractors() 获得的,同样也可以通过 ChainedExtractor 构造函数进行指定:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555) Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

也就是说现在我们只需要构造多条 ReflectionExtractor ,将其置于 ValueExtractor 数组中,就可以触发链式反射调用流程。这一点和CommonCollections的利用链也非常像,最终的执行流可以大致简化为:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

2.2 反序列化触发点

上面我们分析了具体的反射调用流程,这一切都是建立在 LimitFilter#toString 触发时所发生的,为了利用反射调用流程,我们还需要找到一个能够在反序列化时触发 toString 方法的触发点。ZDI这篇文章中说到了一个触发点—— BadAttributeValueExpException#readObject

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

所以只需要设置 BadAttributeValueExpException 的成员变量 valLimitFilter 就可以完成触发。

0x03 漏洞利用

通过上面的分析,我们来梳理一下整体的构造流程:

  1. 构造能串联起来完成命令执行的多条 ReflectionExtractor 反射调用
  2. 利用 ChainedExtractor 将多条 ReflectionExtractor 串联起来
  3. ChainedExtractor 设置为 LimitFilter 的成员变量 m_comparator 的值
  4. 为了完成链式反射调用链,将 LimitFilter 的成员变量 m_oAnchorTop 设置为相应的值(如 Runtime.class
  5. 将构造完成的 LimitFilter 设置为 BadAttributeValueExpException 的成员变量 val 的值
  6. 序列化 BadAttributeValueExpException
  7. 构造包含序列化数据的T3请求,发送请求完成攻击

攻击效果:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)

0x04 其他利用方式

抛砖引玉的说一个其他的利用方式。由于我并不是非常喜欢这样串联利用链的方式(因为不好理解),所以简单的看了下其他的Extractor,看看有没有更加简单的利用方式。这里找到另外一个非常好理解的利用方式。前面的流程都是一样的,唯一不同的是可以不利用 ReflectionExtractorChainedExtractor 这样的组合,同样能完成命令执行。

漏洞产生的原因也从链式反射调用改为表达式注入。相信一说到表达式注入各位就已经知道是用的什么链了,这里就不再过多赘述,就放一张利用效果图:

Oracle Coherence 反序列化漏洞分析(CVE-2020-2555)


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

Data Structures and Algorithm Analysis in Java

Data Structures and Algorithm Analysis in Java

Mark A. Weiss / Pearson / 2011-11-18 / GBP 129.99

Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course wa......一起来看看 《Data Structures and Algorithm Analysis in Java》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

HEX HSV 转换工具
HEX HSV 转换工具

HEX HSV 互换工具