CVE-2022-27925复现
漏洞信息
Zimbra 官方通报了一个 RCE 漏洞 CVE-2022-27925
- ZIP 压缩包解析导致路径穿越类型的漏洞
- 影响版本 v8.8.15 P30-v9.0.0 P23
环境搭建
系统:Ubuntu14.04
ip地址:192.168.44.133
配置主机名
hostnamectl set-hostname zimbra.test.com
192.168.44.133 zimbra.test.com #添加到/etc/hosts
下载
这里要下载NETWORK版本的才有这个漏洞
wget https://files.zimbra.com/downloads/8.8.12_GA/zcs-NETWORK-8.8.12_GA_3794.UBUNTU14_64.20190329045002.tgz
tar zxvf zcs-8.8.12_GA_3794.UBUNTU18_64.20190329045002.tgz
mv zcs-8.8.12_GA_3794.UBUNTU18_64.20190329045002 /usr/local/zimbra
cd /usr/local/zimbra
配置DNS(这一步可以省略)
安装bind9
apt-get install bind9
apt-get update
apt-get upgrade
配置bind9
打开文件/etc/bind/named.conf.default-zones,在末尾增加如下内容
在后面添加
zone "test.com" {
type master;
file "/etc/bind/db.test.com";
};
注意zone后边是test.com,就是刚才规划好的zone名称,不要写错。这个文件的意思是有一个“test.com”的zone,这个zone管理的域名定义在db.test.com文件中,保存后运行named-checkconf检查一下格式:
root@zimbra:~# named-checkconf /etc/bind/named.conf.default-zones
root@zimbra:~# echo $?
0
root@zimbra:~#
出错的话说明格式有问题(比如双引号写成中文的等)。
接下来创建/etc/bind/db.test.com文件,内容如下:
;
; BIND data file for local loopback interface
;
$TTL 604800
@ IN SOA zimbra.test.com. admin.test.com. (
20190316 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
IN NS zimbra
IN MX 10 mail
zimbra IN A 192.168.44.133
mail IN A 192.168.44.133
www IN A 192.168.44.133
ftp IN CNAME www
关于这个文件的格式问题,可以参考:http://blog.chinaunix.net/uid-20094216-id-1977734.html,里边解析的很详细。保存以后运行named-checkzone检察格式:
root@zimbra:~# named-checkzone test.com /etc/bind/db.test.com
zone test.com/IN: loaded serial 20190316
OK
root@zimbra:~#
接下来修改/etc/bind/named.conf.options:
listen-on port 53 {127.0.0.1;192.168.44.133;};
确认DNS
修改/etc/resolv.conf
nameserver 192.168.44.133
最后重启
service bind9 restart
然后命令进行确认
nslookup -query=mx test.com
nslookup mail.test.com
出现192.168开头即可
安装
./install.sh
如果内存不够可以安装部分
Select the packages to install
Install zimbra-ldap [Y] Y
Install zimbra-logger [Y] N
Install zimbra-mta [Y] Y
Install zimbra-dnscache [Y] N
Install zimbra-snmp [Y] N
Install zimbra-store [Y] Y
Install zimbra-apache [Y] N
Install zimbra-spell [Y] N
Install zimbra-memcached [Y] N
Install zimbra-proxy [Y] Y
Install zimbra-drive [Y] N
Install zimbra-imapd (BETA - for evaluation only) [N] N
Install zimbra-chat [Y] N
正确设置域名 (没配dns可以直接no)
这里会让我们选择域名 我们填好
It is suggested that the domain name have an MX record configured in DNS
Change domain name? [Yes] Y
Create domain: [zimbra.test.com] test.com
修改管理员密码
Main menu
1) Common Configuration:
2) zimbra-ldap: Enabled
3) zimbra-mta: Enabled
4) zimbra-store: Enabled
+Create Admin User: yes
+Admin user to create: admin@test.com
******* +Admin Password UNSET
+Anti-virus quarantine user: virus-quarantine.kvgxhg5p@test.com
+Enable automated spam training: yes
+Spam training user: spam.ptwcrw6l@test.com
+Non-spam(Ham) training user: ham.xfagn_sq@test.com
+SMTP host: zimbra.test.com
+Web server HTTP port: 8080
+Web server HTTPS port: 8443
+Web server mode: https
+IMAP server port: 7143
+IMAP server SSL port: 7993
+POP server port: 7110
+POP server SSL port: 7995
+Use spell check server: no
+Enable version update checks: TRUE
+Enable version update notifications: TRUE
+Version update notification email: admin@test.com
+Version update source email: admin@test.com
+Install mailstore (service webapp): yes
+Install UI (zimbra,zimbraAdmin webapps): yes
5) zimbra-proxy: Enabled
6) Default Class of Service Configuration:
s) Save config to file
x) Expand menu
q) Quit
管理员菜单 我们选择4 linces随便填一个文件不影响。然后按照指示更改密码基本就装好了。
https://192.168.44.137:7071/ 打开管理界面
调试配置
1.停止zimbra服务
zmmailboxdmgr.unrestricted
https://xw.qq.com/cmsid/20220127A03XOG00
su zimbra
zmcontrol stop
cp /opt/zimbra/libexec/zmmailboxdmgr /opt/zimbra/libexec/zmmailboxdmgr.old
cp /opt/zimbra/libexec/zmmailboxdmgr.unrestricted /opt/zimbra/libexec/zmmailboxdmgr
vim /opt/zimbra/conf/localconfig.xml
-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005
zmcontrol start
搭建好后访问 https://192.168.44.151:7071/zimbraAdmin/
IDEA接上可以进行远程调试
代码审计
NVD官方文档说漏洞点出现在mboximport
里
全局搜索mboximport
定位jar包为zimbrabackup.jar
这个方法含有doPost
方法 大体上是一个Servlet对象。但是这个类是继承ExtensionHttpHandler
而不是HttpServlet
现在就是要找到怎么通过URL关联到这里。
我们对ExtensionHttpHandler
进行查找
发现这里在ExtensionDispatcherServlet
中出现,跟进查看
这个类继承ZimbraServlet
而ZimbraServlet
又继承HttpServlet
看看这个Servlet
对应的URL是什么
全局搜索ExtensionDispatcherServlet
在webapps\service\WEB-INF\web.xml
中发现
根据上图,我们知道路由应该是/service/extension
我们接着看
跟进这个getHandler函数,看看它如何返回一个MailboxImportServlet
需要继续跟进,看看这个extPath
怎么来的
调试得知这里其实就是extension后面的东西。
继续跟进,这里的sHandlers
是一个map类型的。看看如何来的
这个sHandlers
的key来自getPath()
mExtension
是ZimbraExtension
类型,在init里完成了初始化
这里定位到BackupExtension
刚好注册了MailboxImportServlet
这个handler。到这个ext
也就是this.mExtension
这里getName函数返回了backup
于是路径即为/service/extension/backup
这里加了/mboximport
所以路径为/service/extension/backup/mboximport
成功进入。
从这里可以看出来档authToken为空或者不是管理员时,这里就会认证失败。
我们自己登录admin账户,然后发送。发现这里接收的其实是ZM_AUTH_TOKEN而不是我们登录后传输的ZM_ADMIN_AUTH_TOKEN
所以我们直接把ADMIN_删掉即可。
最终构造出这样的包即可到下一步
因为问题出在zip压缩 我们搜索zip发现
这里使用了zip,做了一些操作,我们看一下这个函数
这个地方使用了该函数,前面做了一些验证。我们待会再看。
接着上面的来,这里有个restore函数比较敏感。我们跟进去看一下。
继续跟进getAccountSession
继续跟进构造函数
这里就可以看到解压的操作了。
这里的ZipBackupTarget.this.mZipIn.getNextEntry()
有目录穿越漏洞。所以构造POST包。
成功写入shell
EXP
暂不公开