Zimbra xxe+ssrf 远程代码执行

来源:scanv2019.03.27

一、漏洞概述

1.简介

  2019年3月13号,国外一名安全研究员在他的博客上公布了zimbra的这起漏洞,但是其中并未提到一些漏洞的利用细节,ScanV团队成员将整个漏洞的利用过程进行复现。

原文链接:https://blog.tint0.com/2019/03/a-saga-of-code-executions-onzimbra.html#href1_ret1..

2.影响版本

• Zimbra < 8.7.1 攻击者可以在无需登录的情况下,实现getshell

• Zimbra<8.8.11 在服务端使用Memcached做缓存的情况下,经过登录认证后可以实现远程代码执行

二、漏洞复现

1.复现环境

• Zimbra 8.5.0

• ubuntu 14.04(172.16.123.134)(受害者服务器)

• ubuntu 18.04 (172.16.123.1)(攻击者服务器)

此处特别强调Zimbra只能安装在特定版本的linux发行版上,与ubuntu适配最佳,且zimbra8.5不支持ubuntu14以上发行

2.复现过程及结果

环境搭建


Zimbra的环境搭建比较麻烦,在此推荐几篇有关zimbra搭建的优质博文 https://www.jianshu.com/p/722bc70ff426 关键在于选择合适版本ubuntu虚拟机,主机hosts配置,dnsmasq的配置,最后的环境可以不配置ssl.

复现流程

原文中需要利用xxe来读取目标主机的 localconfig.xml文件,此文件有一个类似超级管理员用户的密码,而超级管理员的用户名默认为zimbra,所以只要拿到zimbra的密码就等同于已经获得zimbra的最高权限。但是,Zimbra使用token进行权限管理,而管理员的token只可能分配给来自7071端口的请求,而这个端口通常不会对外开放,所以需要使用ssrf。但是ssrf利用需要一些条件,ssrf的利用点存在于源码中的 ProxyServlet.doProxy() 函数处,源码如下:

从上面的代码逻辑中可以看出,只有在token作为parameter传递过来时才会对其进行验证,否则,如果token是从cookie传递过来则不会进入验证,所以只需要得到合法的普通token,而获取token则要利用到Zimbra的特性。

由于doProxy会从服务端发送一个请求到目标主机,为了安全起见,Zimbra为可访问的目标主机设置了白名单,所以还需要绕过白名单,具体方法是修改host,因为 Zimbra默认管理员可以合法进行任何请求,而判断是否为管理员的方式就是获取host中的port(如果是7071就是管理员,否则不是),所以所有来自7071端口的请求都会被认为合法(直接忽略白名单限制),所以只要将host更改为axin:7071,再重新发送proxy请求就可以实现。

在这里,只需要将一个普通的soap AuthRequest的用户名更改为zimbra就可以得到可利用的token了(此处可能不够清晰,具体看后续复现的操作)这个token虽然是合法的,但是它具有admin属性。所以要上传 shell还需要得到真正的admin token,需要利用刚刚的到的token 发送一个admin soap AuthRequest,就可以在响应中得到真正的admin token了,接着再利用这个token来构造文件上传的请求,就可以得到一个webshell了。

xxe获取localconfig.xml

利用xxer.py搭建一个http以及ftp服务器,以此来接受xxe返回的数据。

ext.dtd文件内容如下:
上图中间的shell窗口就是攻击者ftp服务器收到的localconfig.xml文件内容。

上图中间的shell窗口就是ftp服务器收到的localconfig.xml文件内容其中包含超管密码。

获取低权限token

在xml文本中加入 <account by="adminName">zimbra</account> ,便可得到token。而后可以利用这个token来进行ssrf,进而得到admin token。

ssrf得到admin token

利用刚刚得到的token,构造一下cookie,注意token的名字需要改为 ZM_ADMIN_AUTH_TOKEN,否则会报no auth token错误 然后Host头需要改为axin:7071。填入用户名以及密码(zimbra--kAQbqtlab)构造一个请求发送出去(请求到admin验证的链接),服务器就会返回一个经过认证的admin token,接下来利用这个 admin token上传shell。

getshell

构造一个上传webshell的恶意请求,便可以直接上传shell。

成功得到shell:

 

 

三、防护措施

由于zimbra官方已经及时对高版本的zimbra打了补丁,所以最新版只要及时更新补丁就可以预防(详情请见Zimbra官网)。

热门文章

关注知道创宇云安全

获取安全动态