Java安全之Weblogic 2016-0638分析
Java安全之Weblogic 2016-0638分析
文章首发先知:Java安全之Weblogic 2016-0638分析
0x00 前言
续上篇文的初探weblogic的T3协议漏洞,再谈CVE-2016-0638, CVE-2016-0638是基于 CVE-2015-4852漏洞的一个绕过。
0x01 环境搭建
补丁环境搭建
这里采用上次的weblogic环境,但是在这里还需要打一个补丁包,来修复 CVE-2015-4852漏洞后,对该漏洞进行一个绕过。
CVE-2015-4852的修复补丁为p21984589_1036_Generic
,由于在互联网上并没有找到该补丁包,只能通过官网下载,官网下载需要购买对应的服务,所以在这里找了p20780171_1036_Generic
和p22248372_1036012_Generic
这两个补丁包,p21984589_1036_Generic
是前面这两个补丁包的集成。
因为前面搭建是docker的环境,需要将这两个补丁包上传到docker镜像里面去,然后进行安装。
命令整理:
docker cp ../p20780171_1036_Generic weblogic1036jdk7u21:/p20780171_1036_Generic
docker cp ../p22248372_1036012_Generic weblogic1036jdk7u21:/p22248372_1036012_Generic
docker exec -it weblogic1036jdk7u21 /bin/bash
cd /u01/app/oracle/middleware/utils/bsu
mkdir cache_dir
vi bsu.sh 编辑MEM_ARGS参数为1024
cp /p20780171_1036_Generic/* cache_dir/
./bsu.sh -install -patch_download_dir=/u01/app/oracle/middleware/utils/bsu/cache_dir/ -patchlist=EJUW -prod_dir=/u01/app/oracle/middleware/wlserver/
cp /p22248372_1036012_Generic/* cache_dir/
./bsu.sh -install -patch_download_dir=/u01/app/oracle/middleware/utils/bsu/cache_dir/ -patchlist=ZLNA -prod_dir=/u01/app/oracle/middleware/wlserver/ –verbose
重启weblogic服务。
/u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh
这里看到weblogic 2015-4852的payload打过去,并没有像以往一样,创建一个文件。那么就说明补丁已经打上了,已经能够修复该漏洞了。这里是切换了JDK7u21和cc1的利用链依旧没打成功。
远程调试
接下来还是需要将里面的依赖包给拷一下。
mkdir wlserver1036
mkdir coherence_3.7
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/modules ./wlserver1036
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/wlserver/server/lib ./wlserver1036
docker cp weblogic1036jdk7u21:/u01/app/oracle/middleware/coherence_3.7/lib ./coherence_3.7/lib
下面来对该补丁进行一个绕过。
0x02 补丁分析
补丁作用位置:
weblogic.rjvm.InboundMsgAbbrev.class :: ServerChannelInputStream
weblogic.rjvm.MsgAbbrevInputStream.class
weblogic.iiop.Utils.class
在分析漏洞前,先来看到一下,上一个漏洞点的补丁是怎么进行修复的。
在这其实看到该resolveClass
方法的位置,前面加多一个判断。
前面判断className是否为空,ClassName的长度是否为零,但是重点是ClassFilter.isBlackListed
方法。
这里先打一个 CVE-2015-4852 exp过来,在该位置打个断点,跟踪进该方法,查看怎么进行防护。
跟进进来后,先别急着看后面的,因为下面还有一个静态代码块,静态代码块中代码优先执行,需要先来查看静态代码块内容。
这里前面有两个判断,判断中都调用了两个方法,来看看这两个方法的实现。
一个是判断是否为weblogic.rmi.disableblacklist
,一个是判断是否为weblogic.rmi.disabledefaultblacklist
,写法有点奇怪,可能是因为是class文件的缘故。
这两个判断为true的话,就会执行来到下一步调用updateBlackList
将后面的一系列黑名单的类传入到里面去。
updateBlackList
该方法从名字得知,就是一个黑名单列表添加的一个方法,将黑名单内容添加到一个HashSet
里面去。查看具体实现。
StringTokenizer 构造方法:为指定的字符串构造一个字符串tokenizer。
hasMoreTokens方法:返回与 hasMoreTokens
方法相同的值。
nextToken 方法:返回此字符串tokenizer字符串中的下一个令牌。
总体的来理解就是构造一个字符串,然后遍历里面的值,然后调用processToken
方法将该值传递进去。
再来看到processToken
方法。
里面判断如果开头是+
号,则截取第一位后面的值添加到黑名单的这个HashSet里面去。如果是-
号则移除,如果开头不是前面的+
-
号则直接添加到黑名单里面去。
到这里静态代码块就已经分析完成了,总的来说其实就是将一些危险的类,添加到了黑名单里的一个步骤。
黑名单列表为:
+org.apache.commons.collections.functors,
+com.sun.org.apache.xalan.internal.xsltc.trax,
+javassist,+org.codehaus.groovy.runtime.ConvertedClosure,
+org.codehaus.groovy.runtime.ConversionHandler,
+org.codehaus.groovy.runtime.MethodClosure
返回刚刚的ClassFilter.isBlackListed
方法进行跟踪
最后这里调用了contains
方法判断 这个pkgName存不存在黑名单中,存在的话这里返回true。
返回到resolveClass
方法可以看到这里为true,就会直接抛异常。
如果不存在于黑名单中,会来到else这个分支的代码块中调用父类的resolveClass
方法。
而这一个点,只是过滤的一个点,下面来看看过滤的点都有哪些。
再来看下一个点MsgAbbrevInputStream
的位置
这里也是调用ClassFilter.isBlackListed
方法进行过滤,和前面的是一样的。以此类推。
0x03 工具分析
在CVE-2016-0638里面用到了weblogic_cmd工具,github地址。
下面来看看该工具的实现,再谈漏洞的绕过方式。
下载该源码后,导入IDEA中,配置命令参数。
这里如果报错找不到sun.tools.asm包的话,需要将Tools.jar包手动添加一下。在这我是使用jdk1.6进行执行的,使用1.8版本会找不到sun.org.mozilla.javascript.internal.DefiningClassLoader
类
在Main的类中打个断点进行执行。
前面都是代码都是进行一个配置,这里断点选择落在该方法中。
选择跟踪
继续跟踪WebLogicOperation.blindExecute
方法。
前面判断了服务器类型,重点在SerialDataGenerator.serialBlindDatas
方法中,payload由该方法进行生成。跟进查看一下该方法如何生成payload。
在这先选择跟踪blindExecutePayloadTransformerChain
方法。
在这里又看到了熟悉的面孔,CC链的部分代码。
回到刚刚的地方,跟踪serialData
方法
在这里就看到了CC链后面的一段代码,这组合成了一条CC1利用链。但是在后面调用了BypassPayloadSelector.selectBypass
方法来处理在原生的利用链中本该直接进行序列化的对象。
跟进该方法进行查看。
这里面还会去调用Serializables.serialize
,依旧先跟踪最里层的方法。
这传入一个obj对象和out对象,进行了序列化操作。然后将序列化后的数据写到out对象中。
执行完成后,返回上一个点,刚才分析得知返回的是序列化后的数据。所以在处调用streamMessageImpl
方法传递的参数也是序列化的数据。
跟踪查看。
内部是new了一个weblogic.jms.common.StreamMessageImpl
的实例,然后调用setDataBuffer
方法将序列化后的对象和序列化后的长度传递进去。
执行完这步后,回到这个地方
后面的这个方法是进行序列化操作的,这里又对 streamMessageImpl
的实例对象进行了一次序列化。该方法在前面查看过了,这里就不跟进去看了。
而最后来到了这里。
而后面这个方法就是构造特定的数据包,使用T3协议发送payload。
0x04 漏洞分析
那么如果需要绕过的话,我们需要找一个类,他的类在内部的readObject
方法创建了自己的InputStream
的对象,但是又不能为黑名单里面过滤掉的ServerChannelInputStream
和MsgAbbrevInputStream
里面的readObject
方法。然后调用该readObject
方法进行反序列化,这时候就可以达成一个绕过的效果。
在师傅们的挖掘中寻找到了weblogic.jms.common.StreamMessageImpl#readExternal()
,StreamMessageImpl
类中的readExternal
方法可以接收序列化数据作为参数,而当StreamMessageImpl
类的readExternal
执行时,会反序列化传入的参数并调用该参数反序列化后对应类的这个readObject
方法。
绕过原理如下:
将反序列化的对象封装进了 StreamMessageImpl,然后再对 StreamMessageImpl 进行序列化,生成 payload 字节码。反序列化时 StreamMessageImpl 不在 WebLogic 黑名单里,可正常反序列化,在反序列化时 StreamMessageImpl 对象调用 readObject 时对 StreamMessageImpl 封装的序列化对象再次反序列化,这样就逃过了黑名单的检查。
在此先再来思考一个问题,weblogic.jms.common.StreamMessageImpl#readExternal()
该方法是怎么被调用的呢?在前面分析原生readObject
方法的时候发现,其实readObject
方法的底层还会去调用很多其他方法。
在Weblogic从流量中的序列化类字节段通过readClassDesc-readNonProxyDesc-resolveClass获取到普通类序列化数据的类对象后,程序依次尝试调用类对象中的readObject、readResolve、readExternal等方法。而在这里readExternal
就会被调用。
那么下面来调试分析一下该漏洞。
还是先在weblogic.rjvm.InboundMsgAbbrev#ServerChannelInputStream.resolveClass
地方打个断点,然后使用weblogic_cmd工具打一个payload过去,先来查看一下传输过来的数据。
这里可以看到获取到的ClassName是weblogic.jms.common.StreamMessageImpl
的对象,而不在再是AnnotationInvocationHandler
对象。StreamMessageImpl
不在黑名单中,这里的判断不会进行抛异常。
下个断点直接落在StreamMessageImpl.readExternal
中跟踪一下。
看到调用栈这里就应验了我们前面所提到的关于StreamMessageImpl.readExternal
调用问题。
这里的var4为正常反序列化后的数据,而后面会new一个ObjectInputStream
类传递var4参数进去。然后再调用readObject
方法
执行完这一步后,命令就已经执行成功。后面的是对CC链执行命令的一个基本认知,在此不做赘述。
参考文章
https://xz.aliyun.com/t/8443#toc-6
https://www.anquanke.com/post/id/224343#h3-6
0x05 结尾
其实摸清楚补丁的一个套路过后,再去基于补丁分析后面的漏洞会比较清晰。因为补丁无非就是再从ClassFilter里面添加黑名单列表,这也是为什么weblogic修修补补又爆洞的原因,并没有从根本原因去进行修复。
Java安全之Weblogic 2016-0638分析的更多相关文章
- Java 安全之Weblogic 2018-2628&2018-2893分析
Java 安全之Weblogic 2018-2628&2018-2893分析 0x00 前言 续上一个weblogic T3协议的反序列化漏洞接着分析该补丁的绕过方式,根据weblogic的补 ...
- Java安全之Weblogic 2016-3510 分析
Java安全之Weblogic 2016-3510 分析 首发安全客:Java安全之Weblogic 2016-3510 分析 0x00 前言 续前面两篇文章的T3漏洞分析文章,继续来分析CVE-20 ...
- 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程序设计>课程准备之问卷调查 摘要: 一.你对自己 ...
随机推荐
- 「考试」noip模拟9,11,13
9.1 辣鸡 可以把答案分成 每个矩形内部连线 和 矩形之间的连线 两部分 前半部分即为\(2(w-1)(h-1)\),后半部分可以模拟求(就是讨论四种相邻的情况) 如果\(n^2\)选择暴力模拟是有 ...
- vue绑定用户页面
1.vue微博回调空页面 微博回调空页面为: http://127.0.0.1:8888/oauth/callback/ 1.1 页面路径 components\oauth.vue <templ ...
- PyQt(Python+Qt)学习随笔:使用实例方法赋值方式捕获事件
专栏:Python基础教程目录 专栏:使用PyQt开发图形界面Python应用 专栏:PyQt入门学习 老猿Python博文目录 老猿学5G博文目录 在<第15.17节 PyQt(Python+ ...
- Python中排序方法sort、函数sorted的key参数的作用分析
从Python2.4开始,list.sort方法 和 sorted方法 都增加了一个 'key' 参数用来在进行比较之前指定每个列表元素上要调用的函数,将函数的返回值作为比较的依据. 那么怎么使用这个 ...
- PyQt(Python+Qt)学习随笔:Qt Designer中部件的windowTitle和windowOpacity属性
windowOpacity 这个属性仅对window对象生效. windowOpacity为浮点数,表示透明度,为1完全不透明,为0完全透明,缺省是1. 可以通过windowOpacity().set ...
- JAVA课堂作业(2019.10.21)
1. 代码: package class20191021; class Grandparent { public Grandparent() { System.out.println("Gr ...
- DVWA SQL Injection Medium
Mdeium 基本的步骤及知识点在上节已经提到过这里不再赘述:https://blog.csdn.net/WQ_BCJ/article/details/84554777 1)与low级别不同,本次采用 ...
- go学习49天
写文件操作 func OpenFile(name string,flag int,perm FileMode) (file *File,err error)
- CSP-S2020复赛游记
[本文经过删改] 前一个月 没做什么 NOIP 的题,感觉这些题对我这个做黄题封顶的人不是很友好. 前一天 考了场模拟赛,全场最低分 89,感觉信心满满. 退役那天 到了 XJ,发现没人可以面基,想着 ...
- 笔记-[JSOI2011]柠檬
笔记-[JSOI2011]柠檬 [JSOI2011]柠檬 \(f_i\) 表示到第 \(i\) 只贝壳最多可以换得的柠檬数. 令 \(c_i=\sum_{h=1}^i[s_h=s_i]\). \[\b ...