5

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

 3 years ago
source link: https://y4er.com/post/weblogic-cve-2020-14756/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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

Share on:

参考安恒的文章

image.png

image.png

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

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

image.png

在ExternalizableLite中有readObjcet()

image.png

image.png

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

image.png

image.png

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

image.png

image.png

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黑名单限制。

image.png

image.png

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

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

image.png

image.png

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

image.png

image.png

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

image.png

image.png

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

image.png

image.png

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

add()方法

image.png

image.png

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

image.png

image.png

从自身拿到一个map

image.png

image.png

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

image.png

image.png

image.png

image.png

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

image.png

image.png

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

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

image.png

image.png

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

image.png

image.png

见我的GitHub

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

image.png

image.png

其他的case应该也有漏洞吧

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

文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK