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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.
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 Benutzernamen00000000-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 nichtadmin
). - 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 mitdocker 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:
#!/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:
# 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.
# 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
- 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
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
- Überprüfen Sie die Abonnementpläne!
- Treten Sie der 💬 Discord-Gruppe oder der Telegram-Gruppe bei oder folgen Sie uns auf Twitter 🐦 @hacktricks_live.
- Teilen Sie Hacking-Tricks, indem Sie PRs an die HackTricks und HackTricks Cloud GitHub-Repos senden.