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
  • Image pushen
  • Image pullen
  • Bilddaten löschen
  • Richtlinien ändern
  • Images 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, Images zu pushen und zu pullen.

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 az acr login Befehl, 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 als 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 für diesen Benutzer 2 Passwörter 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, diesen Token-Namen als Benutzernamen und eines der generierten Passwörter zur Authentifizierung bei der Registry mit docker login -u <registry-name> -p <password> aregistry-url> zu verwenden.
  • Mit einem Dienstprinzipal: Es ist möglich, einen Dienstprinzipal zu erstellen und eine Rolle wie AcrPull zuzuweisen, um Images zu pullen. 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 Funktion Soft-Delete 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 Geltungsbereich angeben, um die Repositories (Images) zu kennzeichnen, die betroffen sind. 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 zu spiegeln, der sich normalerweise vor Ort befindet.

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 zum 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 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>

Privilegienerweiterung & Nachausnutzung

Az - Automation Accounts 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