CVE-2022-27925复现

·
Java代码审计 no tag July 8, 2022

漏洞信息

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里

image-20220707095839564

全局搜索mboximport定位jar包为zimbrabackup.jar

image-20220707100001867

这个方法含有doPost方法 大体上是一个Servlet对象。但是这个类是继承ExtensionHttpHandler而不是HttpServlet

image-20220707101212831

现在就是要找到怎么通过URL关联到这里。

我们对ExtensionHttpHandler进行查找

image-20220707103923039

发现这里在ExtensionDispatcherServlet中出现,跟进查看

image-20220707104114106

这个类继承ZimbraServlet而ZimbraServlet又继承HttpServlet看看这个Servlet对应的URL是什么

全局搜索ExtensionDispatcherServlet在webapps\service\WEB-INF\web.xml中发现

image-20220707104335903

根据上图,我们知道路由应该是/service/extension

我们接着看

image-20220707105152629

跟进这个getHandler函数,看看它如何返回一个MailboxImportServlet

image-20220707105321343

需要继续跟进,看看这个extPath怎么来的

image-20220707105538641

调试得知这里其实就是extension后面的东西。

image-20220707105648583

继续跟进,这里的sHandlers是一个map类型的。看看如何来的

image-20220707105800906

这个sHandlers的key来自getPath()

image-20220707110328373

mExtension是ZimbraExtension类型,在init里完成了初始化

这里定位到BackupExtension

image-20220707112302028

刚好注册了MailboxImportServlet这个handler。到这个ext也就是this.mExtension

这里getName函数返回了backup于是路径即为/service/extension/backup

image-20220707114426799

这里加了/mboximport所以路径为/service/extension/backup/mboximport

image-20220707114716494

成功进入。

从这里可以看出来档authToken为空或者不是管理员时,这里就会认证失败。

image-20220707141751693

我们自己登录admin账户,然后发送。发现这里接收的其实是ZM_AUTH_TOKEN而不是我们登录后传输的ZM_ADMIN_AUTH_TOKEN

image-20220707141833121

所以我们直接把ADMIN_删掉即可。

最终构造出这样的包即可到下一步

image-20220707143402700

因为问题出在zip压缩 我们搜索zip发现

image-20220707115953530

这里使用了zip,做了一些操作,我们看一下这个函数

image-20220707120034668

这个地方使用了该函数,前面做了一些验证。我们待会再看。

接着上面的来,这里有个restore函数比较敏感。我们跟进去看一下。

image-20220707154911071

继续跟进getAccountSession

image-20220707154935618

继续跟进构造函数

image-20220707154951914

这里就可以看到解压的操作了。

image-20220707154331283

这里的ZipBackupTarget.this.mZipIn.getNextEntry()有目录穿越漏洞。所以构造POST包。

image-20220707154510780

成功写入shell

image-20220707154551947

EXP

暂不公开
  • MRCTF springcoffe
  • CVE-2022-28219 Zoho组合Java XXE和反序列化漏洞实现RCE
取消回复

说点什么?
Title
配置主机名
下载
配置DNS(这一步可以省略)
安装bind9
配置bind9
确认DNS
安装
正确设置域名 (没配dns可以直接no)
修改管理员密码
调试配置

© 2023 Yang_99的小窝. Using Typecho & Moricolor.