mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-07-28 22:51:09 -07:00
Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation
This commit is contained in:
+17
-17
@@ -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中执行任意代码。**
|
||||
|
||||
### 来自 Github 的 Python
|
||||
### 来自Github的Python
|
||||
|
||||
本教程基于之前的教程,但使用 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执行的代码。
|
||||
|
||||
## 权限提升
|
||||
|
||||
|
||||
Reference in New Issue
Block a user