长亭百川云 - 文章详情

Confluence 数据中心和服务器中的访问控制漏洞(CVE-2023-22515)

中孚安全技术研究

47

2024-07-13

1. 前言

官方公告:
https://confluence.atlassian.com/security/cve-2023-22515-broken-access-control-vulnerability-in-confluence-data-center-and-server-1295682276.html

漏洞****描述:
外部攻击者可能利用可公开访问的 Confluence 数据中心和服务器实例中的先前未知的漏洞来创建未经授权的 Confluence 管理员帐户并访问 Confluence 实例。

影响版本:

  • < 8.0.5

  • < 8.1.5

  • < 8.2.4

  • < 8.3.3

  • < 8.4.3

  • < 8.5.2

8.0.0版本之前不受影响。

2. 环境搭建

从 atlassian 官网下载漏洞版本的 confluence 安装包,Windows 下载 exe 进行安装;
https://www.atlassian.com/software/confluence/download-archives

启动 confluence 服务后,访问http://localhost:8090进入安装步骤,选择Trial Installation;

需要申请一个许可证,点击Get an evaluation license,选择Confluence (Data Center),获取一个免费试用的许可证,复制过来;

然后选择“非集群”,进入创建数据库的步骤;MySQL 数据库需要单独下载驱动;

点击下载地址,选择最新的驱动版本下载;

然后将下载的mysql-connector-j-8.2.0.jar复制到/Atlassian\Confluence\confluence\WEB-INF\lib目录下,重启 Confluence 服务即可配置 Mysql。

需要修改一些 mysql 的配置参数,参考官方 MySQL 数据库配置:https://confluence.atlassian.com/doc/database-setup-for-mysql-128747.html

一直跟着按照流程走就是,选择Empty Site;

             

创建管理员;

安装成功。

参考链接:

https://andblog.cn/2655
https://l4yn3.github.io/2019/04/20/Confluence-漏洞分析环境搭建/

3. 漏洞分析

diff 一下 confluence 8.5.1 和 8.5.2 的 jar 包,可以看到删除了SeverInfoAction.class和ServerInfoFilter.class,新增了ReadOnlyApplicationConfig.class和ReadOnlySetupPersister.class;

两个 ReadyOnly 的类中,都对 setter 方法抛出了 UnsupportedOperationException 异常,字面意思就是不允许的操作异常;

ReadOnlyApplicationConfig 和 ReadOnlySetupPersister 用在了 BootstrapStatusProviderImpl.class 中的getApplicationConfig()和getSetupPersister(),猜测漏洞应该是跟 applicationconfig 和 setuppersister 变量有关。

根据官方公告的漏洞描述,利用漏洞可以创建未经授权的 Confluence 管理员账户,而创建管理员账户的步骤就在安装过程中进行的;

对应的 action 地址是/setup/setupadministrator.action,由于我们已经安装过了,直接访问就会显示Setup is already complete;  

在\confluence\WEB-INF\lib\com.atlassian.confluence_confluence-8.5.1.jar!\com\atlassian\confluence\core\ConfluenceActionSupport.propertie中,Setup is already complete这个字符串信息是赋给了setup.already.title变量;         
而在\setup\alreadysetup.vm中使用了这个变量;

在 struts.xml 中看到,alreadysetup.vm是 alreadysetup 结果的返回页面;

在 SetupCheckInterceptor 拦截器中,存在返回 alreadysetup 的情况,前面两个方法结果都为 true 就返回 alreadysetup。

先看一下isSetupComplete()方法,也就是说,这个方法的返回结果是跟bootstrapStatusProvider.applicationConfig.setupComplete变量值相关的,安装完成后这个值就为 true。

那么如果能把bootstrapStatusProvider.applicationConfig.setupComplete的值改为 false,就可以重新进行安装步骤,从而创建新的管理员账户了。

看看新版本中被删除的 ServerInfoAction,好像没什么问题;

再看看它的父类,ConfluenceActionSupport 有一个getBootstrapStatusProvider()方法,看名字有点用的感觉,其中实例化了BootstrapStatusProviderImpl 类;

跟进,在 BootstrapStatusProviderImpl 中有一个getApplicationConfig(),而 ApplicationConfig 中有setSetupComplete(),如果能调用这些 gettet/setter 方法,就成功了。

所以,要寻找能够调用getBootstrapStatusProvider().getApplicationConfig().setSetupComplete(false)的地方。

4. 漏洞复现

根据 Struts2 框架下 XWork 的特性,可以直接通过 HTTP 参数调用对象的 gettet/setter 方法;
向 URL 中传入参数/server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false,返回 success;
再访问/setup/setupadministrator-start.action,就可以重新创建管理员账号了。

继承了 ConfluenceActionSupport 的 action 类都可以进行利用,只是请求方法有的有些不同。

参考链接:

https://cn-sec.com/archives/2177640.html https://exp10it.cn/2023/10/atlassian-confluence-cve-2023-22515-分析/

相关推荐
关注或联系我们
添加百川云公众号,移动管理云安全产品
咨询热线:
4000-327-707
百川公众号
百川公众号
百川云客服
百川云客服

Copyright ©2024 北京长亭科技有限公司
icon
京ICP备 2024055124号-2