Az - Container Registry
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Informations de base
Azure Container Registry (ACR) est un registre privĂ© et sĂ©curisĂ© qui vous permet de stocker, gĂ©rer et accĂ©der aux images de conteneurs dans le cloud Azure. Il sâintĂšgre parfaitement Ă plusieurs services Azure, offrant des workflows de construction et de dĂ©ploiement automatisĂ©s Ă grande Ă©chelle. Avec des fonctionnalitĂ©s telles que la gĂ©o-rĂ©plication et lâanalyse de vulnĂ©rabilitĂ©s, ACR aide Ă garantir la sĂ©curitĂ© et la conformitĂ© de niveau entreprise pour les applications conteneurisĂ©es.
Permissions
Voici les diffĂ©rentes permissions selon la documentation qui peuvent ĂȘtre accordĂ©es sur un Container Registry :
- Accéder au Resource Manager
- Créer/supprimer un registre
- Pousser une image
- Tirer une image
- Supprimer des donnĂ©es dâimage
- Changer les politiques
- Signer des images
Il existe Ă©galement des rĂŽles intĂ©grĂ©s qui peuvent ĂȘtre attribuĂ©s, et il est Ă©galement possible de crĂ©er des rĂŽles personnalisĂ©s.

Authentification
Warning
Il est trĂšs important que mĂȘme si le nom du registre contient des lettres majuscules, vous devez toujours utiliser des lettres minuscules pour vous connecter, pousser et tirer des images.
Il existe 4 façons de sâauthentifier Ă un ACR :
- Avec Entra ID : Câest la mĂ©thode par dĂ©faut pour sâauthentifier Ă un ACR. Elle utilise la commande
az acr loginpour sâauthentifier Ă lâACR. Cette commande va stocker les identifiants dans le fichier~/.docker/config.json. De plus, si vous exĂ©cutez cette commande depuis un environnement sans accĂšs Ă un socket docker comme dans un cloud shell, il est possible dâutiliser le drapeau--expose-tokenpour obtenir le token pour sâauthentifier Ă lâACR. Ensuite, pour sâauthentifier, vous devez utiliser comme nom dâutilisateur00000000-0000-0000-0000-000000000000comme :docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN - Avec un compte administrateur : Lâutilisateur administrateur est dĂ©sactivĂ© par dĂ©faut mais il peut ĂȘtre activĂ© et ensuite il sera possible dâaccĂ©der au registre avec le nom dâutilisateur et le mot de passe du compte administrateur avec des permissions complĂštes sur le registre. Cela est toujours pris en charge car certains services Azure lâutilisent. Notez que 2 mots de passe sont créés pour cet utilisateur et les deux sont valides. Vous pouvez lâactiver avec
az acr update -n <acrName> --admin-enabled true. Notez que le nom dâutilisateur est gĂ©nĂ©ralement le nom du registre (et nonadmin). - Avec un token : Il est possible de crĂ©er un token avec une
scope map(permissions) spĂ©cifique pour accĂ©der au registre. Ensuite, il est possible dâutiliser le nom du token comme nom dâutilisateur et nâimporte lequel des mots de passe gĂ©nĂ©rĂ©s pour sâauthentifier au registre avecdocker login -u <registry-name> -p <password> <registry-url> - Avec un Service Principal : Il est possible de crĂ©er un service principal et dâattribuer un rĂŽle comme
AcrPullpour tirer des images. Ensuite, il sera possible de se connecter au registre en utilisant lâappId du SP comme nom dâutilisateur et un secret gĂ©nĂ©rĂ© comme mot de passe.
Exemple de script provenant de la documentation pour générer un SP avec accÚs à un registre :
#!/bin/bash
ACR_NAME=$containerRegistry
SERVICE_PRINCIPAL_NAME=$servicePrincipal
# Obtain the full registry ID
ACR_REGISTRY_ID=$(az acr show --name $ACR_NAME --query "id" --output tsv)
PASSWORD=$(az ad sp create-for-rbac --name $SERVICE_PRINCIPAL_NAME --scopes $ACR_REGISTRY_ID --role acrpull --query "password" --output tsv)
USER_NAME=$(az ad sp list --display-name $SERVICE_PRINCIPAL_NAME --query "[].appId" --output tsv)
echo "Service principal ID: $USER_NAME"
echo "Service principal password: $PASSWORD"
Chiffrement
Seul le Premium SKU prend en charge le chiffrement au repos pour les images et autres artefacts.
Réseautage
Seul le Premium SKU prend en charge les points de terminaison privĂ©s. Les autres ne prennent en charge que lâaccĂšs public. Un point de terminaison public a le format <registry-name>.azurecr.io et un point de terminaison privĂ© a le format <registry-name>.privatelink.azurecr.io. Pour cette raison, le nom du registre doit ĂȘtre unique dans tout Azure.
Microsoft Defender for Cloud
Cela vous permet de scanner les images dans le registre pour des vulnérabilités.
Suppression douce
La fonctionnalité de suppression douce vous permet de récupérer un registre supprimé dans le nombre de jours indiqué. Cette fonctionnalité est désactivée par défaut.
Webhooks
Il est possible de crĂ©er des webhooks Ă lâintĂ©rieur des registres. Dans ce webhook, il est nĂ©cessaire de spĂ©cifier lâURL oĂč une demande sera envoyĂ©e chaque fois quâune action de push ou de suppression est effectuĂ©e. De plus, les Webhooks peuvent indiquer un scope pour indiquer les dĂ©pĂŽts (images) qui seront affectĂ©s. Par exemple, âfoo:*â signifie des Ă©vĂ©nements sous le dĂ©pĂŽt âfooâ.
Du point de vue dâun attaquant, il est intĂ©ressant de vĂ©rifier cela avant dâeffectuer toute action dans le registre, et de le supprimer temporairement si nĂ©cessaire, pour Ă©viter dâĂȘtre dĂ©tectĂ©.
Registres connectés
Cela permet essentiellement de miroiter les images dâun registre Ă un autre, gĂ©nĂ©ralement situĂ© sur site.
Il a 2 modes : ReadOnly et ReadWrite. Dans le premier, les images sont uniquement tirĂ©es du registre source, et dans le second, les images peuvent Ă©galement ĂȘtre poussĂ©es vers le registre source.
Pour que les clients accÚdent au registre depuis Azure, un jeton est généré lorsque le registre connecté est utilisé.
Exécutions & Tùches
Les ExĂ©cutions & TĂąches permettent dâexĂ©cuter dans Azure des actions liĂ©es aux conteneurs que vous deviez gĂ©nĂ©ralement effectuer localement ou dans un pipeline CI/CD. Par exemple, vous pouvez construire, pousser et exĂ©cuter des images dans le registre.
Le moyen le plus simple de construire et dâexĂ©cuter un conteneur est dâutiliser une ExĂ©cution rĂ©guliĂšre :
# Build
echo "FROM mcr.microsoft.com/hello-world" > Dockerfile
az acr build --image sample/hello-world:v1 --registry mycontainerregistry008 --file Dockerfile .
# Run
az acr run --registry mycontainerregistry008 --cmd '$Registry/sample/hello-world:v1' /dev/null
Cependant, cela dĂ©clenchera des exĂ©cutions qui ne sont pas trĂšs intĂ©ressantes du point de vue dâun attaquant car elles nâont pas dâidentitĂ© gĂ©rĂ©e qui leur est attachĂ©e.
Cependant, tasks peuvent avoir une identitĂ© gĂ©rĂ©e systĂšme et utilisateur qui leur est attachĂ©e. Ces tĂąches sont celles utiles pour escalader les privilĂšges dans le conteneur. Dans la section sur lâescalade des privilĂšges, il est possible de voir comment utiliser les tĂąches pour escalader les privilĂšges.
Cache
La fonctionnalitĂ© de cache permet de tĂ©lĂ©charger des images depuis un dĂ©pĂŽt externe et de stocker les nouvelles versions dans le registre. Cela nĂ©cessite dâavoir des identifiants configurĂ©s en sĂ©lectionnant les identifiants depuis un Azure Vault.
Câest trĂšs intĂ©ressant du point de vue dâun attaquant car cela permet de pivoter vers une plateforme externe si lâattaquant a suffisamment de permissions pour accĂ©der aux identifiants, tĂ©lĂ©charger des images depuis un dĂ©pĂŽt externe et configurer un cache pourrait Ă©galement ĂȘtre utilisĂ© comme mĂ©canisme de persistance.
Enumeration
Warning
Il est trĂšs important que mĂȘme si le nom du registre contient des lettres majuscules, vous ne devez utiliser que des lettres minuscules dans lâURL pour y accĂ©der.
# List of all the registries
# Check the network, managed identities, adminUserEnabled, softDeletePolicy, url...
az acr list
# Get the details of a registry
az acr show --name <registry-name>
# List tokens of a registry
az acr token list --registry <registry-name> --resource-group <res-group>
# List repositories in a registry
az acr repository list --name <registry-name> --resource-group <res-group>
# List the tags of a repository
az acr repository show-tags --repository <repository-name> --name <registry-name> --resource-group <res-group>
# List deleted repository tags
## At the time of this writing there isn't yet any command to restore it
az acr repository list-deleted --name <registry-name>
# List tasks
## Check the git URL or the command
az acr task list --registry <registry-name>
# List tasks runs
az acr task list-runs --registry <registry-name>
# List connected registries
az acr connected-registry list --registry <registry-name>
# List cache
az acr cache list --registry <registry-name>
# Get cache details
az acr cache show --name <cache-name> --registry <registry-name>
AccÚs non authentifié
Az - Container Registry Unauth
Escalade de privilĂšges & Post exploitation
Az - Container Registry Privesc
Références
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-authentication?tabs=azure-cli
- https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

