Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation

This commit is contained in:
Translator
2025-01-04 03:47:21 +00:00
parent a242a4c367
commit 4b87b0b3c8
2 changed files with 48 additions and 62 deletions
@@ -4,7 +4,7 @@
## App Services
有关 Azure 应用服务的更多信息,请查看:
有关 Azure App 服务的更多信息,请查看:
{{#ref}}
../az-services/az-app-service.md
@@ -23,7 +23,7 @@ az webapp ssh --name <name> --resource-group <res-group>
```bash
az webapp create-remote-connection --name <name> --resource-group <res-group>
## If successfull you will get a message such as:
## If successful you will get a message such as:
#Verifying if app is running....
#App is running. Trying to establish tunnel connection...
#Opening tunnel on port: 39895
@@ -94,7 +94,7 @@ az webapp deployment list-publishing-profiles --name <app-name> --resource-group
}
]
```
注意**用户名始终相同**FTP 除外,它在开头添加了应用程序的名称),但**密码对所有用户都是相同的**。
注意**用户名始终相同**除了FTP,它在开头添加了应用程序的名称),但**密码对所有都是相同的**。
此外,**SCM URL 是 `<app-name>.scm.azurewebsites.net`**。
@@ -131,7 +131,7 @@ az webapp deployment user set \
> [!WARNING]
> 请注意,每个用户都可以通过调用之前的命令来配置自己的凭据,但如果用户没有足够的权限访问SCM或FTP,则凭据将无效。
- 如果您看到这些凭据是**已编辑的**,那是因为您**需要启用SCM基本身份验证选项**,为此您需要第二个权限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write:`
- 如果您看到这些凭据是**REDACTED**,那是因为您**需要启用SCM基本身份验证选项**,为此您需要第二个权限(`Microsoft.Web/sites/basicPublishingCredentialsPolicies/write`
```bash
# Enable basic authentication for SCM
az rest --method PUT \
@@ -149,23 +149,23 @@ az rest --method PUT \
"properties": {
"allow": true
}
}
}'
```
### 使用 SCM 凭据发布代码
仅凭有效的 SCM 凭据,就可以 **发布代码** 到应用服务。这可以通过以下命令完成。
对于这个 Python 示例,您可以从 https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart 下载仓库,进行您希望的任何 **更改**,然后 **运行:`zip -r app.zip .`** 进行压缩。
对于这个 Python 示例,您可以从 https://github.com/Azure-Samples/msdocs-python-flask-webapp-quickstart 下载仓库,进行您想要的 **更改**,然后 **运行:`zip -r app.zip .`** 进行压缩。
然后,您可以使用以下命令 **发布代码**
然后,您可以使用以下命令在 Web 应用中 **发布代码**
```bash
curl -X POST "<SMC-URL>/api/publish?type=zip" --data-binary "@./app.zip" -u '<username>:<password>' -H "Content-Type: application/octet-stream"
```
### Microsoft.Web/sites/publish/Action | SCM 凭据
### Webjobs: Microsoft.Web/sites/publish/Action | SCM credentials
提到的 Azure 权限允许执行几个有趣的操作,这些操作也可以使用 SCM 凭据执行:
- **Webjobs** 日志:
- **Webjobs** 日志:
```bash
# Using Azure credentials
az rest --method GET --url "<SCM-URL>/vfs/data/jobs/<continuous | triggered>/rev5/job_log.txt" --resource "https://management.azure.com/"
@@ -173,7 +173,7 @@ az rest --method GET --url "https://lol-b5fyaeceh4e9dce0.scm.canadacentral-01.az
# Using SCM username and password:
curl "<SCM-URL>/vfs/data/jobs/continuous/job_name/job_log.txt" \
--user '<username>:<password>>' -v
--user '<username>:<password>' -v
```
- 阅读 **Webjobs** 源代码:
```bash
@@ -203,6 +203,12 @@ curl -X PUT \
--data-binary "@/Users/carlospolop/Downloads/rev.js" \
--user '<username>:<password>'
```
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
这些权限允许**将托管身份分配**给应用服务,因此如果应用服务之前被攻陷,这将允许攻击者将新的托管身份分配给应用服务并**提升权限**。
```bash
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
```
### Microsoft.Web/sites/config/list/action
此权限允许列出 App 服务的 **connection strings****appsettings**,这些可能包含敏感信息,如数据库凭据。
@@ -210,12 +216,6 @@ curl -X PUT \
az webapp config connection-string list --name <name> --resource-group <res-group>
az webapp config appsettings list --name <name> --resource-group <res-group>
```
### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action
这些权限允许**将托管身份分配**给应用服务,因此如果应用服务之前被攻陷,这将允许攻击者将新的托管身份分配给应用服务并**提升权限**。
```bash
az webapp identity assign --name <app-name> --resource-group <res-group> --identities /subscriptions/<subcripttion-id>/resourceGroups/<res_group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<managed-identity-name>
```
### 读取配置的第三方凭据
运行以下命令可以**读取当前账户中配置的第三方凭据**。请注意,如果例如某些Github凭据配置在不同的用户中,您将无法从其他用户访问该令牌。
@@ -263,7 +263,7 @@ https://graph.microsoft.com/v1.0/me/drive/root/children
- **`Microsoft.Web/sites/config/list/action`**: 然后运行 `az webapp deployment list-publishing-credentials --name <name> --resource-group <res-group>`
> [!WARNING]
> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp(即使它被配置为使用第三方提供商),如前面部分所述
> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp(即使它被配置为使用第三方提供商),如前面一节中提到的
> [!WARNING]
> 请注意,拥有以下权限也**可以执行任意容器**,即使 webapp 的配置不同。
@@ -6,7 +6,7 @@
Azure App Services 使开发人员能够 **无缝构建、部署和扩展 Web 应用程序、移动应用后端和 API**。它支持多种编程语言,并与各种 Azure 工具和服务集成,以增强功能和管理。
每个应用程序都在沙箱内运行,但隔离取决于 App Service 计划:
每个应用程序都在沙箱内运行,但隔离程度取决于 App Service 计划:
- 免费和共享层的应用程序运行在 **共享虚拟机**
- 标准和高级层的应用程序运行在 **仅由同一 App Service 计划中的应用程序共享的专用虚拟机** 上。
@@ -18,17 +18,17 @@ Azure App Services 使开发人员能够 **无缝构建、部署和扩展 Web
应用程序有一些有趣的配置:
- **始终开启**:确保应用程序始终运行。如果未启用,应用程序将在 20 分钟不活动后停止运行,并在收到请求时重新启动。
- 如果您有需要持续运行的 Web 作业,这是必需的,因为如果应用程序停止,Web 作业也会停止。
- 如果您有需要持续运行的 WebJob,这是必需的,因为如果应用程序停止,WebJob 将停止。
- **SSH**:如果启用,具有足够权限的用户可以使用 SSH 连接到应用程序。
- **调试**:如果启用,具有足够权限的用户可以调试应用程序。但是,这在每 48 小时自动禁用。
- **Web 应用 + 数据库**:Web 控制台允许创建带有数据库的应用程序。在这种情况下,可以选择要使用的数据库(SQLAzure、PostgreSQL、MySQL、MongoDB),并且还允许您创建 Azure Cache for Redis。
- **调试**:如果启用,具有足够权限的用户可以调试应用程序。然而,这在每 48 小时自动禁用。
- **Web 应用 + 数据库**:Web 控制台允许创建带有数据库的应用。在这种情况下,可以选择要使用的数据库(SQLAzure、PostgreSQL、MySQL、MongoDB),并且还允许您创建 Azure Cache for Redis。
- 包含数据库和 Redis 凭据的 URL 将存储在 **appsettings** 中。
- **容器**:可以通过指示容器的 URL 和访问凭据将容器部署到 App Service。
- **挂载**:可以从存储帐户创建 5 个挂载,这些存储帐户可以是 Azure Blob(只读)或 Azure Files。配置将存储存储帐户的访问密钥。
- **挂载**:可以从存储帐户创建 5 个挂载,这些存储帐户可以是 Azure Blob(只读)或 Azure Files。配置将存储访问密钥在存储帐户中
## Basic Authentication
在创建 Web 应用程序(通常是 Azure 函数)时,可以指示是否要 **启用基本身份验证**(默认情况下禁用)。这基本上 **启用 SCM(源代码管理器)和 FTP(文件传输协议)**,因此可以使用这些技术部署应用程序。
在创建 Web 应用程序(通常是 Azure 函数)时,可以指示是否要 **启用基本身份验证**(默认情况下禁用)。这基本上 **启用 SCM(源控制管理器)和 FTP(文件传输协议)**,因此可以使用这些技术部署应用程序。
要访问 SCM 和 FTP 服务器,需要 **用户名和密码**。因此,Azure 提供了一些 **API 来获取这些平台的 URL** 和凭据。
@@ -39,16 +39,16 @@ SCM
### Kudu
Kudu 是 **管理 SCM 和 Web 及 API 接口** 的平台,用于管理 App Service,并提供基于 Git 的部署、远程调试和文件管理功能。可以通过在 Web 应用中定义的 SCM URL 访问。
Kudu 是 **管理 SCM 和 Web 及 API 接口** 的平台,用于管理 App Service,并提供基于 Git 的部署、远程调试和文件管理功能。可以通过在 Web 应用中定义的 SCM URL 访问
请注意,App Services 和 Function Apps 使用的 Kudu 版本不同,Function Apps 的版本要有限得多。
您可以在 Kudu 中找到一些有趣的端点包括
您可以在 Kudu 中找到一些有趣的端点:
- `/BasicAuth`:您需要访问此路径以 **登录 Kudu**
- `/DebugConsole`:一个控制台,允许您在 Kudu 运行的环境中执行命令。
- 请注意,此环境 **无法访问** 元数据服务以获取令牌。
- `/webssh/host`:一个基于 Web 的 SSH 客户端,允许您连接到应用程序运行的容器内。
- 此环境 **可以访问** 元数据服务,以便从分配的托管身份中获取令牌。
- 此环境 **可以访问元数据服务** 以获取分配的管理身份的令牌。
- `/Env`:获取有关系统、应用设置、环境变量、连接字符串和 HTTP 头的信息。
- `/wwwroot/`:Web 应用的根目录。您可以从这里下载所有文件。
@@ -70,26 +70,26 @@ App Services 默认允许将代码作为 zip 文件上传,但也允许连接
## Webjobs
Azure WebJobs 是 **在 Azure App Service 环境中运行的后台任务**。它们允许开发人员在其 Web 应用程序旁边执行脚本或程序,使处理异步或时操作(例如文件处理、数据处理或计划任务)变得更加容易。
Web 作业有 2 种类型:
- **持续**:无限期循环运行,并在创建后立即触发。它非常适合需要持续处理的任务。但是,如果应用程序因未启用始终开启而停止运行,并且在过去 20 分钟内收到请求,则 Web 作业也会停止。
- **触发**:按需或基于计划运行。最适合定期任务,例如批量数据更新或维护例程。
Azure WebJobs 是 **在 Azure App Service 环境中运行的后台任务**。它们允许开发人员在其 Web 应用程序旁边执行脚本或程序,使处理异步或时间密集型操作(例如文件处理、数据处理或计划任务)变得更加容易。
WebJobs 有 2 种类型:
- **持续**:无限期循环运行,并在创建后立即触发。它非常适合需要持续处理的任务。然而,如果应用程序因未启用始终开启而停止运行,并且在过去 20 分钟内没有收到请求,则 WebJob 也将停止。
- **触发**:按需或基于计划运行。最适合定期任务,例如批量数据更新或维护例程。
从攻击者的角度来看,Web 作业非常有趣,因为它们可以用来 **在环境中执行代码****提升权限** 到附加的管身份。
从攻击者的角度来看,WebJobs 非常有趣,因为它们可以用来 **在环境中执行代码****提升权限** 到附加的管身份。
此外,检查 Web 作业生成的 **日志** 总是很有趣,因为它们可能包含 **敏感信息**
此外,检查 WebJobs 生成的 **日志** 总是很有趣,因为它们可能包含 **敏感信息**
## Slots
Azure App Service Slots 用于 **将应用程序的不同版本部署到同一 App Service**。这使开发人员能够在将新功能或更改部署到生产环境之前,在单独的环境中进行测试。
Azure App Service Slots 用于 **将应用程序的不同版本部署到同一 App Service**。这允许开发人员在将新功能或更改部署到生产环境之前,在单独的环境中进行测试。
此外,可以将 **一定比例的流量** 路由到特定的插槽,这对于 A/B 测试和 **后门目的** 很有用。
## Azure Function Apps
基本上 **Azure Function apps 是 Azure App Service 的一个子集**,如果您访问 Web 控制台并列出所有应用服务或在 az cli 中执行 `az webapp list`,您将能够 **看到 Function apps 也列在其中**
基本上 **Azure Function apps 是 Azure App Service 的一个子集**在 Web 控制台中,如果您访问 Web 控制台并列出所有应用服务或在 az cli 中执行 `az webapp list`,您将能够 **看到 Function apps 也列在其中**
因此,这两项服务实际上在 az cli 中具有大多数 **相同的配置、功能和选项**,尽管它们可能以稍微不同的方式配置(例如 appsettings 的默认值或在 Function apps 中使用存储帐户)。
因此,这两项服务实际上在 az cli 中大多数 **具有相同的配置、功能和选项**,尽管它们可能以稍微不同的方式配置(例如 appsettings 的默认值或在 Function apps 中使用存储帐户)。
## Enumeration
@@ -156,6 +156,9 @@ az webapp config storage-account list --name <name> --resource-group <res-group>
# Get configured container (if any) in the webapp, it could contain credentials
az webapp config container show --name <name> --resource-group <res-group>
# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# Get Webjobs
az webapp webjob continuous list --resource-group <res-group> --name <app-name>
az webapp webjob triggered list --resource-group <res-group> --name <app-name>
@@ -217,24 +220,7 @@ done
{{#endtab }}
{{#endtabs }}
#### 获取凭据并访问 webapp 代码
```bash
# Get connection strings that could contain credentials (with DBs for example)
az webapp config connection-string list --name <name> --resource-group <res-group>
## Check how to use the DBs connection strings in the SQL page
# Get credentials to access the code and DB credentials if configured.
az webapp deployment list-publishing-profiles --resource-group <res-group> -n <name>
# Get git URL to access the code
az webapp deployment source config-local-git --resource-group <res-group> -n <name>
# Access/Modify the code via git
git clone 'https://<username>:<password>@name.scm.azurewebsites.net/repo-name.git'
## In my case the username was: $nameofthewebapp and the password some random chars
## If you change the code and do a push, the app is automatically redeployed
```
{{#ref}}
../az-privilege-escalation/az-app-services-privesc.md
{{#endref}}
@@ -252,25 +238,25 @@ cd msdocs-python-flask-webapp-quickstart
# Create webapp from this code
az webapp up --runtime PYTHON:3.9 --sku B1 --logs
```
登录到 SCM 门户或通过 FTP 登录,可以在 `/wwwroot` 中看到压缩文件 `output.tar.gz`,该文件包含 webapp 的代码。
登录到SCM门户或通过FTP登录,可以在`/wwwroot`中看到压缩文件`output.tar.gz`,该文件包含webapp的代码。
> [!TIP]
> 仅通过 FTP 连接并修改文件 `output.tar.gz`不足以更改 webapp 执行的代码。
> 仅通过FTP连接并修改文件`output.tar.gz`不足以更改webapp执行的代码。
**攻击者可以下载此文件,修改它,然后重新上传以在 webapp 中执行任意代码。**
**攻击者可以下载此文件,修改它,然后重新上传以在webapp中执行任意代码。**
### 来自 GithubPython
### 来自GithubPython
本教程基于之前的教程,但使用 Github 存储库。
本教程基于之前的教程,但使用Github存储库。
1. 在您的 Github户中分叉存储库 msdocs-python-flask-webapp-quickstart。
2. Azure 中创建一个新的 Python Web 应用。
3. `Deployment Center` 中更改源,使用 Github 登录,选择分叉的存储库并点击 `Save`
1. 在您的Github户中分叉存储库msdocs-python-flask-webapp-quickstart。
2. 在Azure中创建一个新的Python Web应用。
3.`Deployment Center`中更改源,使用Github登录,选择分叉的存储库并点击`Save`
与之前的情况一样,登录到 SCM 门户或通过 FTP 登录,可以在 `/wwwroot` 中看到压缩文件 `output.tar.gz`,该文件包含 webapp 的代码。
与之前的情况一样,登录到SCM门户或通过FTP登录,可以在`/wwwroot`中看到压缩文件`output.tar.gz`,该文件包含webapp的代码。
> [!TIP]
> 仅通过 FTP 连接并修改文件 `output.tar.gz` 并重新触发部署不足以更改 webapp 执行的代码。
> 仅通过FTP连接并修改文件`output.tar.gz`并重新触发部署不足以更改webapp执行的代码。
## 权限提升