通过Skype Web插件和Qt App来造成RCE
Hulk 渗透测试 9591浏览 · 2019-06-03 01:08

原文链接:https://0x41.cf/infosec/2019/05/28/skype-web-plugin-ez-rce.html


前言

今年的早些时间,我听说研究人员可以向Discord(注:一款专为电子游戏社区设计的免费网络实时通话软件和数字发行平台)发送带有自定义URI scheme的特定Link,启用桌面客户端的用户点击Link后无需确认即可触发某些操作。

这段时间我一直在测试URI scheme,想要看看通过它可以做哪些进攻性行为,然后我发现可以在windows上执行各种有趣的操作,例如打开控制中心和任务切换器之类的。但不久我就失去了兴趣,因为我逐渐认识到Discord有一堆过滤器,例如由于研究人员提交的各种报告导致Discord会阻止大部分"恶意的"Scheme Link(我仍不清楚Discord的具体过滤措施,但肯定不只简单地使用了白名单策略,可能还添加了一些正则等等 ¯_(ツ)_/¯)。

Origin Vuln

在几个月后,Electronic Arts旗下数字平台Origin爆出易受由URI Scheme造成RCE的新闻。Origin平台的Bug是由AngularJS模版注入导致的,Qt桌面服务与JavaScript通信的接口泄露 - 这里有文章的更多细节。

随后作者又发布了第二篇文章,他发现了Origin的另一个flaw可导致RCE。该flaw和第一篇文章有些类似,但是利用Qt插件的特性,通过滥用插件从远程SMB服务加载任意.dll文件来实现RCE...

看完那篇文章后我重新枚举了本地机器的所有URL协议(工具:https://github.com/ChiChou/LookForSchemes), 然后摆弄一些URI Schemes,不久后我就发现了一个有趣的攻击向量...

Qt插件注入

根据维基百科的描述,Qt是一个开源免费的应用程序框架,可以用来开发GUI程序和跨平台应用。似乎很多App都会用到它,我在本地64-bit机器用资源管理器做了一个简单的搜索,至少有九个应用程序使用了它:

大部分Qt应用程序都支持-platformpluginpath命令选项,使用这条命令可以指定要加载插件的路径。非常有意思的是它支持加载SMB共享的路径,所以我们可以通过这点远程加载插件。

但最重要的问题是,我们如何启动Qt程序而且还要携带-platformpluginpath的参数?

聪明的人可能已经猜到了,URI Scheme。为了通过向命令行输入自定义的内容来启动App,必须要使用经注册的URI处理程序,向自定义的URL插入某些参数,从而实现网页启动,它在注册表里看起来像这样:

然而这个方法有个天然的缺陷,目前大部分浏览器都会对URI做URL-encode处理,然后再交由应用程序,这可能会加大闭合我们要注入参数的难度,因为大部分情况下我们都要往URI中的参数插入双引号"

这时,Skype Web插件的用处就显现出来了...

Skype Web插件

Skype For Web推出后,用户可以使用Skype For Web进行即时通信和共享多媒体文件,但不能用于VoIP(注:网络IP电话)。为了在浏览器中使用上述功能,正常拨打语音和视频电话,用户必须安装该插件。

经搜索可以发现目前网上这个插件的最新版本是7.32.6.278,并且是在2016更新的,你可以在官方CDN上下载该插件:https://swx.cdn.skype.com/plugin/7.32.6.278/SkypeWebPlugin.msi。

Microsoft后来推出了无插件的Skype for Web,但Internet Explore不适用。随后Microsoft停止更新该插件,不再向Internet Explore提供这个插件的维护。但以前安装的仍可以使用,用户也可以手动卸载。

'Skype Web Plugin'注册了一个自定义的URI处理程序:swx,通过它可以启动SkypeShell.exe,这看起来跟Internet Explorer Shell有些关联,打开网页应该会使用IE的渲染引擎(nshtml.dll)。

令我感到有些惊讶,所有的HTTP(S)链接都可以更改为swx协议,单击链接后机器会自动使用nshtml.dll渲染引擎为你呈现页面,这会带来大麻烦...

首先,IE protected mode(保护模式)默认是关闭的,所以这里可能会有更多的潜在攻击向量,我对保护模式具体是如何工作的并不了解,但我可以肯定这会带来一些问题...

第二(前文我提到过),我可以在shell中运行自定义URI的Link,并且用户完全不清楚发生了什么。

例如,正常运行IE时我们通过插件注入尝试启动Qt时,会有以下提示:

因此无论受害者使用哪款浏览器,我们都可以注入参数,并且通过URIs并发启动多个程序。

概念证明

现在我们对要使用的攻击向量有一定的了解,接下来则是尝试利用。

首先我们要找到使用Qt的目标应用,通过它们(大部分)可以加载插件,并且可以调用经注册的URI处理程序。

在我的电脑上我找到了两个这样的应用:

我想要找到更多符合条件的应用,没有费多大力气,我又找到了一个:Transmission torrent客户端。

我前面已经说过了这不是新技术,两个月前就有人写了篇文章介绍他们是如何发现Malwarebytes与Cisco Webex Teams易受这类攻击的,但本文我要分享的有些不同,我可以借助Skype Web插件实现隐秘启动并且更加可靠...

创建一个.html文件,填充iframe并把src属性设置为calculator://

<iframe src='calculator://' height="0" frameborder="0"></iframe>
<iframe src='calculator://' height="0" frameborder="0"></iframe>
...

和预期相符,不久我就听到我的CPU风扇开始咆哮...

OK,现在起码可以通过发送垃圾邮件来造成DoS攻击,受害者点击链接后会启用某些很占资源的app。

现在是时候尝试代码执行了。我用Visual Studio写代码编译了一个简单的DLL文件,附加后可以弹出消息文本框(MessageBox),内容是要启动程序的进程名称。

为了使.dll文件可以成功加载Qt应用,还需要做到以下几点:

  • 添加一个.qtmetad包含有效插件元数据的部分: 我们先用VS生成一个空DLL,然后我们用十六进制编辑器手动填写原始插件中的内容。
  • 找到目标覆盖插件: Windows上有一个名为Windows Integration(qwindows.dll)的插件,似乎所有App运行时都会用到它。

为了使攻击更加隐蔽,我添加了退出函数ExitProcess(),以防在DLL执行后启动真正的目标应用程序,因此攻击过程没有太多阻拦(除了Skype shell),用户也不会注意到什么。

最后一件事就是添加一个SMB共享,用来托管恶意插件。

注:为了方便理解,请读者查看Poc演示视频(包含制作DLL文件到打开三个App的所有过程):

https://youtu.be/xVZU-2Y0Pzc

DoS

我曾经遇到过ms-cxh-full:/,这种URI似乎是全荧屏浏览的ms-cxh://,用于微软账户的某些设置,有趣的是它似乎会导致黑屏,受害者只有重启机器或登出账户才能解除。⚠️ Try at your own risk ⚠️

0 条评论
某人
表情
可输入 255