CVE-2018-8495 Edge远程代码执行漏洞简要分析

CVE-2018-8495漏洞是攻击者利用Edge的多个漏洞,通过滥用定制的URI方案实现远程代码执行。

启动外部应用

许多用户可能知道可以再浏览器内通过mailto:test@test.test这样的URL启用默认的邮件客户端。然后会弹窗提醒用户是否要选择其他的应用,用户同意后,该应用就会运行。

研究人员的默认邮件应用是Outlook,从下图可以看出特定的参数发给了outlook可执行文件。所以有用户标记的字符串作为参数值传递了,很明显这里可能会出问题。但问题是:其他外部应用启用的URI方案是怎么样的?

 

最便捷的协议

通过注册表可以找出所有登记过的定制协议。ComputerHKEY_CLASSES_ROOT文件夹中有shellopencommand子文件夹。比如,研究人员发现ms-word有这样的子文件夹。

查看ComputerHKEY_CLASSES_ROOTms-wordshellopencommand的值,发现C:Program Files (x86)Microsoft OfficeRootOffice16protocolhandler.exe “%1″。也就是说如果用户点击指向ms-word:test的锚标签,就会执行下面的动作:

URI方案会直接传递用户标记的参数到WScript.exe。如果不清楚:

Windows Script Host provides an environment in which users can execute scripts in a variety of languages that use a variety of object models to perform tasks
Windows脚本宿主提供了一个环境,用户可以使用各种语言执行脚本,使用各种对象模型来执行任务。

可以参考:https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/wscript

下面看一下如果用户从Edge导航到wshfile:test会发生什么。

首先,会出现一个弹窗要求用户选择处理该URI方案的默认应用。默认情况下,Windows Script Host (WScript.exe)就是句柄。

按ok继续:

WScript.exe的动作是尝试执行用户传递过来的路径内的文件。这样的话,就会尝试定位C:WINDOWSsystem32wshfile:test,但文件并不存在。所以怎么办呢?

 

利用

第一个测试方法就是:路径遍历。

研究人员首先测试wshfile:test/../../foo.vbs,弹窗出现后点击ok,然后:

然后就可以指向任何目录中的任何文件,也可以在预想的位置释放文件,然后就可以远程代码执行了。

换句话说,研究人员可以植入文件但不能预测其位置。因此,研究人员推荐Matt Nelson的一篇文章《WSH Injection: A Case Study》。文章中,作者用位于C:\Windows\System32\Printing_Admin_Scriptsen-USpubprn.vbs的签名的VBS文件指出,该vbs文件存在WSH注入的问题。

该VBS文件会接收2个传递来的参数,也可以伪造这些参数来诱骗VBS脚本来执行任意代码。但尝试发现已经修复了该漏洞,只有没有更新的设备受到该漏洞的影响。所以这个方法不可行,但文章提出存在许多这样的案例,所以研究人员开始搜索。

刚开始研究人员在Windows中搜索每个VBS文件,然后查看其是否接收参数。最终发现了C:\Windows\WinSx\Samd64_microsoft-windows-a..nagement-appvclient_31bf3856ad364e35_10.0.17134.48_none_c60426fea249fc02SyncAppvPublishingServer.vbs。

该脚本会接收多个参数,并将参数传递Powershell.exe中执行,而且不对参数进行过滤,因此可以注入任意代码。SyncAppvPublishingServer.vbs的第36行是:

psCmd = "powershell.exe -NonInteractive -WindowStyle Hidden -ExecutionPolicy RemoteSigned -Command &{" & syncCmd & "}"

因此可以修改syncCmd的值,而且Edge也会过滤引号,所以可以传递任意参数到WScript.exe中。同时,powershell可以后台执行-WindowStyle Hidden,这样就是一个完美的WSH注入向量。

此版本中的问题是特定文件夹名称取决于用户所在的Windows build。研究人员的操作系统版本是17134中,文件夹就含有10 .0.17134,如果使用的操作系统版本不同,那么文件夹中的数字就不同。

根据C:\Windows\WinSx\Samd64_microsoft-windows-a..nagement-appvclient_31bf3856ad364e35_10.0.17134.48_none_c60426fea249fc02SyncAppvPublishingServer.vbs
可以猜测出
C:\Windows\WinSx\SAMD921~1.48_SyncAppvPublishingServer.vbs。

这可以使攻击中使用的参数更加强大,因为都指向相同的文件。但没有用户会傻到点击OK运行Windows script host。但弹出框出现时,默认焦点就在ok按钮上,也就是说用户要做的就是按住enter键,诱使用户接收弹出框以触发漏洞利用执行。

 

POC

POC代码如下:

<a id="q" href='wshfile:test/../../WinSxS/AMD921~1.48_/SyncAppvPublishingServer.vbs" test test;calc;"'>test</a>
<script>
window.onkeydown=e=>{
    window.onkeydown=z={};
    q.click()
}
</script>

POC视频:

https://imgur.com/hxQPl85

参考:

ZDI Advisory: https://www.zerodayinitiative.com/advisories/ZDI-18-1136/

(完)