原文:https://blog.bentkowski.info/2018/07/vulnerability-in-hangouts-chat-aka-how.html
几个月前,谷歌发布了一个新产品:Hangouts Chat应用程序,这无疑是对Slack的一个回应。Hangouts Chat不仅提供了浏览器版本(要求具有G Suite帐户),同时,也提供了桌面版或移动版应用程序,对于后者,读者可从这里下载相应的程序。
与此同时,几个月前,我正好获得了一笔用于分析应用程序安全性的研究经费,于是,我决定专注于考察桌面应用程序的安全漏洞。
Hangouts Chat——桌面应用
安装后,该桌面应用程序实际上就是一个Electron "Electron")应用程序。从本质上说,该桌面应用程序只是用于显示“https://chat.google.com”上托管的Web应用程序的内容而已。
因此,对于这款Electron应用程序来说,查找其安全漏洞,与查找其Web版本的安全漏洞并没有什么多大区别。不过,有一点需要注意,即该应用的Web版本在浏览器中显示时,它提供了相应的地址栏。事实上,该地址栏是用户判断域名是否可信的唯一途径。正如Micha? Zalewski在Tangled Web中所言:
实质上,浏览器地址栏中显示的URL中的域名是Web上最重要的安全指标之一,因为用户可以利用它们快速将可以信任并可与之进行业务往来的站点跟互联网中的其他站点区分开来。
但是,在Electron应用程序中,却没有提供地址栏。这意味着,用户必须相信应用程序本身提供的、来自“https://chat.google.com”的内容,但并没有可靠的指标对其进行确认。
于是我想,也许可以找到一种方法将应用程序重定向到外部域(即chat.google之外的域),这样的话,就可以非常可靠地进行网络钓鱼了。为此,可以用户将重定向到攻击者控制的外部域,并设法让登录面板与Googe的原始登录面板尽量相似。由于没有地址栏,用户将无从判断该面板是真是假。
寻找重定向
于是,我就从最简单的想法开始下手:将用户重定向到另一个域。为此,我们只要在该聊天软件中添加一个指向外部域的链接即可。这样的话,只要用户点击了该链接,就会被重定向。
然而,这显然是行不通的,因为外部链接将会在默认浏览器中打开。
但是,我们也不用灰心,继续探索。
经过进一步研究,我注意到chat.google.com的链接是直接在Electron应用程序中打开的。顺便说一下,当用户点击的链接返回200以外的代码时(例如:“https://chat.google.com/webchannel/events”),用户必须重启该应用程序,因为它没有提供返回按钮!
要想绕过URL访问规则,一种非常常见的方法便是滥用重定向(响应代码为3xx)。研究发现,当导航到不存在的网址(例如“https://chat.google.com/test123”)时,“chat.google.com”会被重定向到“https://chat.google.com/u/0/?hasBeenRedirected=true”。因此,我在Burp中定义了相应的匹配/替换规则,将“hasBeenRedirected = true”URL重写为sekurak.pl,来看看会发生什么情况。
这就是该应用程序的反应:
太棒了!它实际上证实了302重定向能被用来在Hangouts Chat窗口中显示任意网站。
接下来,只要对“https://chat.google.com”进行实际的重定向就行了。
开放式重定向漏洞
开放式重定向的确是一种安全漏洞,但是在我看来,其威胁程度往往被高估。下面内容摘自谷歌的漏洞赏金大学页面:
开放式重定向器会将您从Google URL转到由构建该链接的人指定的另一个网站。安全社区的一些成员认为,这种重定向器会成为网络钓鱼的帮凶,因为用户可能倾向于信任链接上的鼠标悬停工具提示,然而,导航动作一旦执行就无法检查地址栏了。
对于这种观点我是赞同的。通常情况下,用户应该将地址栏作为唯一可靠的安全指标。但是,在Electron中,情况就变了——在Electron应用程序中,并没有地址栏,因此,用户无法确认网站的身份。所以,在这种情况下,缺乏地址栏显然是一个严重的安全漏洞。
不过,重定向到“accounts.google.com”只是攻击过程的第一步。实际上,最重要的事实是,在“accounts.google.com”上存在一个已经公开披露的著名开放式重定向漏洞(@teh_h3ck)。如果读者想要了解该漏洞的详细情况的话,请参阅原始文章;就这里来说,我们只需知道,为了重定向到自己的域,只需要将相关的东西托管到/_ah/conflogin URL上即可。
最终,用于chat.google.com的开放式重定向代码如下所示:
https://chat.google.com/accounts/ServiceLogin?continue=https://appengine.google.com/_ah/conflogin?continue=http://bentkowski.info/&service=ah
然后,我又仿造了一个类似于谷歌的登录页面——现在,我们终于搞定了一个非常可靠的网络钓鱼页面:)
如上面的gif所示,用户根本无从得知自己位于假冒的页面上,因为这里压根就没有地址栏呀。
不过,上面介绍的攻击方法对该软件的Web应用程序版本是不起作用的:
小结
正如您所看到的,由于Electron应用程序没有提供地址栏,所以才使开放式重定向漏洞有了可乘之机。因此,当您开发Electron应用程序的时候,请确保无法将主窗口重定向到外部域。
如果您正在使用Google Hangouts Chat,请务必进行更新,因为谷歌已经在几天前就发布了相应的安全补丁。
有趣的是,谷歌对该漏洞的赏金非常慷慨,支付了7,500美元。需要说明的是,该赏金实际上针对代码执行漏洞的。虽然我仍然无法将其升级为代码执行漏洞,但Matt Austin(@mattaustin)在推文中已经指出,这种漏洞升级是完全可行的。谢谢您的出色工作,Matt!
顺便说一下,对于谷歌提供的研究经费表示衷心感谢!否则的话,到现在我可能也不会接触该应用程序。