mirror of
https://github.com/HackTricks-wiki/hacktricks-cloud.git
synced 2026-02-05 03:16:37 -08:00
Translated ['src/pentesting-cloud/aws-security/aws-services/aws-cognito-
This commit is contained in:
@@ -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,15 +35,15 @@ print(response)
|
||||
```
|
||||
### Cognito Sync
|
||||
|
||||
要生成身份池会话,您首先需要**生成身份 ID**。这个身份 ID 是**该用户会话的标识**。这些标识可以有多达 20 个数据集,最多可以存储 1MB 的键值对。
|
||||
要生成身份池会话,您首先需要**生成身份 ID**。这个身份 ID 是**该用户会话的标识**。这些标识可以有多达 20 个数据集,可以存储多达 1MB 的键值对。
|
||||
|
||||
这对于**保持用户信息**是**有用的**(用户将始终使用相同的身份 ID)。
|
||||
这对于**保持用户信息**(用户将始终使用相同的身份 ID)是**有用的**。
|
||||
|
||||
此外,服务**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) 页面。
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -118,7 +118,7 @@ aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --
|
||||
|
||||
上一部分遵循了 **默认增强身份验证流程**。此流程为生成的 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,14 +133,14 @@ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<ro
|
||||
> [!WARNING]
|
||||
> 如果您收到此 **错误**,则是因为 **基本流程未启用(默认)**
|
||||
|
||||
> `An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.`
|
||||
> `发生错误(InvalidParameterException),调用 GetOpenIdToken 操作时:基本(经典)流程未启用,请使用增强流程。`
|
||||
|
||||
拥有一组 IAM 凭证后,您应该检查 [您拥有的访问权限](../../index.html#whoami) 并尝试 [提升权限](../../aws-privilege-escalation/index.html)。
|
||||
|
||||
### 已认证
|
||||
|
||||
> [!NOTE]
|
||||
> 请记住,**已认证用户**可能会被授予 **不同的权限**,因此如果您可以 **在应用程序内注册**,请尝试这样做并获取新凭证。
|
||||
> 请记住,**已认证用户**可能会被授予 **不同的权限**,因此如果您可以 **在应用程序内注册**,请尝试这样做并获取新的凭证。
|
||||
|
||||
对于 **访问身份池的已认证用户**,可能还有 **角色** 可用。
|
||||
|
||||
@@ -149,24 +149,38 @@ aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<ro
|
||||
> [!TIP]
|
||||
> 通过 **IAM Cognito 认证角色创建的角色** 默认称为 `Cognito_<Identity Pool name>Auth_Role`
|
||||
|
||||
无论如何,**以下示例** 假设您已经在用于访问身份池的 **Cognito 用户池** 中登录(不要忘记,其他类型的身份提供者也可以被配置)。
|
||||
无论如何,**以下示例** 假设您已经登录到用于访问身份池的 **Cognito 用户池**(不要忘记,其他类型的身份提供者也可以被配置)。
|
||||
|
||||
<pre class="language-bash"><code class="lang-bash">aws cognito-identity get-id \
|
||||
<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>
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<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>
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<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>
|
||||
--custom-role-arn <role_arn> \
|
||||
--logins '{"cognito-idp.<region>.amazonaws.com/<user_pool_id>": "<ID_TOKEN>"}'
|
||||
</code></pre>
|
||||
|
||||
> **已弃用格式** — 这些可能不再适用于当前的 AWS CLI:
|
||||
<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/<user_pool_id>=<ID_TOKEN>
|
||||
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<user_pool_id>=<ID_TOKEN>
|
||||
|
||||
aws cognito-identity get-credentials-for-identity \
|
||||
--identity-id <identity_id> \
|
||||
--custom-role-arn <role_arn> \
|
||||
--logins cognito-idp.<region>.amazonaws.com/<user_pool_id>=<ID_TOKEN>
|
||||
</code></pre>
|
||||
|
||||
> [!WARNING]
|
||||
|
||||
Reference in New Issue
Block a user