0x01 漏洞背景
Weblogic的反序列化漏洞一直以来都受到很多安全研究人员的青睐,但是随着Weblogic自身安全水平的提高,最近很长一段时间已经都没有出现高危的Weblogic反序列化漏洞了。今天想跟大家分享一条在之前的安全研究中发现的全新的Weblogic反序列化利用链,这条链在网上并没有被公开过,通过该利用链可以达到任意文件写入的效果,实现RCE。
0x02 漏洞分析
反序列化的入口是在org.apache.commons.collections.bidimap.DualHashBidiMap类的readObject方法。这里Map map = (Map)in.readObject();代表从类对象中获取一个Map类型的数据字段,而整个类中只有在父类AbstractDualBidiMap中存在Map[]类型的字段maps。所以需要通过控制maps字段来进行反序列化利用链的利用。
在本条利用链中,我们设置maps字段的值为[DeltaMap, null]。
这里调用了父类org.apache.commons.collections.bidimap.AbstractDualBidiMap的putAll方法。由于map类型是com.tangosol.coherence.component.util.DeltaMap,所以这里会继续调用DeltaMap类的entrySet方法。
在DeltaMap类的entrySet方法中调用entrySetImpl,由于this.isRepeatableRead()方法响应的结果为true,则会调用对应的this.ensureReadAll()方法。
在ensureReadAll()方法中会调用this.getReadMap()方法,这个方法会获取__m_ReadMap字段。所以在反序列化利用链中是通过构造__m_ReadMap字段的值来进行攻击传递,在本条利用链中,我们把__m_ReadMap字段赋值为com.bea.core.repackaged.aspectj.weaver.tools.cache.SimpleCache$StoreableCachingMap。
在ensureReadAll()方法中经过对Map类型数据的遍历,最终会调用SimpleCache$StoreableCachingMap类的put方法。
在SimpleCache$StoreableCachingMap类的put方法中,会调用本类的writeToPath方法。
writeToPath方法就是典型的文件写入操作,这就导致了任意文件写入的漏洞。
此利用链的核心在于DualHashBidiMap类,其实在2021年的时候就已经有大佬对DualHashBidiMap类的反序列化问题进行过分析https://mp.weixin.qq.com/s/LC5tdNHI3vGUWp8Ow5MQgw。文中提出了一种通过DualHashBidiMap类和TiedMapEntry类结合进行RCE的利用链,类似于CC6。可惜的是该利用方法并不适用于Weblogic,但我们可以通过本文的思路在Weblogic下进行文件写入,也能变相实现RCE的效果。
0x03 影响版本
该漏洞适用于2023.04 补丁之前的所有版本,在这之后Weblogic增加了白名单机制,只允许反序列化白名单中的类,因此整个利用链不能在最新的Weblogic环境中利用成功。但是整条利用链构思精巧,通过反序列化来达到任意文件写入也值得大家学习。
0x04 漏洞研究
为了方便不熟悉Java的小伙伴也能简单的研究这个漏洞,我们特意把整个漏洞利用过程封装成可独立运行的小工具,如下图所示。
其中要传递的第一个参数是目标IP,第二个参数是目标端口,第三个参数是要上传的文件的本地路径。
DayDayPoc已收录该poc检测工具,poc链接为:
https://www.ddpoc.com/DVB-2024-6934.html
此外DayDayPoc支持在线生成漏洞复现环境,Weblogic的版本可以用CVE-2023-21839这个漏洞的环境,环境链接为:
在该环境下利poc验证截图如下:
此外烽火台实验室已联合产线发布DayDayMap全球网络空间资产测绘平台,通过https://www.daydaymap.com可以进一步评估该漏洞的影响范围。