Java安全之Weblogic 2016-0638分析

Java安全之Weblogic2016-0638分析文章首发先知:Java安全之Weblogic2016-0638分析0x00前言续上篇文的初探weblogic的T3协议漏洞,再谈CVE-

大家好,又见面了,我是全栈君,祝每个程序员都可以多学几门语言。

Java安全之Weblogic 2016-0638分析

文章首发先知:Java安全之Weblogic 2016-0638分析

0x00 前言

续上篇文的初探weblogic的T3协议漏洞,再谈CVE-2016-0638, CVE-2016-0638是基于 CVE-2015-4852漏洞的一个绕过。

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

0x01 环境搭建

补丁环境搭建

这里采用上次的weblogic环境,但是在这里还需要打一个补丁包,来修复 CVE-2015-4852漏洞后,对该漏洞进行一个绕过。

CVE-2015-4852的修复补丁为p21984589_1036_Generic,由于在互联网上并没有找到该补丁包,只能通过官网下载,官网下载需要购买对应的服务,所以在这里找了p20780171_1036_Genericp22248372_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

Java安全之Weblogic 2016-0638分析

重启weblogic服务。

/u01/app/oracle/Domains/ExampleSilentWTDomain/bin/startWebLogic.sh

Java安全之Weblogic 2016-0638分析

这里看到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

下面来对该补丁进行一个绕过。

Java安全之Weblogic 2016-0638分析

Java安全之Weblogic 2016-0638分析

0x02 补丁分析

补丁作用位置:

weblogic.rjvm.InboundMsgAbbrev.class :: ServerChannelInputStream
weblogic.rjvm.MsgAbbrevInputStream.class
weblogic.iiop.Utils.class

在分析漏洞前,先来看到一下,上一个漏洞点的补丁是怎么进行修复的。

Java安全之Weblogic 2016-0638分析

在这其实看到该resolveClass方法的位置,前面加多一个判断。

前面判断className是否为空,ClassName的长度是否为零,但是重点是ClassFilter.isBlackListed方法。

这里先打一个 CVE-2015-4852 exp过来,在该位置打个断点,跟踪进该方法,查看怎么进行防护。

Java安全之Weblogic 2016-0638分析

跟进进来后,先别急着看后面的,因为下面还有一个静态代码块,静态代码块中代码优先执行,需要先来查看静态代码块内容。

Java安全之Weblogic 2016-0638分析

这里前面有两个判断,判断中都调用了两个方法,来看看这两个方法的实现。

Java安全之Weblogic 2016-0638分析

一个是判断是否为weblogic.rmi.disableblacklist,一个是判断是否为weblogic.rmi.disabledefaultblacklist,写法有点奇怪,可能是因为是class文件的缘故。

这两个判断为true的话,就会执行来到下一步调用updateBlackList将后面的一系列黑名单的类传入到里面去。

updateBlackList该方法从名字得知,就是一个黑名单列表添加的一个方法,将黑名单内容添加到一个HashSet里面去。查看具体实现。

Java安全之Weblogic 2016-0638分析

StringTokenizer 构造方法:为指定的字符串构造一个字符串tokenizer。

hasMoreTokens方法:返回与 hasMoreTokens方法相同的值。

nextToken 方法:返回此字符串tokenizer字符串中的下一个令牌。

总体的来理解就是构造一个字符串,然后遍历里面的值,然后调用processToken方法将该值传递进去。

再来看到processToken方法。

Java安全之Weblogic 2016-0638分析

里面判断如果开头是+号,则截取第一位后面的值添加到黑名单的这个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方法进行跟踪

Java安全之Weblogic 2016-0638分析

Java安全之Weblogic 2016-0638分析

最后这里调用了contains方法判断 这个pkgName存不存在黑名单中,存在的话这里返回true。

返回到resolveClass方法可以看到这里为true,就会直接抛异常。

Java安全之Weblogic 2016-0638分析

如果不存在于黑名单中,会来到else这个分支的代码块中调用父类的resolveClass方法。

而这一个点,只是过滤的一个点,下面来看看过滤的点都有哪些。

Java安全之Weblogic 2016-0638分析

再来看下一个点MsgAbbrevInputStream的位置

Java安全之Weblogic 2016-0638分析

这里也是调用ClassFilter.isBlackListed方法进行过滤,和前面的是一样的。以此类推。

0x03 工具分析

在CVE-2016-0638里面用到了weblogic_cmd工具,github地址

下面来看看该工具的实现,再谈漏洞的绕过方式。

下载该源码后,导入IDEA中,配置命令参数。

Java安全之Weblogic 2016-0638分析

这里如果报错找不到sun.tools.asm包的话,需要将Tools.jar包手动添加一下。在这我是使用jdk1.6进行执行的,使用1.8版本会找不到sun.org.mozilla.javascript.internal.DefiningClassLoader

在Main的类中打个断点进行执行。

前面都是代码都是进行一个配置,这里断点选择落在该方法中。

Java安全之Weblogic 2016-0638分析

选择跟踪

Java安全之Weblogic 2016-0638分析

继续跟踪WebLogicOperation.blindExecute方法。

Java安全之Weblogic 2016-0638分析

前面判断了服务器类型,重点在SerialDataGenerator.serialBlindDatas方法中,payload由该方法进行生成。跟进查看一下该方法如何生成payload。

Java安全之Weblogic 2016-0638分析

在这先选择跟踪blindExecutePayloadTransformerChain方法。

Java安全之Weblogic 2016-0638分析

在这里又看到了熟悉的面孔,CC链的部分代码。

回到刚刚的地方,跟踪serialData方法

Java安全之Weblogic 2016-0638分析

Java安全之Weblogic 2016-0638分析

在这里就看到了CC链后面的一段代码,这组合成了一条CC1利用链。但是在后面调用了BypassPayloadSelector.selectBypass方法来处理在原生的利用链中本该直接进行序列化的对象。

跟进该方法进行查看。

Java安全之Weblogic 2016-0638分析

这里面还会去调用Serializables.serialize,依旧先跟踪最里层的方法。

Java安全之Weblogic 2016-0638分析

这传入一个obj对象和out对象,进行了序列化操作。然后将序列化后的数据写到out对象中。

Java安全之Weblogic 2016-0638分析

执行完成后,返回上一个点,刚才分析得知返回的是序列化后的数据。所以在处调用streamMessageImpl方法传递的参数也是序列化的数据。

Java安全之Weblogic 2016-0638分析

跟踪查看。

Java安全之Weblogic 2016-0638分析

内部是new了一个weblogic.jms.common.StreamMessageImpl的实例,然后调用setDataBuffer方法将序列化后的对象和序列化后的长度传递进去。

Java安全之Weblogic 2016-0638分析

执行完这步后,回到这个地方

Java安全之Weblogic 2016-0638分析

后面的这个方法是进行序列化操作的,这里又对 streamMessageImpl的实例对象进行了一次序列化。该方法在前面查看过了,这里就不跟进去看了。

而最后来到了这里。

Java安全之Weblogic 2016-0638分析

而后面这个方法就是构造特定的数据包,使用T3协议发送payload。

Java安全之Weblogic 2016-0638分析

0x04 漏洞分析

那么如果需要绕过的话,我们需要找一个类,他的类在内部的readObject方法创建了自己的InputStream的对象,但是又不能为黑名单里面过滤掉的ServerChannelInputStreamMsgAbbrevInputStream里面的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过去,先来查看一下传输过来的数据。

Java安全之Weblogic 2016-0638分析

这里可以看到获取到的ClassName是weblogic.jms.common.StreamMessageImpl的对象,而不在再是AnnotationInvocationHandler对象。StreamMessageImpl不在黑名单中,这里的判断不会进行抛异常。

下个断点直接落在StreamMessageImpl.readExternal中跟踪一下。

Java安全之Weblogic 2016-0638分析

看到调用栈这里就应验了我们前面所提到的关于StreamMessageImpl.readExternal调用问题。

Java安全之Weblogic 2016-0638分析

这里的var4为正常反序列化后的数据,而后面会new一个ObjectInputStream类传递var4参数进去。然后再调用readObject方法

Java安全之Weblogic 2016-0638分析

执行完这一步后,命令就已经执行成功。后面的是对CC链执行命令的一个基本认知,在此不做赘述。

Java安全之Weblogic 2016-0638分析

参考文章

https://xz.aliyun.com/t/8443#toc-6

https://www.anquanke.com/post/id/224343#h3-6

0x05 结尾

其实摸清楚补丁的一个套路过后,再去基于补丁分析后面的漏洞会比较清晰。因为补丁无非就是再从ClassFilter里面添加黑名单列表,这也是为什么weblogic修修补补又爆洞的原因,并没有从根本原因去进行修复。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/119892.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • myEclipse2018下载及安装详细教程[通俗易懂]

    myEclipse2018下载及安装详细教程[通俗易懂]下载地址:链接:https://pan.baidu.com/s/1aQEZiikOSBzCkbl39ndLYQ提取码:ee9g复制这段内容后打开百度网盘手机App,操作更方便哦。安装:1.想要安装的路径下新建文件夹,双击运行安装包,运行需要一点时间,耐心等待即可;2.安装包运行成功界面,next下一步:同意协议:选择自定义安装路径:等待安装:注意:安装成功先不启动myEclipse!!!不勾选launchMyEclipseCI:…

  • 实时数据库与时序数据库区别_时间序列数据库

    实时数据库与时序数据库区别_时间序列数据库1、概述在工业大数据数据库存储领域,除了传统的关系型数据库和分布式数据库以外,还有一种类型的数据库是非常常用,而且是非常有必要的,就是实时数据库,以及时序数据库。但是,大家可能会有疑问,都是专门处理时序数据的,这是两种数据库吗?他们之间有什么联系?1.1发展历史实时数据库是数据库系统的一个分支,它适用于处理不断更新的快速变化的数据及具有时间限制的事务处理。实时数据库技术是实时系统和数据库技术相结合的产物。实时数据库最起初是基于先进控制和优化控制而出现的,对数据的实时性要求比较高,因而实时、高效

  • Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义

    Linux中变量$#,$@,$0,$1,$2,$*,$$,$?的含义

  • Linux 安装tomcat 部署war包项目

    Linux 安装tomcat 部署war包项目准备工作:jdk-8u161-linux-x64.tar.gz链接:https://pan.baidu.com/s/1zQGL_cfN5jFWshZkAJOkNw密码:0u7dapache-tomcat-9.0.20.zip链接:https://pan.baidu.com/s/1Nf_qdmUVlQ0Cz8BOoQg2rA密码:bh9f以及你的war包…

  • 数据结构—完全二叉树「建议收藏」

    数据结构—完全二叉树「建议收藏」上篇博客介绍了一种非线性结构—普通树的含义以及一些特性,本文将介绍二叉树、满二叉树以及完全二叉树的一些特性及实现。首先,什么是二叉树?二叉树,是度为二的树,二叉树的每一个节点最多只有二个子节点,

  • Ubuntu下安装vscode_附近有安装etc的吗

    Ubuntu下安装vscode_附近有安装etc的吗目录一、安装VSCode1、VSCode下载2、安装VSCode二、配置C/C++环境1、配置g++环境1.1安装vim1.2安装g++2、安装汉化、C/C++插件3、建立工程4、更改lanuch.json文件5、更改task.json文件6、完美运行我的Ubuntu已经换源了,但是在浏览器中下载比较慢,可以在window中下载好直接拖到虚拟机中。如何在windows和虚拟机Ubuntu中拖拽文件参阅:两行代码实现Windows和…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号