Az - Container Registry

Reading time: 9 minutes

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

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
  • Modifier des 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 login pour 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-token pour obtenir le token pour s'authentifier Ă  l'ACR. Ensuite, pour s'authentifier, vous devez utiliser comme nom d'utilisateur 00000000-0000-0000-0000-000000000000 comme : 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 non admin).
  • 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 ce nom de token comme nom d'utilisateur et certains des mots de passe gĂ©nĂ©rĂ©s pour s'authentifier au registre avec docker login -u <registry-name> -p <password> aregistry-url>
  • Avec un Service Principal : Il est possible de crĂ©er un service principal et d'attribuer un rĂŽle comme AcrPull pour 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 :

bash
#!/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 :

bash
# 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 d'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.

bash
# 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>

Escalade de privilĂšges & Post-exploitation

Az - Automation Accounts Privesc

Références

tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks