Files
hacktricks-cloud/src/pentesting-cloud/azure-security/az-services/az-container-registry.md

9.3 KiB

Az - Container Registry

{{#include ../../../banners/hacktricks-training.md}}

Información Básica

Azure Container Registry (ACR) es un registro privado y seguro que te permite almacenar, gestionar y acceder a imágenes de contenedor en la nube de Azure. Se integra sin problemas con varios servicios de Azure, proporcionando flujos de trabajo de construcción y despliegue automatizados a gran escala. Con características como la geo-replicación y el escaneo de vulnerabilidades, ACR ayuda a garantizar la seguridad y el cumplimiento de nivel empresarial para aplicaciones en contenedores.

Permisos

Estos son los diferentes permisos según la documentación que se pueden otorgar sobre un Container Registry:

  • Acceso al Administrador de Recursos
  • Crear/eliminar registro
  • Subir imagen
  • Descargar imagen
  • Eliminar datos de imagen
  • Cambiar políticas
  • Firmar imágenes

También hay algunos roles integrados que se pueden asignar, y también es posible crear roles personalizados.

Autenticación

Warning

Es muy importante que, incluso si el nombre del registro contiene algunas letras mayúsculas, siempre debes usar letras minúsculas para iniciar sesión, subir y descargar imágenes.

Hay 4 formas de autenticarte en un ACR:

  • Con Entra ID: Esta es la forma predeterminada de autenticarte en un ACR. Utiliza el comando az acr login para autenticarte en el ACR. Este comando almacenará las credenciales en el archivo ~/.docker/config.json. Además, si estás ejecutando este comando desde un entorno sin acceso a un socket de docker, como en un cloud shell, es posible usar la opción --expose-token para obtener el token para autenticarte en el ACR. Luego, para autenticarte, debes usar como nombre de usuario 00000000-0000-0000-0000-000000000000, así: docker login myregistry.azurecr.io --username 00000000-0000-0000-0000-000000000000 --password-stdin <<< $TOKEN
  • Con una cuenta de administrador: El usuario administrador está deshabilitado por defecto, pero se puede habilitar y luego será posible acceder al registro con el nombre de usuario y contraseña de la cuenta de administrador con permisos completos para el registro. Esto sigue siendo compatible porque algunos servicios de Azure lo utilizan. Ten en cuenta que se crean 2 contraseñas para este usuario y ambas son válidas. Puedes habilitarlo con az acr update -n <acrName> --admin-enabled true. Ten en cuenta que el nombre de usuario suele ser el nombre del registro (y no admin).
  • Con un token: Es posible crear un token con un scope map específico (permisos) para acceder al registro. Luego, es posible usar este nombre de token como nombre de usuario y alguna de las contraseñas generadas para autenticarte en el registro con docker login -u <registry-name> -p <password> aregistry-url>
  • Con un Service Principal: Es posible crear un service principal y asignar un rol como AcrPull para descargar imágenes. Luego, será posible iniciar sesión en el registro utilizando el appId del SP como nombre de usuario y un secreto generado como contraseña.

Ejemplo de script de la documentación para generar un SP con acceso sobre un registro:

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

Cifrado

Solo el SKU Premium admite cifrado en reposo para las imágenes y otros artefactos.

Redes

Solo el SKU Premium admite puntos finales privados. Los otros solo admiten acceso público. Un punto final público tiene el formato <registry-name>.azurecr.io y un punto final privado tiene el formato <registry-name>.privatelink.azurecr.io. Por esta razón, el nombre del registro debe ser único en todo Azure.

Microsoft Defender para la Nube

Esto te permite escanear las imágenes en el registro en busca de vulnerabilidades.

Eliminación suave

La función de eliminación suave te permite recuperar un registro eliminado dentro del número de días indicado. Esta función está desactivada por defecto.

Webhooks

Es posible crear webhooks dentro de los registros. En este webhook es necesario especificar la URL donde se enviará una solicitud cada vez que se realice una acción de push o delete. Además, los Webhooks pueden indicar un alcance para señalar los repositorios (imágenes) que se verán afectados. Por ejemplo, 'foo:*' significa eventos bajo el repositorio 'foo'.

Desde la perspectiva de un atacante, es interesante verificar esto antes de realizar cualquier acción en el registro y eliminarlo temporalmente si es necesario, para evitar ser detectado.

Registros conectados

Esto permite básicamente reflejar las imágenes de un registro a otro, generalmente ubicado en las instalaciones.

Tiene 2 modos: Solo lectura y Lectura y escritura. En el primero, las imágenes solo se extraen del registro de origen, y en el segundo, las imágenes también se pueden enviar al registro de origen.

Para que los clientes accedan al registro desde Azure, se genera un token cuando se utiliza el registro conectado.

Ejecuciones y Tareas

Ejecuciones y Tareas permite ejecutar en Azure acciones relacionadas con contenedores que normalmente necesitarías hacer localmente o en un pipeline de CI/CD. Por ejemplo, puedes construir, enviar y ejecutar imágenes en el registro.

La forma más fácil de construir y ejecutar un contenedor es utilizando una Ejecución regular:

# 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

Sin embargo, eso activará ejecuciones que no son muy interesantes desde la perspectiva de un atacante porque no tienen ninguna identidad administrada adjunta.

Sin embargo, tasks pueden tener una identidad administrada por el sistema y por el usuario adjunta a ellas. Estas tareas son las útiles para escalar privilegios en el contenedor. En la sección de escalada de privilegios es posible ver cómo usar tareas para escalar privilegios.

Cache

La función de caché permite descargar imágenes de un repositorio externo y almacenar las nuevas versiones en el registro. Requiere tener algunas credenciales configuradas seleccionando las credenciales de un Azure Vault.

Esto es muy interesante desde la perspectiva de un atacante porque permite pivotar a una plataforma externa si el atacante tiene suficientes permisos para acceder a las credenciales, descargar imágenes de un repositorio externo y configurar una caché también podría usarse como un mecanismo de persistencia.

Enumeration

Warning

Es muy importante que, incluso si el nombre del registro contiene algunas letras mayúsculas, solo debes usar letras minúsculas en la URL para acceder a él.

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

Escalación de Privilegios y Post Explotación

{{#ref}} ../az-privilege-escalation/az-automation-accounts-privesc.md {{#endref}}

Referencias

{{#include ../../../banners/hacktricks-training.md}}