前言

2019年3月13号,国外一名安全研究员在他的博客上公布了zimbra的这起漏洞,但是其中并未提到一些漏洞的利用细节,在此我将整个漏洞的利用过程进行复现。
原文链接:https://blog.tint0.com/2019/03/a-saga-of-code-executions-on-zimbra.html#href1_ret

影响版本

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

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

漏洞复现

复现环境

  • Zimbra 8.5.0
  • ubuntu 14.04(172.16.123.134)(受害者服务器)
  • ubuntu 18.04 (172.16.123.1)(攻击者服务器)

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

环境搭建

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

攻击流程

如果你阅读过原文,你应该已经知道我们需要利用xxe来读取目标主机的localconfig.xml文件,这个文件中有一个类似超级管理员用户的密码,而这个超级管理员的用户名默认就是zimbra,所以只要我们拿到这个密码在某种意义上来说就相当于已经获得了zimbra的最高权限。
但是事情没有那么简单,Zimbra是使用token来进行权限管理的,而一个管理员的token只可能分配给一个来自7071端口的请求,而这个端口一般是不会对外开放的,所以,这就需要我们的ssrf上场了。但是这个ssrf利用也是有条件的,这个ssrf的利用点存在于源码中的 ProxyServlet.doProxy() 函数处,源码如下:

从上面的代码逻辑中可以看出,只有在token是作为parameter传递过来的才会对其进行验证,否则,如果token是从cookie传过来的则不会进入验证token这处逻辑,所以我们只需要得到一个合法的普通的token就行了,这个token要怎么获取呢?这里又要利用到一个Zimbra的特性了。

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

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

复现过程

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

ext.dtd文件内容如下:


上图中间的shell窗口就是攻击者ftp服务器收到的localconfig.xml文件内容,我们只是对ldap_root_password感兴趣,也就上图中的kAQbqtlab.

获取低权限token
此处有几个细节需要注意,我之前以为只要改一下用户名就可以得到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
由于我的虚拟机卡死,导致我从新复现了以此,所以读者可能看到现在的ZM_ADMIN_AUTH_TOKEN与上面不一样了。但是操作还是一样的,直接拿着得到的admin token去请求这个upload连接,构造一个上传webshell的恶意请求,这样就可以直接上传shell了。

成功得到shell:

注:我这里之前存在一个误区,我以为文件上传这个链接只能是7071端口才能访问,导致我还是利用ssrf来进行文件上传,结果就是一直报no auth token错误,最后仔细读了一下tint0的博文,发现并没有说要通过ssrf上传文件,于是我就直接构造了上面那个链接,完成了shell上传。

参考资料&总结

在复现的过程中,出现了很多问题,最大的问题其实就是zimbra这个东西太复杂了,很多东西只有翻手册(甚至手册都翻不到),比如代理的使用,以及soap api的使用,这两个也是整个复现过程的关键,下面贴出链接:
代理使用:
https://wiki.zimbra.com/wiki/Zimlet_Developers_Guide:Proxy_Servlet_Setup
soap的使用(普通soap 认证以及管理员soap认证调用方式):
https://files.zimbra.com/docs/soap_api/8.0/soapapi-zimbra-doc/api-reference/index.html

zimbra xxe+ssrf 导致 getshell相关推荐

  1. 漏洞:阿里云盾phpMyAdmin =4.8.1 后台checkPageValidity函数缺陷可导致GETSHELL

    阿里云盾提示phpMyAdmin <=4.8.1会出现漏洞有被SHELL风险,具体漏洞提醒: 标题 phpMyAdmin <=4.8.1 后台checkPageValidity函数缺陷可导 ...

  2. phpcms某处逻辑问题导致getshell

    关于phpcms某处逻辑问题导致getshell的修复问题 简介: 漏洞名称:phpcms某处逻辑问题导致getshell 补丁文件:/phpcms/libs/classes/attachment.c ...

  3. CatfishCMS任意命令执行导致getshell

    CatfishCMS任意命令执行导致getshell 目录 一. 漏洞说明 二. 漏洞测试 三.漏洞修复 目录 测试环境:windows + php5.4.45 +apache (phpStudy 集 ...

  4. mysql zimbra_记一次zimbra服务器故障导致mysql起不来问题

    记一次zimbra服务器故障导致mysql起不来问题 记一次zimbra服务器故障导致mysql起不来问题 服务器有一天突然访问不了,局域网连接不上,去机房查看,硬盘灯亮着,屏黑的,按电源键没法关机, ...

  5. 文件上传漏洞_通达OA前台任意文件上传漏洞+文件包含漏洞导致getshell

    点击蓝字|关注我们 通达OA前台任意文件上传漏洞 +文件包含漏洞导致getshell 一.漏洞介绍/Profile/ 通达OA介绍: 通达OA(Office Anywhere网络智能办公系统)是由北京 ...

  6. 【安全漏洞】某CMS后台防护逻辑漏洞导致GETSHELL

    源码: https://cdn.jsdelivr.net/gh/seacms-net/CMS@master/SeaCMS.zip →点击查看网络安全学习资料·攻略← 1.2000多本网络安全系列电子书 ...

  7. 别致的上传思路导致getshell的案例

    0x01 前言 在某次授权的项目中,客户只要getshell漏洞,经过一番折腾,最后成功拿下shell,完成项目交付,本文将过程和遇到的问题和一些小tips分享给大家. 0x02 SQL注入 经过资产 ...

  8. TextpatternCMS后台未过滤直接上传php导致getshell

    该漏洞CNVD-ID: CNVD-2019-12539 漏洞提交CNVD后,待CNVD公示才发出本文. 测试环境:windows7 + firefox + Burpsuite + apache2 +p ...

  9. PHPYUN任意文件上传导致GETSHELL

    简要描述: 简单到你难以想象,只要网站还可以注册就可以GETSHELL,无视GPC,无视WAF.4.1beta版本,其他版本未测 详细说明: 1.在审计PHPYUN的时候一度对PHPYUN的WAF非常 ...

最新文章

  1. 解读2018年诺贝尔化学奖成果:用进化的力量解决化学问题
  2. 全国地铁城市数据分析(python实现)
  3. Jenkins cannot restart itself as currently configured
  4. sql2008能否打开mysql数据库_SQL Server 2008通过LinkServer访问MySQL数据库
  5. win10系统调用架构分析
  6. 在Windows 下如何使用 AspNetCore Api 和 consul
  7. 【LeetCode 剑指offer刷题】树题19:8 二叉树中序遍历的下一个结点
  8. [C++再学习系列] 虚函数的4条规则
  9. asp.net Core2.1连接到Mysql 数据库
  10. Composition API使用记录
  11. ironpython是什么意思_部类“IronPython.Runtime.Binding.PythonBinder”的派生方法“GetTypeName”不能减少访问。这什么意思啊...
  12. Java计算一个数的平方根(即:根号)
  13. 华为鸿蒙价格是多少,华为5G新旗舰已确认,双曲面屏+升级到鸿蒙2.0,价格很感人...
  14. 1个月拿下7个offer! 5分钟掌握81个数学模型,小白也能逆袭数据分析师!
  15. C语言-函数-学会方程你的数学能力会乘风破浪突飞猛进-学会函数你的编程能力将百尺竿头更进一步
  16. 东方欲晓,莫道君行早
  17. 导出CAD文件的几种方法
  18. 问世到现在电子计算机的性能,一级计算机练习.doc
  19. Java实现 LeetCode 54 螺旋矩阵
  20. 节点网络计划图计算机,工程网络计划(网络图)

热门文章

  1. 文档标题:WinNTWin2K下实现进程的完全隐藏
  2. android无法实例化服务,Android:无法实例化类:没有空的构造函数
  3. access订单明细表怎么做_成本明细表
  4. 互联网协议 — QUIC 快速 UDP 互联网连接
  5. 自动化生成 Openstack 新项目开发框架
  6. Linux_SquidProxyServer代理服务器
  7. DRV8711的使用,堵转stall检测的使用及衰减模式
  8. 【Python】Excel处理
  9. java - 把日志生成到指定目录
  10. WIFI 基本理论-2017