weblogic漏洞分析之CVE-2016-0638

一、环境搭建:

这里使用前一篇文章的环境,然后打上补丁

上一篇文章:https://www.cnblogs.com/yyhuni/p/15137095.html

  1. 下载补丁p20780171_1036_Generic和p22248372_1036012_Generic
  2. 解压补丁后,复制补丁到Docker中:
docker cp ./p22248372_1036012_Generic/ d1b6be39e32e:/home/
docker cp ./p20780171_1036_Generic d1b6be39e32e:/home/
  1. 安装补丁:
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
  1. 重启服务:
docker restart d1b6be39e32e

这时候,使用原先的poc已经是失效了,说明补丁成功打上

二、补丁分析

配置好weblogic的远程调试端口后,复制jar包,导入idea

详细步骤看前面一篇文章:https://www.cnblogs.com/yyhuni/p/15137095.html

补丁位置:

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

第一个位置在InboundMsgAbbrev中,新增了个判断

重点在ClassFilter.isBlackListed判断是否存在黑名单中,跟进方法

方法isBlackListed中对className和pkgName都进行了黑名单判断,匹配到了则返回true。黑名单list

在值为org.apache.commons.collections.functors.ChainedTransformer时候抛出了异常

补丁的第二个位置MsgAbbrevInputStream也是做了同样的判断

现在来进行一遍流程分析,先看下之前的整个调用栈

POC伪造的T3协议数据包,发送到服务器,服务器反序列化处理到了InboundMsgAbbrev#readObject方法中

switch分发节点,到了case0中,调用了(new InboundMsgAbbrev.ServerChannelInputStream(in))readObject方法来进行的反序列化

计算得出为InboundMsgAbbrev类中的一个内部类ServerChannelInputStream

以下是ServerChannelInputStream类的继承图

其继承了ObjectInputStream,并重写了resolveClass方法

weblogic反序列化类时候调用的是ServerChannelInputStreamreadObject方法,而在执行到resolveClass方法的时候调用的是ServerChannelInputStream重写的resolveClass方法,在方法中对其做了黑名单过滤导致无法执行后面的readObjectreadExternalreadResolve方法。

三、绕过黑名单

要想绕过黑名单,则需要寻找一个不在黑名单的类。要知道,ObjectInputStream在执行readObject方法的时候,除了会调用反序列化类的readObject方法外,还会调用readExternalreadResolve,详细调用过程可以看https://www.cnblogs.com/yyhuni/p/15127416.html

所以weblogic.jms.common.StreamMessageImpl类就被挖掘了出来。其StreamMessageImpl#readExternal中,会调用var5的readObject方法,而var5是一个ObjectInputStream对象

四、漏洞分析

攻击机

这里使用weblogic_cmd构造的poc:https://github.com/5up3rc/weblogic_cmd

-H "192.168.202.129" -C "touch /tmp/success" -B -os linux

这里把CC1的利用链,进行了序列化后传入了streamMessageImpl方法

跟进streamMessageImpl方法,new了一个StreamMessageImpl对象,这个对象也就是构造payload的关键,然后把序列化转换后的byte数组传入了setDataBuffer方法

跟进setDataBuffer,对this.bufferthis.length进行了赋值操作

随后把获得的StreamMessageImpl对象又进行了一次序列化操作(序列话后的payload传入对象,再把对象进行了序列化)

StreamMessageImpl对象序列化会调用writeExternal方法

StreamMessageImpl对象的writeExternal方法中进行了重写,把之前的payload给write进了ObjectOutputStream对象中

最后返回给了byte[] payload,然后进行了T3协议构造并且发送给了服务器

服务端

在服务端接受到payload,随后进行了反序列化操作,跳转到InboundMsgAbbrev#resolveClass方法中,进行黑名单判断

黑名单中并没有StreamMessageImpl这个类,返回false,走入else中

接下来就会到StreamMessageImpl#readExternal方法

switch中由前面构造payload时候写入,case为1

此时的var4就是CC1的承载了payload的AnnotationInvocationHandler序列化后的BufferInputStream

最后调用了var5.readObject就触发了AnnotationInvocationHandler#readObject方法了

总结

在这里用了StreamMessageImpl类来绕过黑名单检查,把AnnotationInvocationHandler序列化后通过重写的writeExternal方法给write进了ObjectOutputStream对象中,调用StreamMessageImpl类的readExternal传入了参数并执行了参数的readObject方法从而触发了调用链

参考:https://xz.aliyun.com/t/8443

weblogic漏洞分析之CVE-2016-0638的更多相关文章

  1. 漏洞分析:CVE 2021-3156

    漏洞分析:CVE 2021-3156 漏洞简述 漏洞名称:sudo堆溢出本地提权 漏洞编号:CVE-2021-3156 漏洞类型:堆溢出 漏洞影响:本地提权 利用难度:较高 基础权限:需要普通用户权限 ...

  2. Weblogic漏洞分析之JNDI注入-CVE-2020-14645

    Weblogic漏洞分析之JNDI注入-CVE-2020-14645 Oracle七月发布的安全更新中,包含了一个Weblogic的反序列化RCE漏洞,编号CVE-2020-14645,CVS评分9. ...

  3. weblogic漏洞分析之CVE-2021-2394

    weblogic漏洞分析之CVE-2021-2394 简介 Oracle官方发布了2021年7月份安全更新通告,通告中披露了WebLogic组件存在高危漏洞,攻击者可以在未授权的情况下通过IIOP.T ...

  4. weblogic漏洞分析之CVE-2017-10271

    weblogic漏洞分析之CVE-2017-10271 一.环境搭建 1)配置docker 这里使用vulhub的环境:CVE-2017-10271 编辑docker-compose.yml文件,加入 ...

  5. weblogic漏洞分析之CVE-2017-3248 & CVE-2018-2628

    CVE-2017-3248 & CVE-2018-2628 后面的漏洞就是2017-3248的绕过而已,所以poc都一样,只是使用的payload不同 本机开启JRMP服务端 ->利用T ...

  6. weblogic之CVE-2018-3191漏洞分析

    weblogic之CVE-2018-3191漏洞分析 理解这个漏洞首先需要看这篇文章:https://www.cnblogs.com/afanti/p/10193169.html 引用廖新喜说的,说白 ...

  7. CVE-2016-0143 漏洞分析(2016.4)

    CVE-2016-0143漏洞分析 0x00 背景 4月20日,Nils Sommer在exploitdb上爆出了一枚新的Windows内核漏洞PoC.该漏洞影响所有版本的Windows操作系统,攻击 ...

  8. Java反序列化漏洞分析

    相关学习资料 http://www.freebuf.com/vuls/90840.html https://security.tencent.com/index.php/blog/msg/97 htt ...

  9. CVE-2016-10190 FFmpeg Http协议 heap buffer overflow漏洞分析及利用

    作者:栈长@蚂蚁金服巴斯光年安全实验室 -------- 1. 背景 FFmpeg是一个著名的处理音视频的开源项目,非常多的播放器.转码器以及视频网站都用到了FFmpeg作为内核或者是处理流媒体的工具 ...

随机推荐

  1. 第7篇-为Java方法创建栈帧

    在 第6篇-Java方法新栈帧的创建 介绍过局部变量表的创建,创建完成后的栈帧状态如下图所示. 各个寄存器的状态如下所示. // %rax寄存器中存储的是返回地址 rax: return addres ...

  2. 详细讲讲netty的pipiline!

    前言 提到 Netty 首当其冲被提起的肯定是支持它承受高并发的线程模型,说到线程模型就不得不提到 NioEventLoopGroup 这个线程池,接下来进入正题. 线程模型 首先来看一段 Netty ...

  3. SQL 练习21

    查询每门课程被选修的学生数 SELECT cid,COUNT(cid) 选修人数 from sc GROUP BY cid

  4. NOIP 模拟 $18\; \rm 炼金术士的疑惑$

    题解 \(by\;zj\varphi\) 高斯消元 根据高中化学知识,求解方程的就是一直方程凑出来的,焓值也一样 那么对于要求的方程和一直方程,我们做一次高斯消元,以每个物质为未知数,因为它保证有解, ...

  5. 题解 Smooth

    传送门 咕了蚯蚓这题+前一天被蚊子折腾了半宿没睡=全场几乎就我这题分最低-- 发现这里光滑数是不断乘出来的--记得这是一个很经典的套路,然而当时我咕了 求一个每个值都是 \(\{p_i\}\) 中至少 ...

  6. [ES6深度解析]12:Classes

    我们将讨论一个老问题:在JavaScript中创建对象的构造函数. 存在的问题 假设我们想要创建最典型的面向对象设计的示例:Circle类.假设我们正在为一个简单的Canvas库编写一个Circle. ...

  7. mpvue学习笔记

    坑一: 挂载在Vue.prototype上的属性,在模板语法里面是undefined,必须经过computed计算过一下才能用. 坑二: 关于生命周期钩子 因为小程序的历史页面不会销毁,所以在生命周期 ...

  8. 从一个URL加载一个Document

    存在问题 你需要从一个网站获取和解析一个HTML文档,并查找其中的相关数据.你可以使用下面解决方法: 解决方法 使用 Jsoup.connect(String url)方法: Document doc ...

  9. SpringBoot使用@Scheduled创建定时任务

    定时任务一般会存在中大型企业级项目中,为了减少服务器.数据库的压力往往会采用时间段性的去完成某些业务逻辑.比较常见的就是金融服务系统推送回调,一般支付系统订单在没有收到成功的回调返回内容时会持续性的回 ...

  10. uwp 的锁屏功能

    [UWP开发]自定义锁屏&桌面壁纸 mtobeiyf关注 2015.11.01 00:16:55字数 394阅读 1,249 调用通用的API来设置桌面壁纸,可以实现很多有趣的功能.在Wind ...