Java安全之Weblogic 2016-3510 分析

首发安全客:Java安全之Weblogic 2016-3510 分析

0x00 前言

续前面两篇文章的T3漏洞分析文章,继续来分析CVE-2016-3510漏洞,该漏洞一样是基于,前面的补丁进行一个绕过。

Java安全之初探weblogic T3协议漏洞

Java安全之Weblogic 2016-0638分析

0x01 工具分析

这里还需要拿出上次的weblogic_cmd的工具来看一下CVE-2016-3510的命令执行payload怎么去进行构造。

来到源码中的Main这个入口点这里,前面的TYPE需要修改为marshall,因为这次是需要使用到MarshalledObject来进行封装对象。

填入参数,打个断点测试一下。

前面的都分析过了,在此略过,主要是这张图片里面的地方传入命令,并且生成payload,跟踪进行查看。

这里的blindExecutePayloadTransformerChain方法是返回构造利用链的Transformer[]数组内容,这里主要来跟踪serialData方法。

该方法中是将刚刚构造好的Transformer[]数组传入进来,联合下面的代码构造成了一个恶意的对象,然后调用BypassPayloadSelector.selectBypass方法处理这个恶意的对象。跟踪查看该方法的实现。

这个位置调用了marshalledObject方法处理payload,跟踪查看。

marshalledObject内部使用了MarshalledObject的构造方法,将payload作为参数传递进去。然后得到该值。这里payload就构造好了。

跟踪进MarshalledObject里面进行查看。

这个地方又new了一个MarshalledObject.MarshalledObjectOutputStream对象,跟踪查看。

MarshalledObject.MarshalledObjectOutputStream继承了ObjectOutputStream对象,并且调用的是父类的构造器。这就和直接new一个ObjectOutputStream没啥区别。

var1是我们传递进来的payload,在这里使用的是CC1的利用链,var1也就是一个恶意的AnnotationInvocationHandler对象。var2是ByteArrayOutputStream对象,var3相当于是一个ObjectOutputStream对象。在这里会将var1 的内容进行序列化后写入到var2里面。

而序列化后的对象数据会被赋值给MarshalledObjectthis.objBytes里面。

执行完成,退回到这一步过后,则是对构造好的MarshalledObject对象调用Serializables.serialize方法进行序列化操作。

0x02 漏洞分析

在前面并没有找到CVE-2016-0638漏洞的补丁包,那么在这里也可以直接来看到他的利用方式。

前面CVE-2016-0638这个漏洞是基于前面的补丁将payload序列化过后封装在weblogic.jms.common.StreamMessageImpl类里面,然后进行反序列化操作,StreamMessageImpl类会调用反序列化后的对象的readobject方法达成命令执行的操作。而补丁包应该也是在ClassFileter类里面将上次我们利用的weblogic.jms.common.StreamMessageImpl类给进行拉入黑名单中。

那么在该漏洞的挖掘中又找到了一个新的类来对payload进行封装,然后绕过黑名单的检测。

而这次使用得是weblogic.corba.utils.MarshalledObject类来进行封装payload,将payload序列化过后,封装到weblogic.corba.utils.MarshalledObject里面,然后再对MarshalledObject进行序列化MarshalledObject,MarshalledObject不在WebLogic黑名列表里面,可以正常反序列化,在反序列化时MarshalledObject对象调用readObject时,对MarshalledObject封装的序列化对象再次反序列化,这时候绕过黑名单的限制,对payload进行反序列化操作触发命令执行。

下面来直接看到weblogic.corba.utils.MarshalledObject#readResolve方法的位置

这地方就有意思了,前面在分析工具的时,我们得知构造的绕过方式是将payload序列化放在这个this.objBytes中,而在此如果调用MarshalledObject.readResolve方法就可以对被封装的payload进行反序列化操作。达到执行命令的效果。

在这里还需要思考到一个问题readResolve这个方法会在什么时候被调用呢?

在Weblogic从流量中的序列化类字节段通过readClassDesc-readNonProxyDesc-resolveClass获取到普通类序列化数据的类对象后,程序依次尝试调用类对象中的readObject、readResolve、readExternal等方法。而上一个CVE-2016-0638的漏洞就是借助的readExternal会被程序所调用的特点来进行绕过。我们这次使用的是readResolve这个方法,这个方法也是同理。

后面也还需要知道一个点,就是反序列化操作过后,readResolve具体是如何触发的?下来来断点查看就清楚了。

先在InboundMsgAbbrev.ServerChannelInputStream#resolveClass方法先打一个断点,payload发送完成后,在该位置停下。

在这这里可以看到传递过来的是一个MarshalledObject对象,不在黑名单中。

那么下面在readResolve上下个断点看一下调用栈。

在这里面会被反射进行调用,再前面的一些方法由于不是源代码进行调式的跟踪不了。

回到weblogic.corba.utils.MarshalledObject#readResolve方法中查看

和前面说的一样,这里new了一个ByteArrayInputStream对象,对this.objBytes进行读取,前面说过我们的payload封装在this.objBytes变量里面,而这时候new了一个ObjectInputStream并且调用了readObject方法进行反序列化操作。那么这时候我们的payload就会被进行反序列化操作,触发CC链的命令执行。

先来查看docker容器里面的内容

然后执行来到下一行代码中。

readobject执行过后,再来查看一下docker里面的文件有没有被创建。

文件创建成功,说明命令能够执行。

0x03 结尾

本文内容略少,原因是因为很多内容都是前面重复的,并不需要拿出来重新再叙述一遍。这样的话并没有太大的意义,如果没有分析过前面的两个漏洞,建议先从前面的CVE-2015-4852和CVE-2016-0638这两个漏洞调试分析起,调试分析完前面的后面的这些绕过方式理解起来会比较简单。

Java安全之Weblogic 2016-3510 分析的更多相关文章

  1. HeyWeGo小组《Java程序设计》 2015—2016年学期团队项目总结

    HeyWeGo小组<Java程序设计> 2015—2016年学期团队项目总结 题目简介 一个简单的扫雷小游戏,在12*12的方格盘上,首先可以设定雷的个数,然后点击开始程序就会随机布雷,开 ...

  2. Linux下java进程CPU占用率高分析方法

    Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...

  3. java String.split()函数的用法分析

    java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...

  4. 20145225《Java程序设计》 2015—2016年学期课程总结

    20145225<Java程序设计> 2015—2016年学期课程总结 读书笔记链接汇总 1.2016年2月25日 <Java程序设计>课程准备之问卷调查 摘要: 一.你对自己 ...

  5. [转]使用Java Mission Control进行内存分配分析

    jdk7u40自带了一个非常好用的工具,就是Java Mission Control.JRockit Misson Control用户应该会对mission control的很多功能十分熟悉,JRoc ...

  6. JMS 问题java.lang.NoClassDefFoundError: weblogic/security/acl/UserInfo

    run: Exception in thread "main" java.lang.NoClassDefFoundError: weblogic/security/acl/User ...

  7. 左右c++与java中国的垃圾问题的分析与解决

    左右c++与java中国的垃圾问题的分析与解决 DionysosLai(906391500@qq.com)  2014/8/1 问题分析: 之所以会出现中文乱码问题,归根结底在于中文的编码与英文的编码 ...

  8. 文《左右c++与java中国的垃圾问题的分析与解决》一bug分析

    文<左右c++与java中国的垃圾问题的分析与解决>一bug分析 DionysosLai(906391500@qq.com) 2014/10/21 在前几篇一博客<关于c++与jav ...

  9. [译]Java 垃圾回收的监控和分析

    说明:这篇文章来翻译来自于Javapapers 的Java Garbage Collection Monitoring and Analysi 在这个系列的Java垃圾回收教程中,我们将看到可用于垃圾 ...

  10. 老李分享:《Java Performance》笔记1——性能分析基础 1

    老李分享:<Java Performance>笔记1——性能分析基础   1.性能分析两种方法: (1).自顶向下: 应用开发人员通过着眼于软件栈顶层的应用,从上往下寻找性能优化的机会. ...

随机推荐

  1. Java学习手记1——集合

    一.什么是集合 集合是对象的集合,就像数组是数的集合.集合是一种容器,可以存放对象(可以是不同类型的对象). 二.集合的优点(为什么要用集合) 当然,在java里,可以使用数组来存放一组类型相同的对象 ...

  2. 说说Timing这回事(转载)

    本文原始位置:FPGANotes Blog http://wiki.fpganotes.com/doku.php/ise:timing:my_summary Intro 问:一个FPGA设计项目需要用 ...

  3. C语言变量声明加冒号的用法

    有些信息在存储时,并不需要占用一个完整的字节, 而只需占几个或一个二进制位.例如在存放一个开关量时,只有0和1 两种状态, 用一位二进位即可.为了节省存储空间,并使处理简便,C语言又提供了一种数据结构 ...

  4. 织梦dedecms5.7后台进去就卡死解决方法

    症状:进入dede后台点击菜单后,浏览器进入假死状态要等好久才能反应过来. 解决方式:1.打开后台目录dede/templets/ 2.找到index_body.htm文件中的第25行至第35行部分屏 ...

  5. C# DateDateTimePicker设置属性ShowCheckBox为True

    DateDateTimePicker的属性ShowCheckBox为True后,可以使用时间控件的复选框. 但是如果,你想设置CheckBox的选中状态为False的话,那么请注意赋时间值和赋状态值的 ...

  6. Docker实现运行tomcat并部署项目war包,并实现挂载目录

    之前写的有点乱,现在再来整理一下docker的简单部署运行 借鉴博客:https://blog.csdn.net/qq_32351227/article/details/78673591 一.dock ...

  7. SpringBoot笔记十四:消息队列

    目录 什么是消息队列 消息队列的作用 异步通信 应用解耦 流量削峰 RabbitMQ RabbitMQ流程简介 RabbitMQ的三种模式 安装RabbitMQ RabbitMQ交换器路由和队列的创建 ...

  8. Javascript获取图片原始宽度和高度的方法详解

    前言 网上关于利用Javascript获取图片原始宽度和高度的方法有很多,本文将再次给大家谈谈这个问题,或许会对一些人能有所帮助. 方法详解 页面中的img元素,想要获取它的原始尺寸,以宽度为例,可能 ...

  9. 常用命令npm,gulp, node

    npm常用命令: 检查npm模块的安装情况:(以常用模块 grunt为例说明) 1) 检查是否全局安装了模块Grunt: $npm list -g grunt 2) 列出所有已经全局安装的模块:$np ...

  10. WIN10平板如何录制视频,为什么录制屏幕无法播放

    你的平板分辨率太高(系统推荐2736X1824),实际上一半就够了(1368X912),因为大部分传统显示器分辨率只有1280X720这种.把分辨率调低还有很多的好处,因为很多软件在分辨率太高的情况下 ...