Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation

This commit is contained in:
Translator
2025-01-12 18:44:18 +00:00
parent ecf5b2bb87
commit b073ba19ce
6 changed files with 389 additions and 4 deletions

View File

@@ -0,0 +1,45 @@
# Az - Container Instances
{{#include ../../../../banners/hacktricks-training.md}}
## Información Básica
Azure Container Instances (ACI) proporcionan una **manera sin servidor y bajo demanda** de ejecutar **contenedores** en la nube de Azure. Puedes **desplegar** uno o varios contenedores en un grupo con **cómputo escalable**, **opciones de red** y la flexibilidad de conectarte a **otros servicios de Azure** (como Almacenamiento, Redes Virtuales o Registros de Contenedores).
Dado que son cargas de trabajo **efímeras**, no necesitas gestionar la infraestructura subyacente de VM; Azure se encarga de eso por ti. Sin embargo, desde una **perspectiva de seguridad ofensiva**, es crucial entender cómo los **permisos**, **identidades**, **configuraciones de red** y **registros** pueden revelar superficies de ataque y posibles configuraciones incorrectas.
### Configuraciones
- Para crear un contenedor, es posible usar una imagen pública, una imagen de contenedor de un Registro de Contenedores de Azure o un repositorio externo, lo que podría **requerir configurar una contraseña** para acceder a ella.
- En cuanto a la red, también puede tener una **IP pública** o ser **puntos finales privados**.
- También es posible configurar ajustes comunes de docker como:
- **Variables de entorno**
- **Volúmenes** (incluso de Azure Files)
- **Puertos**
- **Límites de CPU y memoria**
- **Política de reinicio**
- **Ejecutar como privilegiado**
- **Línea de comando para ejecutar**
- ...
## Enumeración
> [!WARNING]
> Al enumerar ACI, puedes revelar configuraciones sensibles como **variables de entorno**, **detalles de red** o **identidades gestionadas**. Ten cuidado al registrarlas o mostrarlas.
```bash
# List all container instances in the subscription
az container list
# Show detailed information about a specific container instance
az container show --name <container-name> --resource-group <res-group>
# Fetch logs from a container
az container logs --name <container-name> --resource-group <res-group>
# Execute a command in a running container and get the output
az container exec --name <container-name> --resource-group <res-group> --exec-command "ls"
# Get yaml configuration of the container group
az container export --name <container-name> --resource-group <res-group>
```

View File

@@ -0,0 +1,157 @@
# 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](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager) 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**.
![](</images/registry_roles.png>)
### 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 todavía se admite 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](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-auth-service-principal) para generar un SP con acceso sobre un registro:
```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"
```
### Cifrado
Solo el **Premium SKU** admite **cifrado en reposo** para las imágenes y otros artefactos.
### Redes
Solo el **Premium SKU** 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 básicamente permite **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:
```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
```
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 del sistema y del 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.
```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>
```
## Escalación de Privilegios y Post Explotación
{{#ref}}
../az-privilege-escalation/az-automation-accounts-privesc.md
{{#endref}}
## Referencias
- [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-authentication?tabs=azure-cli)
- [https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager](https://learn.microsoft.com/en-us/azure/container-registry/container-registry-roles?tabs=azure-cli#access-resource-manager)
{{#include ../../../../banners/hacktricks-training.md}}