Az - Container Registry

Reading time: 8 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Grundinformationen

Azure Container Registry (ACR) ist ein sicheres, privates Registry, das es Ihnen ermöglicht, Container-Images in der Azure-Cloud zu speichern, zu verwalten und darauf zuzugreifen. Es integriert sich nahtlos mit mehreren Azure-Diensten und bietet automatisierte Build- und Bereitstellungs-Workflows in großem Maßstab. Mit Funktionen wie Geo-Replikation und Schwachstellenscanning hilft ACR, die Sicherheit und Compliance auf Unternehmensniveau für containerisierte Anwendungen zu gewährleisten.

Berechtigungen

Dies sind die verschiedenen Berechtigungen laut den Dokumenten, die über ein Container Registry vergeben werden können:

  • Zugriff auf den Resource Manager
  • Erstellen/Löschen von Registries
  • Bild hochladen
  • Bild herunterladen
  • Bilddaten löschen
  • Richtlinien ändern
  • Bilder signieren

Es gibt auch einige vordefinierte Rollen, die zugewiesen werden können, und es ist auch möglich, benutzerdefinierte Rollen zu erstellen.

Authentifizierung

warning

Es ist sehr wichtig, dass Sie, auch wenn der Registrierungsname einige Großbuchstaben enthält, immer Kleinbuchstaben verwenden, um sich anzumelden, Bilder hochzuladen und herunterzuladen.

Es gibt 4 Möglichkeiten, sich bei einem ACR zu authentifizieren:

  • Mit Entra ID: Dies ist die Standard-Methode zur Authentifizierung bei einem ACR. Es verwendet den Befehl az acr login, um sich beim ACR zu authentifizieren. Dieser Befehl speichert die Anmeldeinformationen in der ~/.docker/config.json-Datei. Darüber hinaus, wenn Sie diesen Befehl aus einer Umgebung ohne Zugriff auf einen Docker-Socket wie in einer Cloud-Shell ausführen, ist es möglich, das --expose-token-Flag zu verwenden, um das Token zur Authentifizierung beim ACR zu erhalten. Um sich zu authentifizieren, müssen Sie den Benutzernamen 00000000-0000-0000-0000-000000000000 verwenden, wie: docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
  • Mit einem Administratorkonto: Der Administratorkonto ist standardmäßig deaktiviert, kann jedoch aktiviert werden, und dann ist es möglich, auf die Registry mit dem Benutzernamen und Passwort des Administratorkontos mit vollständigen Berechtigungen für die Registry zuzugreifen. Dies wird weiterhin unterstützt, da einige Azure-Dienste es verwenden. Beachten Sie, dass 2 Passwörter für diesen Benutzer erstellt werden und beide gültig sind. Sie können es mit az acr update -n <acrName> --admin-enabled true aktivieren. Beachten Sie, dass der Benutzername normalerweise der Registrierungsname ist (und nicht admin).
  • Mit einem Token: Es ist möglich, ein Token mit einem spezifischen scope map (Berechtigungen) zu erstellen, um auf die Registry zuzugreifen. Dann ist es möglich, den Namen des Tokens als Benutzernamen und eines der generierten Passwörter zur Authentifizierung bei der Registry mit docker login -u <registry-name> -p <password> <registry-url> zu verwenden.
  • Mit einem Service Principal: Es ist möglich, einen Service Principal zu erstellen und eine Rolle wie AcrPull zuzuweisen, um Bilder herunterzuladen. Dann ist es möglich, sich mit der SP appId als Benutzernamen und einem generierten Geheimnis als Passwort bei der Registry anzumelden.

Beispielskript aus den Dokumenten zur Erstellung eines SP mit Zugriff auf eine Registry:

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"

Verschlüsselung

Nur die Premium SKU unterstützt Verschlüsselung im Ruhezustand für die Images und andere Artefakte.

Netzwerk

Nur die Premium SKU unterstützt private Endpunkte. Die anderen unterstützen nur öffentlichen Zugriff. Ein öffentlicher Endpunkt hat das Format <registry-name>.azurecr.io und ein privater Endpunkt hat das Format <registry-name>.privatelink.azurecr.io. Aus diesem Grund muss der Name des Registrys in ganz Azure einzigartig sein.

Microsoft Defender für Cloud

Dies ermöglicht es Ihnen, die Images im Registry auf Schwachstellen zu scannen.

Soft-Delete

Die Soft-Delete-Funktion ermöglicht es Ihnen, ein gelöschtes Registry innerhalb der angegebenen Anzahl von Tagen wiederherzustellen. Diese Funktion ist standardmäßig deaktiviert.

Webhooks

Es ist möglich, Webhooks innerhalb von Registries zu erstellen. In diesem Webhook muss die URL angegeben werden, an die eine Anfrage gesendet wird, wann immer eine Push- oder Löschaktion durchgeführt wird. Darüber hinaus können Webhooks einen Scope angeben, um die Repositories (Images) zu kennzeichnen, die betroffen sein werden. Zum Beispiel bedeutet 'foo:*', dass Ereignisse unter dem Repository 'foo' stattfinden.

Aus der Perspektive eines Angreifers ist es interessant, dies vor der Durchführung einer Aktion im Registry zu überprüfen und es vorübergehend zu entfernen, wenn nötig, um eine Entdeckung zu vermeiden.

Verbundene Registries

Dies ermöglicht im Wesentlichen, die Images von einem Registry zu einem anderen, normalerweise lokal, zu spiegeln.

Es hat 2 Modi: ReadOnly und ReadWrite. Im ersten Modus werden die Images nur von dem Quell-Registry gezogen, und im zweiten Modus können Images auch in das Quell-Registry geschoben werden.

Damit Clients auf das Registry von Azure aus zugreifen können, wird ein Token generiert, wenn das verbundene Registry verwendet wird.

Ausführungen & Aufgaben

Ausführungen & Aufgaben ermöglichen es, in Azure containerbezogene Aktionen auszuführen, die Sie normalerweise lokal oder in einer CI/CD-Pipeline durchführen mussten. Zum Beispiel können Sie Images im Registry erstellen, pushen und ausführen.

Der einfachste Weg, einen Container zu erstellen und auszuführen, ist die Verwendung einer regulären Ausführung:

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

Allerdings wird dies Ausführungen auslösen, die aus der Perspektive eines Angreifers nicht besonders interessant sind, da ihnen keine verwaltete Identität zugeordnet ist.

Allerdings können Tasks eine System- und benutzerverwaltete Identität zugeordnet haben. Diese Tasks sind die nützlichsten, um Privilegien zu eskalieren im Container. Im Abschnitt zur Eskalation von Privilegien ist es möglich zu sehen, wie man Tasks zur Eskalation von Privilegien nutzen kann.

Cache

Die Cache-Funktion ermöglicht es, Bilder aus einem externen Repository herunterzuladen und die neuen Versionen im Registry zu speichern. Es erfordert, dass einige Anmeldeinformationen konfiguriert werden, indem die Anmeldeinformationen aus einem Azure Vault ausgewählt werden.

Dies ist aus der Perspektive eines Angreifers sehr interessant, da es ermöglicht, zu einer externen Plattform zu pivotieren, wenn der Angreifer genügend Berechtigungen hat, um auf die Anmeldeinformationen zuzugreifen. Bilder aus einem externen Repository herunterzuladen und einen Cache zu konfigurieren, könnte auch als Persistenzmechanismus verwendet werden.

Enumeration

warning

Es ist sehr wichtig, dass Sie, auch wenn der Registrierungsname einige Großbuchstaben enthält, nur Kleinbuchstaben in der URL verwenden, um darauf zuzugreifen.

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>

Unauthentifizierter Zugriff

Az - Container Registry Unauth

Privilegieneskalation & Post-Exploitation

Az - Container Registry Privesc

Referenzen

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks