CVE-2024-21006 Oracle Weblogic Double-JNDInjection RCE挖掘记录

之前提给Oracle的洞,近期官方发Q2季度更新补丁修复了。这个洞是在weblogic新版中发现的一个新的攻击手法:二次JNDI注入,即在JNDI注入过程中触发JNDI注入,进而完成RCE。

1、简述

总的来讲这个漏洞:
1、weblogic在处理客户端的lookup操作时,会根据目标类实现接口的不同从而调用不同的方法,如果实现OpaqueReference接口就会调用目标类的getReferent方法。而在weblogic中存在ForeignOpaqueReference,这个类的getReferent方法可以触发JNDI注入,但是官方对java.naming.factory.initial属性、java.naming.provider.url属性、lookup操作的参数值都做了检验与限制。

2、如果在InitialContext初始化的时候指定了java.naming.factory.object属性为objectfactory类,那么在执行lookup操作时会先调用objectfactory类的getObjectInstance 方法。而weblogic中存在MessageDestinationObjectFactory类,他的getObjectInstance方法可以触发JNDI注入。

综合以上两点,利用weblogic未对java.naming.factory.object属性做限制、MessageDestinationObjectFactory#getObjectInstance可以触发JNDI注入的前提,完成了weblogic的二次JNDI注入利用

2、分析

笔者之前写过有关于JNDI注入的文章:https://pwnull.github.io/2022/jndi-injection-history/ 温故而知新,从而发现了新问题。CVE-2024-20931是在InitialContext初始化的时候触发漏洞,而CVE-2024-21006是在InitialContext初始化的时候植入objectfactory类,在lookup的时候触发漏洞。

weblogic在处理lookup操作的时候,会根据目标类实现接口的不同从而调用不同的方法。代码位于weblogic.jndi.internal.WLNamingManager#getObjectInstance中:实现ClassTypeOpaqueReference接口会调用getObjectClass/getReferent方法、实现OpaqueReference接口会调用getReferent方法。这也是CVE-2023-21839、CVE-2023-21931、CVE-2024-20931 漏洞触发的必经之路

因为CVE-2023-21839、CVE-2024-20931的修复措施,导致在weblogic.jndi.internal.ForeignOpaqueReference#getReferent方法中,InitialContext初始化java.naming.factory.initial属性、java.naming.provider.url属性、lookup的remoteJNDIName值都无法利用。

weblogic.jndi.internal.JNDIUtils#isValidJndiScheme(javax.naming.Name, boolean)

但是仔细观察代码可以发现,当java.naming.factory.initial、java.naming.provider.url都为null时,系统还是会执行InitialContext初始化与lookup操作。但是都为null了 如何才能完成漏洞利用呢?答案就是:java.naming.factory.object属性,这个属性是JNDI注入在高版本JDK中利用比较频繁的一个属性字段。从上面提到文章中可以看到绕过JDK8u121跟JDK8u191的trustURLCodebase修复限制的方法之一,就是Tomcat的BeanFactory#getObjectInstance 而本漏洞利用的是weblogic中的MessageDestinationObjectFactory#getObjectInstance 这个方法最终会调用到MessageDestinationReference#lookupMessageDestination方法触发JNDI注入

综合以上,在weblogic对JNDI操作中java.naming.factory.initial属性、java.naming.provider.url属性、lookup参数值都限制的情况下,利用java.naming.factory.object属性调用到MessageDestinationObjectFactory的getObjectInstance方法,在weblogic中完成了二次JNDI注入的利用实现


CVE-2024-21006 Oracle Weblogic Double-JNDInjection RCE挖掘记录
https://pwnull.github.io/2024/oracle weblogic CVE-2024-21006 Double-JNDInjection RCE analyze/
作者
pwnull
发布于
2024年4月24日
许可协议