CVE-2023-22515 Confluence Broken Authentication
虽迟但到,CVSS评分为10分的漏洞,还是值得看看的
官方通告:
https://jira.atlassian.com/browse/CONFSERVER-92475
https://confluence.atlassian.com/security/cve-2023-22515-broken-access-control-vulnerability-in-confluence-data-center-and-server-1295682276.html
影响版本:
1 | 8.0.0, 8.1.0, 8.2.0, 8.3.0, 8.4.0, 8.5.0, 8.0.1, 8.0.2, 8.0.3, 8.0.4, 8.1.1, 8.1.3, 8.2.1, 8.1.4, 8.2.2, 8.2.3, 8.3.1, 8.3.2, 8.4.1, 8.4.2, 8.5.1 |
漏洞分析
下载存在漏洞的版本以及修复版本:
1 | https://product-downloads.atlassian.com/software/confluence/downloads/atlassian-confluence-8.5.1.zip |
添加动态调试,找到service的名字,执行tomcat9w.exe //ES//Confluence041123021026
在Java Options添加
1 | -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 |
XWork框架
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 callsgetFormData().setName("Charles")
by the XWork parameters interceptor. IfgetFormData()
returns null, XWork will attempt to create a new object of the appropriate return type using its default constructor, and then set it withsetFormData(newObject)
而Confluence的处理方案是使用SafeParametersInterceptor拦截器
1 | <interceptor name="params" class="com.atlassian.xwork.interceptors.SafeParametersInterceptor"/> |
看到 com.atlassian.struts2_struts-support-1.1.0.jar 中的com.atlassian.xwork.interceptors.SafeParametersInterceptor#doIntercept
首先看到 before 方法
调用 filterSafeParameters 对参数进行处理
isSafeParameterName
该方法会对传入的参数进行判断,如果包含关键字或者满足正则匹配则返回false
1 | BLOCKED_PARAMETER_NAMES: actionErrors、actionMessages |
最后会调用 isSafeComplexParameterName 方法
检查该类的 getter / setter 或者其 returnType 是否使用了@ParameterSafe
注解
1 | private static boolean isSafeMethod(Method writeMethod) { |
如果没有实现@ParameterSafe
注解,那么 isSafeMethod 就会返回 false
这么一看,漏洞成立需要绕过黑名单验证,并且满足@ParameterSafe
注解,利用条件十分苛刻
但怪就怪在它又调用了super.doIntercept(invocation)
,即 Struts2 自带的 ParametersInterceptor 重新处理了一遍参数
而这就导致属性覆盖,因此 v8.x 版本可以被利用
补丁比较
diff一下 com.atlassian.confluence_confluence-8.5.1.jar 和 com.atlassian.confluence_confluence-8.5.2.jar 文件
struts.xml:
主要是删除了server-info action
看到com.atlassian.confluence.core.actions.ServerInfoAction
该类本身没什么特别的,主要是父类ConfluenceActionSupportcom.atlassian.confluence.core.ConfluenceActionSupport
有一个getter方法叫getBootstrapStatusProvider()
,这个方法能够获取 BootstrapStatusProviderImpl 实例com.atlassian.confluence.impl.setup.BootstrapStatusProviderImpl
根据补丁可以看到修改了 getApplicationConfig 和 getSetupPersister 方法,将对象设置为ReadOnlycom.atlassian.config.ApplicationConfig
存在 setSetupComplete 方法对 setupComplete 赋值,我们可以设置这个值为false让网站进入未安装完成的状态
看到判断是否安装成功的拦截器
1 | <interceptor name="setup" class="com.atlassian.confluence.setup.actions.SetupCheckInterceptor"/> |
正好会判断 setupComplete 这个值
漏洞利用
1 | /server-info.action?bootstrapStatusProvider.applicationConfig.setupComplete=false |
然后访问/setup/setupadministrator-start.action
添加一个新的管理员用户即可
其实不止/server-info.action
,只要是继承了 ConfluenceActionSupport 的action,都存在该漏洞
上传插件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/
上传 plugin_shellplug.jar,访问/plugins/servlet/com.jsos.shell/ShellServlet
成功RCE
参考:
Atlassian Confluence CVE-2023-22515 分析
Confluence 10分漏洞CVE-2023-22515
对 Confluence CVE-2023-22515 的一点分析
https://attackerkb.com/topics/Q5f0ItSzw5/cve-2023-22515/rapid7-analysis