Apereo-cas 4.x反序列化漏洞复现

news2024/11/19 19:26:02

转载https://www.freebuf.com/vuls/226149.html
建议再查看https://xz.aliyun.com/t/7032#toc-7的

0x01 前言

放假前看到很多文章对这个漏洞进行分析复现,又因为过年期间的特殊情况,实在是无聊至极,所以自己也来学习一下,顺便恶补一下反序列化漏洞的知识。这篇文章记录了自己的一些想法以及相关的知识点,方便自己日后忘记可以重新拾起。第一次写文章有不好的,希望大家见谅。

0x02 环境搭建

由于部分cas版本的加密函数不同有相应的变化,因此想要按照此文章来复现漏洞的话还是选择和我一样的版本。

jdk8u144(不一定完全一样)
ApereoCas-4.1.5

下载CAS-Overlay-Template

github链接:https://github.com/apereo/cas-overlay-template/tree/4.1

github上有详细的部署操作,这里要注意要修改pom.xml文件cas的版本:

<cas.version>4.1.5</cas.version>

编译完后,会在target目录生成一个cas.war的war包,将该war包放在tomcat的web目录上,启动tomcat即可通过http://localhost/cas访问example。

成功部署后:

image.png

0x03 漏洞分析

该漏洞存在于登录的execution参数,抓包发现该参数值应该是加密过的,故要知道对应的加密方法以及处理过程才行。

image.png

web.xml

查看登录url对应的servlet可知道交给了Spring的DispatcherServlet处理了,配置文件为/WEB-INF/cas-servlet.xml

image.png

从springmvc的执行流程图(网上找的)可以知道只要找到对应的处理器适配器,就能找到对应的处理器。

image.png

cas-servlet.xml

全局搜索login字眼,看到loginHandlerAdapter适配器,处理器的类名为org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter

image.png

org.jasig.cas.web.flow.SelectiveFlowHandlerAdapter该类继承FlowHandlerAdapter类,登录时调用继承类的handler方法:

//org.springframework.webflow.mvc.servlet.FlowHandlerAdapter#handle

public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
FlowHandler flowHandler = (FlowHandler)handler;
this.checkAndPrepare(request, response, false);
String flowExecutionKey = this.flowUrlHandler.getFlowExecutionKey(request);
if (flowExecutionKey != null) {
try {
ServletExternalContext context = this.createServletExternalContext(request, response);
FlowExecutionResult result = this.flowExecutor.resumeExecution(flowExecutionKey, context);
this.handleFlowExecutionResult(result, context, request, response, flowHandler);
} catch (FlowException var11) {
this.handleFlowException(var11, request, response, flowHandler);
}
} else {
try {
String flowId = this.getFlowId(flowHandler, request);
MutableAttributeMap<Object> input = this.getInputMap(flowHandler, request);
ServletExternalContext context = this.createServletExternalContext(request, response);
FlowExecutionResult result = this.flowExecutor.launchExecution(flowId, input, context);
this.handleFlowExecutionResult(result, context, request, response, flowHandler);
} catch (FlowException var10) {
this.handleFlowException(var10, request, response, flowHandler);
}
}

    return null;
}

其中flowExecutionKey通过getFlowExecutionKey方法获取参数execution的值

String flowExecutionKey = this.flowUrlHandler.getFlowExecutionKey(request);

flowExecutionKey作为参数传入resumeExecution方法,跟进函数。在第91行对flowExecutionKey值的格式进行判断,通过"-"分割字符串为两部分uuid以及base64编码flowstate,因此格式不满足的话是无法继续走下去的。

image.pngimage.png

跟进第96行getFlowExecution。

public FlowExecution getFlowExecution(FlowExecutionKey key) throws FlowExecutionRepositoryException {
if (!(key instanceof ClientFlowExecutionKey)) {
throw new IllegalArgumentException("Expected instance of ClientFlowExecutionKey but got " + key.getClass().getName());
} else {
byte[] encoded = ((ClientFlowExecutionKey)key).getData();
        try {
            ClientFlowExecutionRepository.SerializedFlowExecutionState state = (ClientFlowExecutionRepository.SerializedFlowExecutionState)this.transcoder.decode(encoded);
            FlowDefinition flow = this.flowDefinitionLocator.getFlowDefinition(state.getFlowId());
            return this.flowExecutionFactory.restoreFlowExecution(state.getExecution(), flow, key, state.getConversationScope(), this.flowDefinitionLocator);
        } catch (IOException var5) {
            throw new ClientFlowExecutionRepositoryException("Error decoding flow execution", var5);
        }
    }
}

在第105行对之前base64解码后的encoded进行解密,跟进解密函数this.transcoder.decode(encoded)

image.pngimage.png

可以看出在第83行对密文进行解密,经过一系列的操作后在99行进行反序列化,触发漏洞。可以看出调用的decode方法属于EncryptedTranscoder类,该类还定义的加密方法encode,这里可以直接生成恶意对象,直接调用org.jasig.spring.webflow.plugin.EncryptedTranscoder#encode生成加密字节数组后base64,加上"uuid-"构成execution的值。

整个调用栈

image.png

0x03 构造payload

默认环境的jar包中有commons-collections4-4.0.jar,直接使用ysoserial生成payload,这里记得要将payload的特殊符号进行url编码。

image.pngimage.png

演示结果

成功执行系统命令

image.png

0x04 构造回显payload

看了大佬的分析,知道可以回显,文章提及到org.springframework.webflow.context.ExternalContextHolder.getExternalContext()方法可以获取到上下文关联信息,然后通过getNativeRequest()方法获取request对象通过getNativeResponse()方法获取response对象。同时提及到org.springframework.cglib.core.ReflectUtils.defineClass().newInstance();加载payload。我的猜测大佬的想法是通过defineClass从byte[]还原出一个Class对象,该恶意对象主要是执行命令,获取response对象,将执行命令后的结果通过response对象的输出流输出。在利用commons-collections1是发现ReflectUtils利用不了,因为构造方法为private,要设置setAccessible为true。因此使用commons-collections2的话,实际就不需要这么麻烦用defineClass来加载payload了,直接在利用类里面写就好了。

//org.springframework.cglib.core.ReflectUtils
private ReflectUtils() {
}

//org.springframework.cglib.core.ReflectUtils#defineClass

public static Class defineClass(String className, byte[] b, ClassLoader loader) throws Exception {
Object[] args = new Object[]{className, b, new Integer(0), new Integer(b.length), PROTECTION_DOMAIN};
Class c = (Class)DEFINE_CLASS.invoke(loader, args);
Class.forName(className, true, loader);
return c;
}

这里看看ysoserial的commons-collections2的构造恶意对象的主要方法。这里使用javassist,第66行获取要操作的类,第75行在该类的构造方法中插入代码,因此这里只要修改该类ysoserial.payloads.util.Gadgets.StubTransletPayload的构造方法为执行系统命令,并修改response的输出流。大家可以直接修改ysoserial的源码并重新编译,我这里为了方便直接用了网上的payload改了一下。

image.pngimage.png

演示结果

Snipaste_2020-02-02_15-22-13.jpg

0x04 最后

文章中存在错误的地方希望大佬们斧正,多多指点。通过这次的分析,其实学到很多东西的,包括commons-collections利用链、ysoserial源码分析。最后,在新的一年里希望大家身体健康,万事如意。

0x05参考链接:

https://www.00theway.org/2020/01/04/apereo-cas-rce/

https://xz.aliyun.com/t/2041

https://xz.aliyun.com/t/4711

https://xz.aliyun.com/t/7031

https://xz.aliyun.com/t/7032

http://www.vuln.cn/6295

https://www.freebuf.com/vuls/170344.html

https://mp.weixin.qq.com/s/FSMNIkVws3eqDdaheiCviA

https://www.cnblogs.com/gxc6/p/9544563.html

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

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

相关文章

OceanBase-概述

文章目录背景产品家族分布式数据库社区版&#xff08;当前为V4.0&#xff09;企业版公有云总结核心功能适用场景工具体系迁移评估工具OMA迁移工具OMS开发工具ODC权限管理运维工具OCP生态产品图数据库时序数据库背景 前段时间学习了下tidb的体系架构&#xff0c;了解了其运行原…

vulhub中间件解析漏洞复现

vulhub中间件解析漏洞复现 &#x1f349; shell 此环境来自vulhub工程&#xff1a; https://github.com/vulhub/vulhub 以下测试环境为ubuntu 20.04 &#x1f349;目录vulhub中间件解析漏洞复现Apache HTTPD 换行解析漏洞&#xff08;CVE-2017-15715&#xff09;漏洞原理及…

Redis--高级篇 D4 Redis分片集群

1、分片集群的结构 2、搭建分片集群 2.1 分片集群结构 分片集群需要的节点数量较多&#xff0c;这里我们搭建一个最小的分片集群&#xff0c;包含3个master节点&#xff0c;每个master包含一个slave节点&#xff0c;结构如下&#xff1a; 这里我们会在同一台虚拟机中开启6个r…

Java多态详解

前言 多态是同一个行为具有多个不同的表现形态或形式的能力 比如&#xff1a; 小阿giao&#xff0c;他是一名主播&#xff0c;同样也是一个人&#xff1b; 小阿giao是一个对象&#xff1b; 这个对象既有主播形态&#xff0c;也有人类形态&#xff1b; 即&#xff1a;一个对象…

醛基-PEG-纤维二糖 Cellobiose-CHO 纤维二糖-醛基

醛基-PEG-纤维二糖 Cellobiose-CHO 纤维二糖-醛基 羰基中的一个共价键跟氢原子相连而组成的一价原子团&#xff0c;叫做醛基&#xff0c;醛基结构简式是-CHO&#xff0c;醛基是亲水基团&#xff0c;因此有醛基的有机物&#xff08;如乙醛等&#xff09;有一定的水溶性。 中…

Unity有哪些适合拿来练手的游戏项目?

首先推荐一篇文章&#xff0c;其中涵盖海量Unity和C#的书籍、demo等海量干货。 文章链接&#xff1a;Unity 高级程序员应该具备怎样的能力&#xff1f;要怎样成长为 Unity 高级程序员&#xff1f; Unity有哪些适合练手的游戏项目&#xff1f;还是老规矩&#xff0c;全文无付费…

【软件STM32cubeIDE下STM32F4xx使用DMA+定时器+推PWM+点亮灯带WS2812相关-进阶(全数据流版)】

2TOC &#xff08;1&#xff09;前言 &#xff08;1&#xff09;起源 最近作了有关ws2812灯带的后续测试&#xff0c;这源于一个简单的问题。 如果用STM32F4点灯带&#xff0c;每个DMA数据流都用上&#xff0c;那么可以点亮多少条灯带&#xff1f; 实际情况更加复杂些&#x…

JAVA EE,一文彻底聊明白

关于JAVA EE的论述&#xff0c;JAVA EE和Spring的论述在第二、三章节。 目录 1.JAVA的发展史 2.JAVA EE 3.JAVA EE和Spring 1.JAVA的发展史 JAVA语言于1995年面世&#xff0c;主要开发者为——James Gosline&#xff0c;后被称为JAVA语言之父。最早该语言叫Oak&#xff0c;…

写给Java应用开发看的Elasticsearch调优手册

随着数据量的增长&#xff0c;MySQL在很多场景下&#xff0c;似乎已经无能为力了&#xff0c;所以有不少应用的数据从MySQL迁移到了Elasticsearch&#xff0c;我们的应用就在其中。由于开发时间紧张&#xff0c;所以仅仅只是了解了下Elasticsearch的基本知识&#xff0c;随便写…

[HDF5]如何使用CMake一起编译自己的代码和HDF5库

以一个实际项目来举例 目录 一.目录结构 二.CMakeLists.txt内容 三.执行CMakeLists命令 一.目录结构 1.build放CMake执行后生成的所有的内容&#xff0c;包括最后的工程或可执行文件等; 2.include放工程的头文件&#xff0c;以及HDF5的头文件&#xff0c;可以直接把HDF5中…

顶象业务安全情报——企业一眼“看透”黑灰产

不可否认&#xff0c;随着互联网的发展&#xff0c;黑灰产们也变得越来越“聪明”。它们不仅熟悉业务流程以及防护逻辑&#xff0c;并且能够熟练运用自动化、智能化的新兴技术实施攻击或诈骗行为&#xff0c;且极难识别。对购物、金融、社交、出行、教育、游戏等行业造成极大业…

3 个月前被裁员了,心情跌落谷底,直到我看到了这本神书…

3个月前的某一天&#xff0c;正在愉快的打工&#xff0c;突然被喊去谈话&#xff0c;然后就被辞退了。。 加入了找工作的大军 然而&#xff0c;因为疫情&#xff0c;因为大专学历的我&#xff0c;找工作比以往都艰难了许多 很多&#xff0c;纯粹就是因为学历&#xff0c;都不…

你想知道刷题的秘密吗?一篇博客让你明白什么是OJ题,如何刷OJ题,并深入浅出的带你刷遍顺序表的OJ题(小白必看)

目录 0.前言 1.什么是OJ 1.1 OJ简述 1.2 OJ的分类&#xff08;尤其接口型OJ&#xff0c;带你剖析得明明白白&#xff09; 1.3 接口型OJ的输入型参数 2. 剑指 Offer 56 - I. 数组中数字出现的次数 3. 88. 合并两个有序数组 4. 27.移除元素 5. 26. 删除有序数组中的重复…

Linux系统配置JDK环境变量

1、下载 1.1、Oracle官方下载地址&#xff1a;https://www.oracle.com/cn/java/technologies/downloads/#java8 1.2、同意协议&#xff0c;并点击Download 1.3、账号密码登录&#xff0c;没有可以创建一个 1.4、登录成功后就直接下载了 2、配置 2.1、下载好的压缩包上传到Lin…

FreeRTOS第一个任务的创建和调度详解(SVC异常)

在上一篇文章中&#xff0c;我详细分析了FreeRTOS中上下文切换&#xff1a;基于Cortex-M的RTOS上下文切换详解及FreeRTOS实例 但是第一个任务没有上下文&#xff0c;它是怎么运行的呢&#xff1f; 1 创建任务 如果我们没有创建任务的话&#xff0c;系统也有一个空闲任务用来…

【 java 集合】使用迭代器 Iterator 遍历集合

&#x1f4cb; 个人简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是阿牛&#xff0c;全栈领域优质创作者。&#x1f61c;&#x1f4dd; 个人主页&#xff1a;馆主阿牛&#x1f525;&#x1f389; 支持我&#xff1a;点赞&#x1f44d;收藏⭐️留言&#x1f4d…

空气源热泵设备远程监控的优点

空气源热泵热水器是一种节能、环保、安全的新能源产品&#xff0c;也是家庭采暖、生活热水及空调制冷等方面的最佳选择。 在使用时&#xff0c;只需一次少量的电能就能实现连续制热和制冷&#xff0c;其制热效率是燃气热水器、电热水瓶和燃油热车等供热设备的数倍&#xff0c;因…

亿联会议系统操作使用全教程

环境&#xff1a; 终端VC800 亿联会议pc.v4.2.11 教程&#xff1a; 一、下载安装亿联会议PC/手机APP 官网下载 1.以下教程为Windows版演示 2.安装亿联会议软件&#xff08;具体操作按软件提示步骤进行&#xff09; 3.注册账号 3.1点击免费注册按钮&#xff0c;自动跳转至…

SCI投稿经验分享:成功发表一篇中科院2区智能物联网类SCI真的不难

我是如何用三个月成功发表一篇TOP 【本期推荐】本期小编分享点不一样的内容。关注小编三个月以上的铁粉可能会留意到七月份本协会新增了一本计算机智能物联网类1区TOP刊&#xff0c;该刊一经推出就受到了广大作者的纷纷投稿。奈何期刊合作期刊编辑严格控制版面&#xff0c;所以…

配电网络扩展规划:考虑使用概率性能源生产和消费概况的决策(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️❤️&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f389;作者研究&#xff1a;&#x1f3c5;&#x1f3c5;&#x1f3c5;主要研究方向是电力系统和智能算法、机器学…