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修修补补又爆洞的原因,并没有从根本原因去进行修复。

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • ca证书 csr_SSL证书CSR文件生成方式及注意事项

    ca证书 csr_SSL证书CSR文件生成方式及注意事项原标题 SSL 证书 CSR 文件生成方式及注意事项 SSL 证书中 CSR 文件是指什么 CSR 生成方式如何选择 CSR 有什么作用 生成 CSR 文件方法有哪些 SSL 大全网 ssldaquan com 来详细说下 SSL 证书中 CSR 文件的详细作用及 CSR 生成方式及注意事项 什么是 CSR 文件 CSR CertificateS 是证书签名请求文件 包含了您的服务器信息和公司信息 申请证书

    2025年7月11日
    2
  • php源码中powerby,如何去掉织梦dedecms底部调用cfg_powerby的power by dedecms

    php源码中powerby,如何去掉织梦dedecms底部调用cfg_powerby的power by dedecms我们平常使用织梦后台做建站的时候都会发现,如果调用版权信息的时候,在底部使用cfg_powerby调用的时候出现powerbydedecms的链接信息,而这个链接又是个导出链接,我们怎么样才能一劳永逸的直接去掉呐,下面站优云小编就跟大家分享一下。在之前版本我们的解决方法是:1、去掉{dede:globalname=’cfg_powerby’/};2、进入后台,点击系统->系统基本设…

    2022年7月13日
    15
  • PostConstruct用法说明

    PostConstruct用法说明目的:主要是启动项目并执行特定的初始化(including annotationinjectionandanyinitialization)源码说明:ThePostConstructannotationisusedonamethodthatneedstobeexecutedafterdependencyinjectionisdonetope…

    2022年8月30日
    3
  • 校验json格式的工具_使用条件格式工具

    校验json格式的工具_使用条件格式工具JSON格式校验工具

    2025年8月11日
    3
  • java classpath环境变量(linux配置java环境变量)

    刚学Java的时候,很多jdk配置教程都要求设置JAVA_HOME、Path、CLASSPATH3个变量。而Java官网有这么一句话:jdk1.5之后的版本在安装时不用设置CLASSPATH变量。今天我就以jdk1.5为例,总结下三者的区别。Path当我们安装完jdk之后,打开cmd(在非安装目录的路径下)输入javac、java,会提示找不到命令。我们需要将命令所在的路径添加到Path系…

    2022年4月15日
    100
  • load average 计算「建议收藏」

    load average 计算「建议收藏」平均负载是指单位时间内,系统处于可运行状态和不可中断状态的平均活跃进程数。对于Ubuntu获取cpu数和cpu核数more/proc/cpuinfo|grep”physicalid”|uniq|wc-l#=>1more/proc/cpuinfo|grep”physicalid”|grep”0″|wc-l#=>16则1*…

    2022年7月17日
    19

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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