CVE-2022-27925Zimbra Collaboration存在路径穿越漏洞最终导致RCE

声明

出品|且听安全(ID: QCyber)

以下内容,来自且听安全的公众号作者原创,由于传播,利用此文所提供的信息而造成的任何直接或间接的后果和损失,均由使用者本人负责,长白山攻防实验室以及文章作者不承担任何责任。

漏洞信息

前段时间 Zimbra 官方通报了一个 RCE 漏洞 CVE-2022-27925 ,也有小伙伴在漏洞空间站谈到了这个漏洞,上周末在家有时间完成了漏洞的分析与复现。漏洞原理并不复杂,但在搭建环境的过程中遇到了一些坑,下面将分析过程分享给大家。

图片

从描述来看,这是一个 ZIP 压缩包解析导致路径穿越类型的漏洞。

环境搭建

由于直接安装 v9.0.0 或 v8.8.15 默认就是最新版,因此选择安装 v8.8.12。安装过程非常曲折,环境搭建有疑惑的小伙伴可以加入漏洞空间站进行交流。最终完成安装并启动成功:

图片

通过配置 `mailboxd_java_options` 加入调试信息:

图片

重启 Zimbra 服务即可打开远程调试:

图片

寻找调用链

漏洞出现在`mboximport`相关的功能中,全盘搜索定位到位于

`zimbrabackup.jar`中的`MailboxImpo-rtServlet` :

图片

从命名规则和存在的成员函数`doPost` 来看,`MailboxImportServlet` 应该对应一个`Servlet`对象,但是`MailboxI-mportServlet`继承于`Extension-HttpHandler`而非`HttpServlet` :

图片

所以还需要寻找某种相互之间的转换关系。我们知道Zimbra自定义了 `Servlet`对象的基类`ZimbraServlet` ,搜索其子类:

图片

定位 `ExtensionDispatcherServlet` :

图片

可以找到相关配置:

图片

图片

所以`ExtensionDispatcherServlet` 对应的URL规则为`/service/ex-tension/*` ,回到`ExtensionDispatcherServlet#service`函数:

图片

通过`getHandler`函数来寻找对应的`ExtensionHttpHandler`对象`handler`

(前面定位的 `MailboxImportServlet`正好继承于`ExtensionHttp-Handler`),进入`getHandler`函数:

图片

提取URL中`/service/extension`之后的字符串并赋值给`extPath`,带入

`getHandler` 函数:

图片

返回的`ExtensionHttpHandler`对象来自于`sHandlers`键值对,其中的`key` 来自于`ExtensionHttpHandler#getPath`函数,查看定义:

图片

`ExtensionHttpHandler#getPath` :

图片

图片

`mExtension`为`ZimbraExtension`类型,并且在`init`函数中完成初始化,搜索`ZimbraExtension`子类:

图片

定位 `BackupExtension` ,里面刚好注册了`MailboxImportServlet`类型:

图片

所以构造特定URL将调用`MailboxIm-portServlet`,测试如下:

图片

成功进入

`MailboxImportServlet#doPost`函数处理逻辑。

权限认证分析

下面分析一下`doPost`函数的处理逻辑,首先通过

`getAuthTokenFromCookie`从Cookie中提取token认证信息,并检查是否为管理员权限:

AuthToken authToken = ZimbraServlet.getAuthTokenFromCookie(req, resp);
if (authToken == null || !authToken.isAdmin()) {
    Log.mboxmove.warn("Auth failed");
    this.sendError(resp, 403, "Auth failed");
}

进入`getAuthTokenFromCookie` :

图片

因为这里`isAdminReq`默认为`false`,因此认证后需要携带

`ZM_AUTH_TOKEN`的Cookie值,而非`ZM_ADMIN_AUTH_TOKEN`:

图片

漏洞点定位

通过权限检查后,将会进行一系列参数提取与判断,当提供的`account-name` 等参数通过验证后,将进入第152行`importFrom`函数:

图片

其中`in`来自于 POST请求数据包,进入`importFrom`函数:

图片

提取ZIP压缩包,调用 `restore` 函数:

图片

进入 `getAccountSession` 函数:

图片

实例化`ZipBackupTarget.RestoreAcct-Session` 对象,进入构造函数:

图片

跟进 `unzipToTempFiles` 函数:

图片

ZIP 压缩包解压过程存在路径穿越漏洞,导致可以向任意路径写入 shell 。

漏洞复现

通过上述分析,我们可以构造一个存在路径穿越的 ZIP 压缩包,并发送特定 POST 请求实现压缩包解压路径穿越:

图片

最终写入 shell

图片

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值