WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

admin 2021年5月17日21:01:53评论213 views字数 2264阅读7分32秒阅读模式

复现

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

分析

在coherence包中 com.tangosol.io.ExternalizableLite 存在反序列化接口

其借助com.tangosol.io.ExternalizableLite实现序列化反序列化逻辑

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

在ExternalizableLite中有readObjcet()

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

readObjectInternal()会根据nType进入不同的反序列化函数

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

其中nType在writeObject中由getStreamFormat()决定。

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

代码如下

public static int getStreamFormat(Object o) {    return o == null ? 0 : (o instanceof String ? 6 : (o instanceof Number ? (o instanceof Integer ? 1 : (o instanceof Long ? 2 : (o instanceof Double ? 3 : (o instanceof BigInteger ? 4 : (o instanceof BigDecimal ? 5 : (o instanceof Float ? 14 : (o instanceof Short ? 15 : (o instanceof Byte ? 16 : 11)))))))) : (o instanceof byte[] ? 8 : (o instanceof ReadBuffer ? 7 : (o instanceof XmlBean ? 12 : (o instanceof ExternalizableHelper.IntDecoratedObject ? 13 : (o instanceof ExternalizableLite ? 10 : (o instanceof Boolean ? 17 : (o instanceof Serializable ? 11 : (o instanceof Optional ? 22 : (o instanceof OptionalInt ? 23 : (o instanceof OptionalLong ? 24 : (o instanceof OptionalDouble ? 25 : (o instanceof XmlSerializable ? 9 : 255))))))))))))));}

10对应的是实现了ExternalizableLite接口的类。继续跟进readExternalizableLite(),其使用loadClass进行加载类,不受weblogic黑名单限制。

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

那么现在就可以调用黑名单类中的 readExternal 方法,作者使用的是之前漏洞中使用过的com.tangosol.coherence.rest.util.extractor.MvelExtractor,它实现了ExternalizableLite接口。

在其MvelExtractor的readExternal()中进行了m_sExpr表达式赋值,而m_sExpr是可控的。

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

那么只需要触发extract方法就行了。

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

现在就在于如何触发extract方法。找到com.tangosol.util.aggregator.TopNAggregator.PartialResult类,在他的readExternal()中

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

会自动触发this.instantiateInternalMap(this.m_comparator)

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

这里返回一个map,而其中的comparator可控为我们的MvelExtractor。回头再看上图for循环中的this.add(ExternalizableHelper.readObject(in))

add()方法

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

跟进 super.add(value) com.tangosol.util.SortedBag#add

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

从自身拿到一个map

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

然后进行map.put,跟进java.util.TreeMap#put

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

然后

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

这里进入到MvelExtractor父类的com.tangosol.util.extractor.AbstractExtractor#compare方法,调用了extract方法。

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

然后就成了,但是还有个问题,com.tangosol.util.aggregator.TopNAggregator.PartialResult类并没有实现ExternalizableLite接口,因此readExternal在反序列化时不会被触发,所以需要寻找一个实现了Externalizable接口的类,并能调用ExternalizableHelper.readObject方法。

找到com.tangosol.coherence.servlet.AttributeHolder#readExternal(java.io.DataInput)

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

在其readExternal调用了ExternalizableHelper.readObject,可以触发PartialResult的readExternal。

堆栈

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

EXP

见我的GitHub[1]

思考

在com.tangosol.util.ExternalizableHelper#readObjectInternal中nType有多种类型

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

其他的case应该也有漏洞吧

参考

1.https://mp.weixin.qq.com/s/E-4wjbKD-iSi0CEMegVmZQ

References

[1] 见我的GitHub: https://github.com/Y4er/CVE-2020-14756


分享、点赞、看就是对我们的一种支持!

WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE


本文始发于微信公众号(ChaBug):WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年5月17日21:01:53
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   WebLogic CVE-2020-14756 T3/IIOP 反序列化RCEhttp://cn-sec.com/archives/259551.html

发表评论

匿名网友 填写信息