Confluence 未授权漏洞分析(CVE-2023-22515)

news2025/1/16 20:12:57

0x01 漏洞描述

Confluence 是由 Atlassian 开发的企业级协作软件。2023年10月,Atlassian 官方披露 CVE-2023-22515 Atlassian Confluence Data Center & Server 权限提升漏洞。攻击者可构造恶意请求创建管理员,从而登录系统,造成敏感信息泄漏等。

如果 Confluence 站点托管在 Atlassian Cloud(域名为:atlassian.net),则不受此漏洞影响。

0x02 影响版本

8.0.0 - - 8.0.4
8.1.0 - - 8.1.4
8.2.0 - - 8.2.3
8.3.0 - - 8.3.2
8.4.0 - - 8.4.2
8.5.0 - - 8.5.1

0x03 环境搭建

安装包 https://www.atlassian.com/software/confluence/download-archives

jar 包:

https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.5.1.zip  
https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.5.2.zip

大致的安装可以看 https://cn-sec.com/archives/2177640.html

其中有一步数据库的安装会存在一些问题,首先是新建数据库的时候,对编码有要求

CREATE DATABASE confluence CHARACTER SET utf8mb4 COLLATE utf8mb4_bin;

随后是连接

jdbc:mysql://localhost/confluence?sessionVariables=transaction_isolation='READ-COMMITTED'

setupDatabase.png

在配置数据库时需要指定 READ-COMMITTED

下一步是做调试准备,这里的调试需要找到 Service

service.png

随后在 cmd 里面运行这一个行命令,就会跳出如图所示的框框

tomcat9w.exe //ES//Confluence151123100612

漏洞分析/CVE-2023-22515 Confluence 未授权漏洞分析/cmd.png

随后添加 JAVA_OPTS,进行动调

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)

漏洞分析/CVE-2023-22515 Confluence 未授权漏洞分析/debug.png

0x04 漏洞分析

根据官方的公告,修复建议是给 /setup 打头的接口做鉴权校验

<security-constraint>
      <web-resource-collection>
        <url-pattern>/setup/*</url-pattern>
			<http-method-omission>*</http-method-omission>
		</web-resource-collection>
      <auth-constraint />
	</security-constraint>

由于 Confluence 这里的框架是基于 S2 的,S2 的大致流程如 su18 师傅的图所示

s2Route.png

也就是说我们现在需要去找一下 /setup/* 接口是怎么被处理的,直接分析是比较难的,所以先 diff 一下代码。

  • 首先 struts2.xml 里面

  • 修复版本新增了 struts.override.acceptedPatterns

  • 修复版本删除了 server-info action

strutsXMLDiff.png

  • 接着是 BootstapStatusProviderImpl 类里面增加了部分内容,对属性 setupPersister 和 applicationConfig 做了限制

BootstapStatusProviderImpl.png

这里有点没看懂修了什么,所以我先动调观察具体接口是怎么处理的,根据 Struts2 的特性,去到 struts.xml 里面找对应的 Interceptor,不难找到具体处理的拦截器是 SetupCheckInterceptor

setupInterceptor.png

开始动调,看一下 /setup/setupadministrator.action 接口的逻辑是怎么处理的。

中间走到 com.atlassian.config.ApplicationConfig#isSetupComplete 时,在新版本的 fix 里面是增加了这一段的 ReadOnlyApplicationConfig 配置的

isSetupComplete.png

所以这里的漏洞利用思路大概就是先动态修改 setupPersisterapplicationConfig,在触发了这一点之后,能够下一步访问 /setup/setupadministrator.action,重新配置管理员密码。

这里具体的实现很有意思,su18 师傅的文章说的很明白,我就直接拿过来用了

https://su18.org/post/struts2-1/

OGNL 中的根对象即为 ValueStack(值栈),这个对象贯穿整个 Action 的生命周期(每个 Action 类的对象实例会拥有一个 ValueStack 对象)。当Struts 2接收到一个 .action 的请求后,会先建立Action 类的对象实例,但并不会调用 Action 方法,而是先将 Action 类的相应属性放到 ValueStack 的实现类 OgnlValueStack 对象 root 对象的顶层节点( ValueStack 对象相当于一个栈)。在处理完上述工作后,Struts2 就会调用拦截器链中的拦截器,这些拦截器会根据用户请求参数值去更新 ValueStack 对象顶层节点的相应属性的值,最后会传到 Action 对象,并将 ValueStack 对象中的属性值,赋给 Action 类的相应属性。当调用完所有的拦截器后,才会调用 Action 类的 Action 方法。ValueStack 会在请求开始时被创建,请求结束时消亡。

我们需要找一个 OGNL 的点, 并且这个点能够以某种方式去调用某个类的 getter / setter, 以此来配置 applicationConfig 的 setupComplete 字段

于是去 diff 跟 Struts2 有关的依赖, 即 com.atlassian.struts2_struts-support-1.1.0.jarcom.atlassian.struts2_struts-support-1.2.0.jar

diff2.png

发现修改的类是 SafeParametersInterceptor,这个类会处理所有的输入,所以 server-info.action 这个请求也会经过它

同时,Confluence 使用了 XWork 框架,它允许通过 HTTP 请求来设置 Java 对象的参数:XWork Plugin Complex Parameters and Security

XWork allows the setting of complex parameters on an XWork action object. For example, a URL parameter of formData.name=Charles will be translated by XWork into the method calls getFormData().setName("Charles") by the XWork parameters interceptor. If getFormData() returns null, XWork will attempt to create a new object of the appropriate return type using its default constructor, and then set it with setFormData(newObject)

这就允许我们在输入时候传参类似于 ?test=a.b.c,动调一下

http://192.168.80.137:8090/server-info.action?a.b.c

这里会先做过滤,跟进 this.filterSafeParameters() 方法,该方法会对传入的参数进行判断,如果包含关键字或者满足正则匹配则返回 false

filterSafeParameters.png

BLOCKED_PARAMETER_NAMES: actionErrors、actionMessages  
EXCLUDE_CLASS_PATTERN: .*class[^a-z0-9_].*  
SAFE_PARAMETER_NAME_PATTERN: \w+((\.\w+)|(\[\d+\])|(\['[\w.]*'\]))*  
MAP_PARAMETER_PATTERN: .*\['[a-zA-Z0-9_]+'\]

如果不在黑名单内,最后会调用 isSafeComplexParameterName() 方法,这个方法会检查传入的参数是否调用了当前 action 的某个 getter / setter,如果调用了,则判断里面是否有 ParameterSafe 注解。

isSafeComplexParameterName.png

如果没有实现 @ParameterSafe 注解,那么 isSafeMethod 就会返回 false

这么一看,漏洞成立需要绕过黑名单验证,并且满足 @ParameterSafe 注解,利用条件十分苛刻。继续往下走,回到 com.atlassian.xwork.interceptors.SafeParametersInterceptor#doIntercept,跟进 super.doIntercept() 方法。能够看到这里是跟进到了 com.opensymphony.xwork2.interceptor.ParametersInterceptor#doIntercept 方法,它会重新处理一遍参数,这就导致上面的黑名单完全没生效。

doIntercept.png

跟进 setParameters() 方法后其实就是 S2 处理 OGNL 语句的那一套,参考 https://drun1baby.top/2022/10/27/Java-Struts2-%E7%B3%BB%E5%88%97-S2-001/#%E6%B5%81%E7%A8%8B%E5%88%86%E6%9E%90

setParameter.png

总的来说, 因为 SafeParametersInterceptor.doIntercept() 方法的一些逻辑问题, 导致这个类自身对传入参数的过滤并没有生效, 我们最终还是可以通过 a.b.c=e 的形式去调用当前 action 的 getter / setter, 并不需要关心方法本身或者它的 returnType 是否使用了 @ParameterSafe 注解

到这里思路就很清晰了,我们只需要构造 OGNL 即可,调用某个 Action 里的 setter,让 isSetupComplete=false 即可

以 ServerInfoAction 为例, 它继承自 ConfluenceActionSupport

getBootstrapStatusProvider.png

这里的 getBootstrapStatusProvider() 方法调用了 BootstrapStatusProviderImpl.getInstance(),接下来就可以去 BootstrapStatusProviderImpl 里面寻找调用链,可惜的是这里的 setSetupComplete() 已经用不了了,只能找另外的

setSetupComplete.png

最终找到的是 getApplicationConfig() 方法,而在 ApplicationConfig 类里面存在 setSetupComplete() 方法可用

setSetupCompleteEnd.png

因为 Confluence 的所有 Action 都继承自 ConfluenceActionSupport, 所以理论上只要访问任意一个使用了 SafeParameterInterceptor 的路由, 无论是 GET 还是 POST 方法都能够利用成功

于是最后的 PoC 应该是

http://192.168.80.137:8090/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false

在进行覆盖 setupComplete=false 之后重新注册管理员

http://192.168.80.137:8090/setup/setupadministrator-start.action

漏洞分析/CVE-2023-22515 Confluence 未授权漏洞分析/poc.png

0x05 未授权之后的 RCE

X1r0z 师傅已经介绍了一种 RCE 的方法,但是利用条件有限,需要 web目录可写并且高权限用户

其实有一种更简单的方法,看到:https://packetstormsecurity.com/files/175225/Atlassian-Confluence-Unauthenticated-Remote-Code-Execution.html

可以通过上传插件实现 RCE,利用工具github上已经存在了:https://github.com/AIex-3/confluence-hack/

http://192.168.80.137:8090/plugins/servlet/upm

managePlugins.png

上传 plugin_shellplug.jar,访问 /plugins/servlet/com.jsos.shell/ShellServlet

rce.png

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

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

相关文章

BUUCTF [SWPU2019]神奇的二维码 1

BUUCTF:https://buuoj.cn/challenges 题目描述&#xff1a; 得到的 flag 请包上 flag{} 提交。 密文&#xff1a; 下载附件&#xff0c;得到一个.png图片。 解题思路&#xff1a; 1、使用QR research扫一下&#xff0c;得到“swpuctf{flag_is_not_here}”的提示。 2、放到0…

HTML新手入门笔记整理:HTML基本介绍

网页 静态页面 仅可供用户浏览&#xff0c;不具备与服务器交互的功能。 动态页面 可供用户浏览&#xff0c;具备与服务器交互的功能。 HTML HTML&#xff0c;全称HyperText Markup Language&#xff08;超文本标记语言&#xff09;,是一种用于创建网页的标准标记语言。用于…

经典双指针算法试题(二)

&#x1f4d8;北尘_&#xff1a;个人主页 &#x1f30e;个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上&#xff0c;不忘来时的初心 文章目录 一、有效三角形的个数1、题目讲解2、讲解算法原理3、代码实现 二、查找总价格为目标值的两个商…

MCU 的 TOP 15 图形GUI库:选择最适合你的图形用户界面(一)

在嵌入式系统开发中&#xff0c;选择一个合适的图形用户界面&#xff08;GUI&#xff09;库是至关重要的。在屏幕上显示的时候&#xff0c;使用现成的图形库&#xff0c;这样开发人员就不需要弄清楚底层任务&#xff0c;例如如何绘制像素、线条、形状&#xff0c;如果再高级一点…

栈和队列java实现

栈和队列都是动态集合&#xff0c;且在其上进行DELETE操作所移除的元素是预先设定的。在栈中&#xff0c;被删除的是最近插入的元素&#xff1a;栈实现的是一种后进先出&#xff08;last-in&#xff0c;first-out&#xff0c;LIFO&#xff09; 策略。在队列中&#xff0c;被删去…

问鼎web服务

华子目录 www简介常见Web服务程序介绍&#xff1a;服务器主机主要数据浏览器网址及http介绍urlhttp请求方法 http协议请求的工作流程www服务器类型静态网站动态网站 快速安装Apache安装准备工作httpd所需目录主配置文件 实验操作 www简介 Web网络服务也叫www&#xff08;world…

K8S部署mongodb-sharded-cluster(7.0.2)副本分片

添加源 helm repo add bitnami https://charts.bitnami.com/bitnami指定版本拉取 helm pull --repo https://charts.bitnami.com/bitnami mongodb-sharded --version 7.0.5安装时选择SCRAM-SHA-1默认是SCRAM-SHA-256 helm install -n prod mymongodb mongodb-sharded --value…

优先级队列(priority_queue)

文章目录 优先级队列的定义定义&#xff1a;接口头文件优先队列和堆的关系使用&#xff1a;排序的规则容器 仿函数应用 队列存指针问题&#xff1a; 优先级队列的定义 定义&#xff1a; 黄色部分是仿函数 接口 头文件 这里不需要包含其他的头文件只需要使用队列的头文件就可以…

蓝桥杯每日一题2023.11.22

题目描述 题目分析 由题目知其每个品牌积分一定小于315故直接暴力枚举每个品牌如果符合要求直接输出即可 &#xff08;答案&#xff1a;150&#xff09; #include<bits/stdc.h> using namespace std; int main() {for(int i 1; i < 315; i ){for(int j 1; j <…

三、防火墙-源NAT

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 源NAT基本原理1.1.NAT No-PAT1.2.NAPT1.3.出接口地址方式&#xff08;Easy IP&#xff09;1.4.Smart NAT1.5.三元组 NAT1.6.多出口场景下的源NAT 总结延伸 ——————————————————————————————…

python实现调和反距离空间插值法AIDW

1 简介 AIDW 主要是针对 IDW 的缺点进行了改进&#xff0c;考虑了样本点与预测点的位置&#xff0c;即方向和距离&#xff0c;具体见下图&#xff1a; 2 改进 IDW 公式&#xff1a; 从IDW算法可看出&#xff0c;插值点的估算值仅与插值样本距插值点的远近相关&#xff0c;并未…

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码

基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于鹈鹕算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于鹈鹕优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络的光滑…

【LeetCode刷题】--40.组合总和II

40.组合总和II 本题详解&#xff1a;回溯算法 class Solution {public List<List<Integer>> combinationSum2(int[] candidates, int target) {int len candidates.length;List<List<Integer>> res new ArrayList<>();if (len 0) {return re…

基于python人脸性别年龄检测系统-深度学习项目

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介简介技术组成1. OpenCV2. Dlib3. TensorFlow 和 Keras 功能流程 二、功能三、系统四. 总结 一项目简介 # Python 人脸性别年龄检测系统介绍 简介 该系统基…

Windows、VMware问题集合

Windows、VMware问题集合 一. Windows11安装VMware17提升虚拟机性能1. 桌面右击图标点击属性——>兼容性&#xff0c;找到“以管理员身份运行此程序”勾选&#xff0c;最后点击确定即可。2. 关闭win11的内核隔离功能。 二. VMware虚拟机报错&#xff08;虚拟化性能计数器需要…

UML建模图文详解教程——类图

版权声明 本文原创作者&#xff1a;谷哥的小弟作者博客地址&#xff1a;http://blog.csdn.net/lfdfhl本文参考资料&#xff1a;《UML面向对象分析、建模与设计&#xff08;第2版&#xff09;》吕云翔&#xff0c;赵天宇 著 类图概述 类图用来描述系统内各种实体的类型以及不同…

计算机毕业设计 基于微信小程序的“共享书角”图书借还管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

非结构化数据保护

计算机信息化系统中的数据分为结构化数据和非结构化数据。非结构化数据其格式非常多样&#xff0c;标准也是多样性的&#xff0c;而且在技术上非结构化信息比结构化信息更难标准化和理解。 非结构化数据是数据结构不规则或不完整&#xff0c;没有预定义的数据模型&#xff0c;…

阿里云 ACK 新升级,打造智算时代的现代化应用平台

云布道师 今天&#xff0c;能想到的或是想不到的领域&#xff0c;对容器和 Kubernetes 的需求都居高不减&#xff0c;使这项技术正在真正走向无处不在。 在 2023 云栖大会上&#xff0c;阿里云云原生产品线容器服务负责人易立关于容器服务 ACK 在本届亚运会上应用的介绍&#…

智慧法院档案数字化解决方案

智慧法院档案数字化解决方案可以采用以下步骤&#xff1a; 1. 确定数字化目标&#xff1a;明确数字化的目标和范围&#xff0c;比如将所有的案件相关文件、纸质档案和材料进行数字化。 2. 确定数字化流程&#xff1a;制定数字化的流程和标准&#xff0c;比如采用哪些设备和软件…