<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Dubbo &#8211; ChaBug安全</title>
	<atom:link href="/tags/dubbo/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Sun, 16 Feb 2020 09:10:48 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=5.5.5</generator>
	<item>
		<title>Apache Dubbo CVE-2019-17564 反序列化分析</title>
		<link>/audit/1229.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Sun, 16 Feb 2020 09:10:48 +0000</pubDate>
				<category><![CDATA[代码审计]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Dubbo]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[rce]]></category>
		<category><![CDATA[ysoserial]]></category>
		<category><![CDATA[反序列化]]></category>
		<guid isPermaLink="false">/?p=1229</guid>

					<description><![CDATA[Apache Dubbo HTTP协议中的一个反序列化漏洞（CVE-2019-17564） 漏洞描述 Apache Dubbo支持多种协议,官方推荐使用Dubbo协议。Apache...]]></description>
										<content:encoded><![CDATA[<p>Apache <span class="wpcom_tag_link"><a href="/tags/dubbo" title="Dubbo" target="_blank">Dubbo</a></span> HTTP协议中的一个<span class="wpcom_tag_link"><a href="/tags/%e5%8f%8d%e5%ba%8f%e5%88%97%e5%8c%96" title="反序列化" target="_blank">反序列化</a></span>漏洞（CVE-2019-17564）</p>
<h2>漏洞描述</h2>
<p>Apache Dubbo支持多种协议,官方推荐使用Dubbo协议。Apache Dubbo HTTP协议中的一个反序列化漏洞（CVE-2019-17564），该漏洞的主要原因在于当Apache Dubbo启用HTTP协议之后，Apache Dubbo对消息体处理不当导致不安全反序列化，当项目包中存在可用的gadgets时即可导致远程代码执行。</p>
<h2>影响范围</h2>
<p>2.7.0 &lt;= Apache Dubbo &lt;= 2.7.4.1<br />
2.6.0 &lt;= Apache Dubbo &lt;= 2.6.7<br />
Apache Dubbo = 2.5.x</p>
<h2>环境搭建</h2>
<p>Dubbo 需要zookeeper，我采用虚拟机中的docker来搭建zookeeper环境。</p>
<pre><code class="">docker run --rm --name zookeeper -p 2181:2181 zookeeper
</code></pre>
<p><img src="https://y4er.com/img/uploads/20200216174838.png" alt="image" /></p>
<p>查看虚拟机是否开放2181端口</p>
<p><img src="/wp-content/uploads/2020/02/20200216172205.png" alt="image" /></p>
<p>下载官方的Dubbo http样例 https://github.com/<span class="wpcom_tag_link"><a href="/tags/apache" title="apache" target="_blank">apache</a></span>/dubbo-samples/tree/master/<span class="wpcom_tag_link"><a href="/tags/java" title="java" target="_blank">java</a></span>/dubbo-samples-http 导入idea</p>
<p>修改Dubbo为有反序列化漏洞的版本，我改为2.7.3</p>
<p><img src="/wp-content/uploads/2020/02/20200216170054.png" alt="image" /></p>
<p>因为Dubbo并没有可用的gadget，我们使用Commons-Collection4.4.0的gadget，所以在pom.xml中加入其依赖。</p>
<pre data-language=XML><code class="language-markup ">&lt;dependency&gt;
    &lt;groupId&gt;org.apache.commons&lt;/groupId&gt;
    &lt;artifactId&gt;commons-collections4&lt;/artifactId&gt;
    &lt;version&gt;4.0&lt;/version&gt;
&lt;/dependency&gt;
</code></pre>
<p>此时我们还要修改spring/http-provider.xml来指定zookeeper的IP</p>
<p><img src="/wp-content/uploads/2020/02/20200216171596.png" alt="image" /></p>
<p>改端口是因为8080端口和Burp的端口冲突了。修改完毕之后，启动HttpProvider。在控制台输出<code>dubbo service started</code>字样即表示启动成功。</p>
<h2>漏洞复现</h2>
<p><span class="wpcom_tag_link"><a href="/tags/ysoserial" title="ysoserial" target="_blank">ysoserial</a></span>生成payload</p>
<pre><code class="">java -jar ysoserial.jar CommonsCollections4 calc &gt; 1.ser
</code></pre>
<p>burp发包</p>
<p><img src="/wp-content/uploads/2020/02/20200216172101.png" alt="image" /></p>
<h2>漏洞分析</h2>
<p>断点 <code>dubbo-2.7.3.jar!/org/apache/dubbo/remoting/http/servlet/DispatcherServlet.class:43</code></p>
<p><img src="/wp-content/uploads/2020/02/20200216172086.png" alt="image" /></p>
<p>跟进到 <code>org.apache.dubbo.rpc.protocol.http.HttpProtocol.InternalHandler#handle</code></p>
<p><img src="/wp-content/uploads/2020/02/20200216178969.png" alt="image" /></p>
<p>获取了URI、请求方式和RPC调用的上下文，然后进入handleRequest()</p>
<p><img src="/wp-content/uploads/2020/02/20200216173990.png" alt="image" /></p>
<p>handleRequest()将request请求对象传入一个参数的<code>readRemoteInvocation()</code>，然后将request和<code>request.getInputStream()</code>传入其重载方法两个参数的<code>readRemoteInvocation()</code>，然后创建了ois对象，ois对象中包含了post请求的数据，然后进入<code>doReadRemoteInvocation()</code></p>
<p><img src="/wp-content/uploads/2020/02/20200216177168.png" alt="image" /></p>
<p>到达readObject()，整个过程ois对象没有过滤，而ois中又包含了post报文，导致反序列化漏洞，如果存在可用的gadget，会导致RCE。</p>
<h2>修复建议</h2>
<p>升级Apache Dubbo到最新版本</p>
<h2>参考链接</h2>
<p>https://qiita.com/shimizukawasaki/items/39c9695d439768cfaeb5<br />
https://www.mail-archive.com/dev@dubbo.apache.org/msg06225.html<br />
http://dubbo.apache.org/zh-cn/blog/dubbo-zk.html<br />
<div style="width: 640px;" class="wp-video"><video class="wp-video-shortcode" id="video-1229-2" width="640" height="360" preload="metadata" controls="controls"><source type="video/mp4" src="https://video.twimg.com/tweet_video/EQlT6nBUEAADdR2.mp4?_=2" /><a href="https://video.twimg.com/tweet_video/EQlT6nBUEAADdR2.mp4">https://video.twimg.com/tweet_video/EQlT6nBUEAADdR2.mp4</a></video></div></p>
<p><strong>文笔垃圾，措辞轻浮，内容浅显，操作生疏。不足之处欢迎大师傅们指点和纠正，感激不尽。</strong></p>
]]></content:encoded>
					
		
		<enclosure url="https://video.twimg.com/tweet_video/EQlT6nBUEAADdR2.mp4" length="211669" type="video/mp4" />

			</item>
	</channel>
</rss>
