WebLogic CVE-2020-14756 T3/IIOP 反序列化RCE
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
参考安恒的文章
image.png
在coherence包中 com.tangosol.io.ExternalizableLite
存在反序列化接口
其借助com.tangosol.io.ExternalizableLite
实现序列化反序列化逻辑
image.png
在ExternalizableLite中有readObjcet()
image.png
readObjectInternal()会根据nType进入不同的反序列化函数
image.png
其中nType在writeObject中由getStreamFormat()决定。
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
那么现在就可以调用黑名单类中的 readExternal 方法,作者使用的是之前漏洞中使用过的com.tangosol.coherence.rest.util.extractor.MvelExtractor
,它实现了ExternalizableLite接口。
在其MvelExtractor的readExternal()中进行了m_sExpr表达式赋值,而m_sExpr是可控的。
image.png
那么只需要触发extract方法就行了。
image.png
现在就在于如何触发extract方法。找到com.tangosol.util.aggregator.TopNAggregator.PartialResult
类,在他的readExternal()中
image.png
会自动触发this.instantiateInternalMap(this.m_comparator)
image.png
这里返回一个map,而其中的comparator可控为我们的MvelExtractor。回头再看上图for循环中的this.add(ExternalizableHelper.readObject(in))
add()方法
image.png
跟进 super.add(value) com.tangosol.util.SortedBag#add
image.png
从自身拿到一个map
image.png
然后进行map.put,跟进java.util.TreeMap#put
image.png
image.png
这里进入到MvelExtractor父类的com.tangosol.util.extractor.AbstractExtractor#compare
方法,调用了extract方法。
image.png
然后就成了,但是还有个问题,com.tangosol.util.aggregator.TopNAggregator.PartialResult
类并没有实现ExternalizableLite接口,因此readExternal在反序列化时不会被触发,所以需要寻找一个实现了Externalizable接口的类,并能调用ExternalizableHelper.readObject方法。
找到com.tangosol.coherence.servlet.AttributeHolder#readExternal(java.io.DataInput)
image.png
在其readExternal调用了ExternalizableHelper.readObject,可以触发PartialResult的readExternal。
image.png
在com.tangosol.util.ExternalizableHelper#readObjectInternal中nType有多种类型
image.png
其他的case应该也有漏洞吧
文笔垃圾,措辞轻浮,内容浅显,操作生疏。不足之处欢迎大师傅们指点和纠正,感激不尽。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK