Java安全之Weblogic 2016-3510 分析
Java安全之Weblogic 2016-3510 分析
首发安全客:Java安全之Weblogic 2016-3510 分析
0x00 前言
续前面两篇文章的T3漏洞分析文章,继续来分析CVE-2016-3510漏洞,该漏洞一样是基于,前面的补丁进行一个绕过。
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里面。
而序列化后的对象数据会被赋值给MarshalledObject
的this.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 分析的更多相关文章
- Java 安全之Weblogic 2018-2628&2018-2893分析
Java 安全之Weblogic 2018-2628&2018-2893分析 0x00 前言 续上一个weblogic T3协议的反序列化漏洞接着分析该补丁的绕过方式,根据weblogic的补 ...
- Java安全之Weblogic 2016-0638分析
Java安全之Weblogic 2016-0638分析 文章首发先知:Java安全之Weblogic 2016-0638分析 0x00 前言 续上篇文的初探weblogic的T3协议漏洞,再谈CVE- ...
- Java 安全之Weblogic 2017-3248分析
Java 安全之Weblogic 2017-3248分析 0x00 前言 在开头先来谈谈前面的绕过方式,前面的绕过方式分别使用了streamMessageImpl 和MarshalledObject对 ...
- Java安全之Weblogic 2018-3248分析
Java安全之Weblogic 2018-3248分析 0x00 前言 基于前面的分析,后面的还是主要看补丁的绕过方式,这里就来简单的记录一下. 0x01 补丁分析 先来看看补丁细节 private ...
- HeyWeGo小组《Java程序设计》 2015—2016年学期团队项目总结
HeyWeGo小组<Java程序设计> 2015—2016年学期团队项目总结 题目简介 一个简单的扫雷小游戏,在12*12的方格盘上,首先可以设定雷的个数,然后点击开始程序就会随机布雷,开 ...
- Java安全之Weblogic内存马
Java安全之Weblogic内存马 0x00 前言 发现网上大部分大部分weblogic工具都是基于RMI绑定实例回显,但这种方式有个弊端,在Weblogic JNDI树里面能将打入的RMI后门查看 ...
- Linux下java进程CPU占用率高分析方法
Linux下java进程CPU占用率高分析方法 在工作当中,肯定会遇到由代码所导致的高CPU耗用以及内存溢出的情况.这种情况发生时,我们怎么去找出原因并解决. 一般解决方法是通过top命令找出消耗资源 ...
- java String.split()函数的用法分析
java String.split()函数的用法分析 栏目:Java基础 作者:admin 日期:2015-04-06 评论:0 点击: 3,195 次 在java.lang包中有String.spl ...
- 20145225《Java程序设计》 2015—2016年学期课程总结
20145225<Java程序设计> 2015—2016年学期课程总结 读书笔记链接汇总 1.2016年2月25日 <Java程序设计>课程准备之问卷调查 摘要: 一.你对自己 ...
随机推荐
- SpringCloud-服务间通信方式
接下来在整个微服务架构中,我们比较关心的就是服务间的服务改如何调用,有哪些调用方式? 总结:在springcloud中服务间调用方式主要是使用 http restful方式进行服务间调用 1. 基于R ...
- 2020武汉dotNET俱乐部分享交流圆满结束
经过长达2个多月的准备,终于在12月5日圆满的举行了武汉首届dotNET俱乐部线下分享交流活动.我们一共精心准备了3个目前比较热门的主题,分别如下: Jason分享的<ABP开发框架的扩展应用& ...
- Codeforces Edu Round 51 A-D
A. Vasya And Password 模拟题,将所缺的种类依次填入"出现次数$ >1 $"的位置,替换掉Ta即可. #include <iostream> ...
- ACM训练赛:第20次
这次的题思维都很强,等之后的考试结束会集中精力重新训练一些思维题. A - A simple question CodeForces - 520B 思路: 直接看的话,很容易发现如果 \(n > ...
- MySQL技术内幕InnoDB存储引擎(二)——InnoDB存储引擎
1.概述 是一个高性能.高可用.高扩展的存储引擎. 2.InnoDB体系架构 InnoDB存储引擎主要由内存池和后台线程构成. 其中,内存池由许多个内存块组成,作用如下: 维护所有进程和线程需要访问的 ...
- vue-cli脚手架搭建vue3.0+typescripe项目
新开个项目,小项目,小.顺手就用vue吧,vue3出来也几个月了,直接上了吧.一年多没用vue了,用的时候也得再熟悉,不如直接干3了! vue官方推荐使用的脚手架是 Vite 和 vue-cli ,延 ...
- 廖雪峰官网学习js 数组
indexOf( ) 某字符的位置 slice 相当于string 的substring 切片 a = ['a','b',1,2,3] (5) ["a", "b&q ...
- JavaSE20-线程&同步
1.线程 1.1 基本概念 线程的概念 线程(Thread)是操作系统能够进行运算调度的最小单位.它被包含在进程之中,是进程中的实际运作单位.一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并 ...
- Fastjson 1.2.47 远程命令执行漏洞复现
前言 这个漏洞出来有一段时间了,有人一直复现不成功来问我,就自己复现了下,顺便简单记录下这个漏洞原理,以便后面回忆. 复现过程 网上已经有很多文章了,这里就不在写了.主要记录一下复现过程中遇到的问题 ...
- 【原创】WPF TreeView带连接线样式的优化(WinFrom风格)
一.前言 之前查找WPF相关资料的时候,发现国外网站有一个TreeView控件的样式,是WinFrom风格的,样式如下,文章链接:https://www.codeproject.com/tips/67 ...