diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md index f2621bde6..5ce649aab 100644 --- a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md @@ -4,7 +4,7 @@ ## App Services -有关 Azure 应用服务的更多信息,请查看: +有关 Azure App 服务的更多信息,请查看: {{#ref}} ../az-services/az-app-service.md @@ -23,7 +23,7 @@ az webapp ssh --name --resource-group ```bash az webapp create-remote-connection --name --resource-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 --resource-group } ] ``` -注意**用户名始终相同**(FTP 除外,它在开头添加了应用程序的名称),但**密码对于所有用户都是相同的**。 +注意**用户名始终相同**(除了FTP,它在开头添加了应用程序的名称),但**密码对所有人都是相同的**。 此外,**SCM URL 是 `.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 "/api/publish?type=zip" --data-binary "@./app.zip" -u ':' -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 "/vfs/data/jobs//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 "/vfs/data/jobs/continuous/job_name/job_log.txt" \ ---user ':>' -v +--user ':' -v ``` - 阅读 **Webjobs** 源代码: ```bash @@ -203,6 +203,12 @@ curl -X PUT \ --data-binary "@/Users/carlospolop/Downloads/rev.js" \ --user ':' ``` +### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action + +这些权限允许**将托管身份分配**给应用服务,因此如果应用服务之前被攻陷,这将允许攻击者将新的托管身份分配给应用服务并**提升权限**。 +```bash +az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ +``` ### Microsoft.Web/sites/config/list/action 此权限允许列出 App 服务的 **connection strings** 和 **appsettings**,这些可能包含敏感信息,如数据库凭据。 @@ -210,12 +216,6 @@ curl -X PUT \ az webapp config connection-string list --name --resource-group az webapp config appsettings list --name --resource-group ``` -### Microsoft.Web/sites/write, Microsoft.Web/sites/read, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action - -这些权限允许**将托管身份分配**给应用服务,因此如果应用服务之前被攻陷,这将允许攻击者将新的托管身份分配给应用服务并**提升权限**。 -```bash -az webapp identity assign --name --resource-group --identities /subscriptions//resourceGroups//providers/Microsoft.ManagedIdentity/userAssignedIdentities/ -``` ### 读取配置的第三方凭据 运行以下命令可以**读取当前账户中配置的第三方凭据**。请注意,如果例如某些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 --resource-group ` > [!WARNING] -> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp(即使它被配置为使用第三方提供商),如前面部分所述。 +> 请注意,拥有权限 `Microsoft.Web/sites/config/list/action` 和 SCM 凭据始终可以部署到 webapp(即使它被配置为使用第三方提供商),正如前面一节中提到的。 > [!WARNING] > 请注意,拥有以下权限也**可以执行任意容器**,即使 webapp 的配置不同。 diff --git a/src/pentesting-cloud/azure-security/az-services/az-app-services.md b/src/pentesting-cloud/azure-security/az-services/az-app-services.md index 65ab8879a..0f409b0a8 100644 --- a/src/pentesting-cloud/azure-security/az-services/az-app-services.md +++ b/src/pentesting-cloud/azure-security/az-services/az-app-services.md @@ -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 --resource-group # Get configured container (if any) in the webapp, it could contain credentials az webapp config container show --name --resource-group +# Get git URL to access the code +az webapp deployment source config-local-git --resource-group -n + # Get Webjobs az webapp webjob continuous list --resource-group --name az webapp webjob triggered list --resource-group --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 --resource-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 -n - - -# Get git URL to access the code -az webapp deployment source config-local-git --resource-group -n - -# Access/Modify the code via git -git clone 'https://:@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执行的代码。 ## 权限提升