weblogic漏洞分析之CVE-2016-0638
字数 1774 2025-08-05 00:15:46
WebLogic漏洞分析之CVE-2016-0638教学文档
一、漏洞概述
CVE-2016-0638是Oracle WebLogic Server中的一个远程代码执行漏洞,存在于WebLogic的T3协议反序列化过程中。攻击者可以通过构造恶意的T3协议请求,在目标服务器上执行任意代码。
二、环境搭建
1. 基础环境准备
- 使用前一篇文章的环境(参考:https://www.cnblogs.com/yyhuni/p/15137095.html)
- 需要下载并安装两个补丁:
- p20780171_1036_Generic
- p22248372_1036012_Generic
2. 补丁安装步骤
- 将补丁复制到Docker容器中:
docker cp ./p22248372_1036012_Generic/ d1b6be39e32e:/home/
docker cp ./p20780171_1036_Generic d1b6be39e32e:/home/
- 进入容器并安装补丁:
docker exec -it d1b6be39e32e /bin/bash
cd /root/Oracle/Middleware/utils/bsu
mkdir cache_dir
cp /home/p20780171_1036_Generic/* ./cache_dir/
cp /home/p22248372_1036012_Generic/* ./cache_dir/
vi bsu.sh # 编辑MEM_ARGS参数为1024
./bsu.sh -install -patch_download_dir=/root/Oracle/Middleware/utils/bsu/cache_dir/ -patchlist=EJUW -prod_dir=/root/Oracle/Middleware/wlserver_10.3 -verbose
./bsu.sh -install -patch_download_dir=/root/Oracle/Middleware/utils/bsu/cache_dir/ -patchlist=ZLNA -prod_dir=/root/Oracle/Middleware/wlserver_10.3 -verbose
- 重启服务:
docker restart d1b6be39e32e
三、补丁分析
1. 补丁关键位置
补丁主要修改了以下类:
weblogic.rjvm.InboundMsgAbbrev.class中的ServerChannelInputStreamweblogic.rjvm.MsgAbbrevInputStream.classweblogic.iiop.Utils.class
2. 黑名单机制
在InboundMsgAbbrev中新增了ClassFilter.isBlackListed判断,用于检查类是否在黑名单中。
黑名单检查逻辑:
if (ClassFilter.isBlackListed(className) || ClassFilter.isBlackListed(pkgName)) {
throw new InvalidClassException(...);
}
黑名单包含的类:
org.apache.commons.collections.functors.ChainedTransformer- 其他危险类(具体见补丁代码)
3. 反序列化流程
- 攻击者发送伪造的T3协议数据包
- 服务器反序列化处理到
InboundMsgAbbrev#readObject方法 - 通过
switch分发到case0,调用ServerChannelInputStream的readObject方法 ServerChannelInputStream继承ObjectInputStream并重写resolveClass方法进行黑名单检查
四、绕过黑名单的方法
1. 寻找替代类
由于黑名单机制不完善,可以寻找不在黑名单中的类作为跳板。weblogic.jms.common.StreamMessageImpl类被发现可以利用。
2. StreamMessageImpl利用原理
StreamMessageImpl#readExternal方法中会调用ObjectInputStream的readObject方法:
public void readExternal(ObjectInput var1) throws IOException, ClassNotFoundException {
// ...
switch(var2) {
case 1:
ObjectInputStream var5 = new ObjectInputStream(new BufferInputStream(var4));
this.payload = var5.readObject();
// ...
}
}
五、漏洞利用分析
1. 攻击机构造POC
使用weblogic_cmd工具构造POC:
-H "192.168.202.129" -C "touch /tmp/success" -B -os linux
2. POC构造流程
- 将CC1利用链序列化
- 创建
StreamMessageImpl对象并调用setDataBuffer方法设置payload - 对
StreamMessageImpl对象进行序列化 StreamMessageImpl#writeExternal方法将payload写入ObjectOutputStream- 构造T3协议并发送给服务器
3. 服务端执行流程
- 接收payload并反序列化
InboundMsgAbbrev#resolveClass检查通过(StreamMessageImpl不在黑名单)- 执行
StreamMessageImpl#readExternal - 在
readExternal中创建新的ObjectInputStream并执行readObject - 触发
AnnotationInvocationHandler#readObject执行恶意代码
六、总结
- 漏洞本质:T3协议反序列化漏洞
- 补丁机制:通过黑名单过滤危险类
- 绕过方法:利用
StreamMessageImpl类作为跳板,间接执行黑名单中的类 - 影响范围:特定版本的WebLogic Server
七、参考链接
- 原文参考:https://xz.aliyun.com/t/8443
- weblogic_cmd工具:https://github.com/5up3rc/weblogic_cmd
- 反序列化详细过程:https://www.cnblogs.com/yyhuni/p/15127416.html