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

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 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 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 avec docker 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 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 :

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

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