CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析

渗透技巧 2年前 (2022) admin
1,495 0 0

★且听安全-点关注,不迷路!



CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析

★漏洞空间站-优质漏洞资源和小伙伴聚集地!


漏洞信息



Horde Webmail 是一个开源免费的基于浏览器的通信套件,由 Horde 项目组织负责开发维护,但目前系统自 2017 年 9 月后停止了维护。


近日网上公开了一个 Horde Webmail 的远程命令执行漏洞 CVE-2022-30287,该漏洞可以使认证后用户在底层服务器执行任意命令,也可以结合 CSRF 使浏览邮件的用户触发漏洞,根据网络公开视频,受害的用户只需要浏览恶意邮件就会触发漏洞,无需下载附件、执行程序等操作。在分析的过程中,遇到了各种各样的坑,在最终还是成功复现了该漏洞。


环境准备


首先安装 Horde Webmail ,然后安装 Postfix 和 Dovecot ,实现邮服的搭建。


根据公开信息可知,漏洞触发文件为 `merge.php` ,通过分析,可知该文件访问 URL 为 `http://xxx/horde/turba/merge.php` ,该 URL 功能为合并同名联系人。首先进入联系人创建页面:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


创建两个同名的联系人,然后进入搜索页面选择重复项搜索,就可以看到刚才创建的同名的联系人:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


点击合并联系人,然后可以截获到访问的数据包:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


触发点分析


查看 `merge.php` 文件源码,第 16 行 `$source` 、 `$key` 、 `$mergeInto` 变量的值分别是从 HTTP request 的参数 `source` 、 `key` 、 `merge_into` 中获取。其中 `$source` 变量传入 `Turba_Factory_Driver` 实例的 `create` 方法:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


跟进 `Turba_Factory_Driver` 类的 `create` 方法,这里 `$name` 变量即是 `$source` 变量的值。第 57 行判断 `$name` 是否为数组,通过前面代码分析可知截止到这里并没有对传入的 `$source` 变量进行检查,因此我们可以传入数组或非数组。通过前文功能梳理的抓包可知,正常合并联系人时此处传入的是非数组。而如果传入数组, `$name` 变量的值赋给 `$srcConfig` ,计算 `$name` 序列化值的 MD5 赋给 `$key` :


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


重点关注该方法里第 112 行代码,通过 `$class` 、 `$srcName` 、 `$srcConfig[‘params’]` 动态创建类,而其中 `$srcConfig[‘params’]` 的值我们可以通过数组传入。那么关注 `$class` 的赋值过程:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


在 `create` 方法如下位置可以找到,由于 `$key` 值来自于我们传入数组的 MD5 值,所以第 71 行 `$this->_instances[$key]` 显然是不存在的,因此 `if` 条件为 `true` ,当传入的数组含有 `type` 键且 `’Turba_Driver_’ . ucfirst(basename($srcConfig[‘type’]))` 类存在时,就可以执行到刚才的第 112 行实例化该 `Driver`类:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


另外,创建的该驱动对象的 `fields` 数组可以通过 `$srcConfig[‘map’]` 进行赋值,同样可以通过 request 参数进行赋值:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


然后 `create` 方法会返回创建的该 `Driver` 类的实例:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


返回到 `merge.php` 文件,可以看到第 29 行根据上文中我们可以创建的驱动类执行 `getObject` 方法,并且传入 `$mergeInto` 参数,该参数来自于 HTTP request 中的 `merge_into` 参数:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


`getObject` 方法在所有 `Driver` 驱动类的父类 `Turba_Driver` 中实现,并且该方法会去调用各驱动类自己实现的 `_read` 方法,其中 `$objectIds` 变量来自于 `$mergeInto` 参数, `$this->fields` 在上文分析过取值于 request 的参数:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


分析到这里,重点关注到一个 `Driver` 类的实现类 `Turba_Driver_Imsp` ,该类的 `_read` 方法如下:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


通过代码可知 `$IMSPGroups` 一开始是空数组,所以 `$temp` 变量的值来自于 `$this->_imsp->getEntry` 方法,其参数 `$ids[$i]` 可控。而在第 224 行,直接根据 `$temp[‘__members’]` 参数进行反序列化,且分析中间代码可知没有任何过滤:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


分析到这里基本思路就清楚了,通过将 HTTP request 中的 `source` 变量设置为数组,并控制 request 中 `source` 、 `merge_into` 等变量的值,实现反序列化的操作。而很幸运的是 PHPGGC 存在 Horde WebMail 反序列化公开利用链,可以直接利用(需要稍作修改一下)。


Turba_Driver_imsp 实例化


前面提到了通过 `Turba_Driver_Imsp` 可以实现反序列化,那么下面我们分析下如何构造 `Turba_Driver_Imsp` 对象。首先来看 `Turba_Driver_Imsp` 类的构建函数,第一部分可以通过传参轻松赋值,第 89 行根据 `$this->params` 参数创建 `Book` 对象:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


一直跟进代码到 `CoreFactoryImsp.php` 的 `Horde_Core_Factory_Imsp` 类的 `_factory` 方法,第 89 行根据可控参数创建认证相关类,然后通过认证参数 `$params` 创建 `socket` ,并且在第 102 行进行认证:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


跟进第 93 行 `socket` 创建过程,可以跟进到 `ImspClientSocket.php` 中 `Horde_Imsp_Client_Socket` 类的构造方法,然后跟进其父类构造方法,这里发现 `socket` 通信的目标  server 和 port 都是通过 `$params` 获取,即用户可控:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


然后跟进 `Horde_Imsp_Client_Socket` 类的 `_imspOpen` 方法,可以看到会根据服务器响应的信息进行判断,而这里可以通过将 `socket` 指向自定义的服务器并发送指定数据实现绕过:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


返回到 `Horde_Core_Factory_Imsp` 类的 `_factory` 方法,然后跟进第 102 行的认证过程。这里也可以根据通信规则,在自定义的服务器上实现对应的响应来绕过,并且还可以发现在这个通信过程中, server 是可以接收到 `username` 和 `password` 的,而如果当前用户是通过系统用户登陆,那么危害更大:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


到这一步可以顺利执行到 `Turba_Driver_Imsp` 类的 `_read` 方法了,跟进 `$temp` 变量的赋值过程 `$this->_imsp->getEntry` ,可以执行到 `Horde_Imsp_Book` 类的 `getEntry` 方法。这里同样可以根据相应规则来进行响应,并且第 257 行可以根据 `_parseFetchAddressResponse` 方法的解析规则来对 `$entry` 变量赋值,即最终返回值,也就是 `$temp` 的值。我们可以在这里对 `$temp[__member]` 任意赋值:


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析


然后执行到 `Turba_Driver_Imsp` 类的 `_read` 方法的第 224 行,即可实现对恶意数据的反序列化,结合 Horde WebMail 的反序列化利用链即可实现任意命令执行。


完整利用链构造


经过分析发现 Horde WebMail 没有 CSRF Token 的机制,且默认情况下, Horde 会拦截 HTML 邮件中的图像。但是可以通过 HTML 标签 `<picture>`  和 `<source>` 绕过此限制。`<source>` 标签允许开发人员指定多个图像源,这些图像源根据访问网站的用户的尺寸加载。可以实现一个认证后通过 GET 请求来控制底层服务器的效果,还可以通过 CSRF 来触发漏洞,即向受害者发送一封含有通过 `<picture>` 和 `<source>` 标签构造的 GET 请求的邮件,当受害者浏览邮件时即可触发漏洞。


漏洞复现


这里首先启动编写好的 server,然后给受害者发送一封含有通过 `<picture>` 和 `<source>` 标签构造的 GET 请求的邮件,当受害者浏览邮件时即可触发漏洞,实现反弹 shell 的效果(但经过测试发现 Horde WebMail 默认不加载 HTML 代码,会提示用户,只有主动点击加载才会渲染加载):


CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析



由于传播、利用此文档提供的信息而造成任何直接或间接的后果及损害,均由使用本人负责,且听安全团队及文章作者不为此承担任何责任。



★且听安全-点关注,不迷路!

CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析



★漏洞空间站-优质漏洞资源和小伙伴聚集地!

CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析

原文始发于微信公众号(且听安全):CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析

版权声明:admin 发表于 2022年6月17日 上午8:18。
转载请注明:CVE-2022-30287 Horde Webmail PHP反序列化漏洞 “填坑式” 分析 | CTF导航

相关文章

暂无评论

您必须登录才能参与评论!
立即登录
暂无评论...