您的位置:首页 > 编程语言 > Java开发

Java安全之Weblogic 2016-3510 分析

2021-01-12 21:43 696 查看

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里面。

而序列化后的对象数据会被赋值给

MarshalledObject
this.objBytes
里面。

执行完成,退回到这一步过后,则是对构造好的

MarshalledObject
对象调用
Serializables.serialize
方法进行序列化操作。

0x02 漏洞分析

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

前面CVE-2016-0638这个漏洞是基于前面的补丁将payload序列化过后封装在

weblog
ad8
ic.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这两个漏洞调试分析起,调试分析完前面的后面的这些绕过方式理解起来会比较简单。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: