AWS - Cognito Privesc
Cognito
有关Cognito的更多信息,请查看:
AWS - Cognito Enum从身份池中收集凭据
由于Cognito可以向经过身份验证和未经身份验证的用户授予IAM角色凭据,如果您找到应用程序的身份池ID(应该在应用程序中硬编码),则可以获取新的凭据,从而提升权限(在您之前可能甚至没有任何凭据的AWS帐户中)。
有关更多信息,请查看此页面。
潜在影响: 直接提升到附加到未经身份验证用户的服务角色(可能也是附加到经过身份验证用户的角色)。
cognito-identity:SetIdentityPoolRoles
,iam:PassRole
cognito-identity:SetIdentityPoolRoles
,iam:PassRole
拥有此权限,您可以将任何Cognito角色授予Cognito应用程序的经过身份验证/未经身份验证的用户。
如果Cognito应用程序未启用未经身份验证的用户,您可能还需要权限cognito-identity:UpdateIdentityPool
来启用它。
潜在影响: 直接特权升级到任何Cognito角色。
cognito-identity:update-identity-pool
cognito-identity:update-identity-pool
拥有此权限的攻击者可以设置例如一个受他控制的Cognito用户池或任何其他身份提供者,他可以登录为一种访问此Cognito身份池的方式。然后,只需在该用户提供者上登录,就会允许他访问身份池中配置的经过身份验证的角色。
也可以滥用这个权限来允许基本身份验证:
潜在影响:妥协身份池内配置的经过身份验证的 IAM 角色。
cognito-idp:AdminAddUserToGroup
cognito-idp:AdminAddUserToGroup
此权限允许将 Cognito 用户添加到 Cognito 组,因此攻击者可以滥用此权限将受控用户添加到具有更高特权或不同 IAM 角色的其他组中:
潜在影响: 提升权限至其他 Cognito 组和附加到用户池组的 IAM 角色。
(cognito-idp:CreateGroup
| cognito-idp:UpdateGroup
), iam:PassRole
cognito-idp:CreateGroup
| cognito-idp:UpdateGroup
), iam:PassRole
拥有这些权限的攻击者可以使用每个可以被受损 Cognito 身份提供者使用的 IAM 角色创建/更新组,并使受损用户成为该组的一部分,从而访问所有这些角色:
潜在影响: 特权升级至其他 Cognito IAM 角色。
cognito-idp:AdminConfirmSignUp
cognito-idp:AdminConfirmSignUp
此权限允许确认注册。默认情况下,任何人都可以在 Cognito 应用程序中注册,如果保留这一权限,用户可以使用任何数据创建帐户,并通过此权限进行验证。
潜在影响: 如果您可以注册一个新用户,则可能会间接提升对已认证用户的身份池 IAM 角色的权限。如果能够确认任何帐户,则可能会间接提升对其他应用功能的权限。
cognito-idp:AdminCreateUser
cognito-idp:AdminCreateUser
此权限允许攻击者在用户池内创建新用户。新用户将被创建为已启用状态,但需要更改其密码。
潜在影响: 直接提升已认证用户的身份池 IAM 角色权限。间接提升至其他应用功能,能够创建任何用户
cognito-idp:AdminEnableUser
cognito-idp:AdminEnableUser
此权限可在一个非常特殊的情况下发挥作用,即攻击者找到了一个已禁用用户的凭据,需要重新启用该用户。
潜在影响: 对已验证用户的身份池 IAM 角色进行间接权限提升,如果攻击者拥有已禁用用户的凭据,则还可提升用户权限。
cognito-idp:AdminInitiateAuth
, cognito-idp:AdminRespondToAuthChallenge
cognito-idp:AdminInitiateAuth
, cognito-idp:AdminRespondToAuthChallenge
此权限允许使用 ADMIN_USER_PASSWORD_AUTH 方法** 进行登录。** 有关更多信息,请查看链接。
cognito-idp:AdminSetUserPassword
cognito-idp:AdminSetUserPassword
此权限允许攻击者更改任何用户的密码,使其能够冒充任何用户(未启用 MFA 的用户)。
潜在影响: 直接特权升级,可能访问任何用户,因此可以访问每个用户所属的所有组,并访问身份池经过身份验证的 IAM 角色。
cognito-idp:AdminSetUserSettings
| cognito-idp:SetUserMFAPreference
| cognito-idp:SetUserPoolMfaConfig
| cognito-idp:UpdateUserPool
cognito-idp:AdminSetUserSettings
| cognito-idp:SetUserMFAPreference
| cognito-idp:SetUserPoolMfaConfig
| cognito-idp:UpdateUserPool
AdminSetUserSettings: 攻击者可能滥用此权限,将自己控制的手机设置为用户的 SMS MFA。
SetUserMFAPreference: 与前一个权限类似,此权限可用于设置用户的 MFA 首选项,从而绕过 MFA 保护。
SetUserPoolMfaConfig: 与前一个权限类似,此权限可用于设置用户池的 MFA 首选项,从而绕过 MFA 保护。
UpdateUserPool: 还可以更新用户池以更改 MFA 策略。在此处检查 cli。
潜在影响: 对于攻击者知道凭据的任何用户,间接提升权限,这可能允许绕过 MFA 保护。
cognito-idp:AdminUpdateUserAttributes
cognito-idp:AdminUpdateUserAttributes
拥有此权限的攻击者可以更改受其控制的用户的电子邮件、电话号码或任何其他属性,以尝试在底层应用程序中获得更多特权。 这允许更改电子邮件或电话号码并将其设置为已验证。
潜在影响: 在使用基于用户属性赋予权限的 Cognito 用户池中,可能会导致底层应用程序的间接权限提升。
cognito-idp:CreateUserPoolClient
| cognito-idp:UpdateUserPoolClient
cognito-idp:CreateUserPoolClient
| cognito-idp:UpdateUserPoolClient
拥有此权限的攻击者可以创建一个比已存在的池客户端受限制更少的新用户池客户端。例如,新客户端可以允许任何类型的身份验证方法,不需要任何密钥,禁用令牌撤销,允许令牌有效期更长...
如果不是创建新客户端,而是修改现有客户端,也可以实现相同的效果。
潜在影响: 通过创建一个放宽安全措施的新客户端,可能会对用户池使用的身份池授权用户进行潜在的间接权限提升,使攻击者能够使用他能够创建的用户登录。
cognito-idp:CreateUserImportJob
| cognito-idp:StartUserImportJob
cognito-idp:CreateUserImportJob
| cognito-idp:StartUserImportJob
攻击者可以滥用这个权限,通过上传包含新用户的 csv 文件来创建用户。
潜在影响: 直接提升对已认证用户的身份池 IAM 角色的权限。间接提升权限以创建任何用户,从而影响其他应用功能。
cognito-idp:CreateIdentityProvider
| cognito-idp:UpdateIdentityProvider
cognito-idp:CreateIdentityProvider
| cognito-idp:UpdateIdentityProvider
攻击者可以创建一个新的身份提供者,然后能够通过该提供者进行登录。
潜在影响: 直接提升身份池 IAM 角色给经过身份验证的用户。间接提升权限以创建任何用户并访问其他应用功能。
cognito-sync:* 分析
这是 Cognito 身份池角色默认具有的非常常见的权限。即使权限中包含通配符看起来总是不太好(特别是来自 AWS),从攻击者的角度来看,这些权限并不是特别有用。
此权限允许读取身份池和身份池内身份 ID 的用户信息(这不是敏感信息)。 身份 ID 可能分配有数据集,其中包含会话信息(AWS 将其定义为已保存的游戏)。这可能包含某种敏感信息(但概率非常低)。您可以在枚举页面找到如何访问这些信息。
攻击者还可以使用这些权限加入到发布这些数据集更改的 Cognito 流或触发 Cognito 事件的 Lambda。我还没有看到有人使用这个功能,并且我不认为这里会有敏感信息,但这并非不可能。
自动化工具
Pacu,AWS 开发框架,现在包括“cognito__enum”和“cognito__attack”模块,可自动枚举账户中所有 Cognito 资产并标记弱配置、用于访问控制的用户属性等,还可根据可修改的自定义属性、可用的身份池凭据、ID 令牌中可假定的角色等自动创建用户(包括 MFA 支持)和权限提升。
有关模块功能的描述,请参阅博客文章的第 2 部分。安装说明请参阅主要Pacu页面。
用法
示例 cognito__attack 用法,尝试创建用户并针对给定身份池和用户池客户端执行所有权限提升向量:
以下是使用cognito__enum的示例,用于收集当前AWS账户中可见的所有用户池、用户池客户端、身份池、用户等信息:
Cognito Scanner 是一个用 Python 编写的 CLI 工具,实现了对 Cognito 的不同攻击,包括特权升级。
安装
用法
了解更多信息,请查看https://github.com/padok-team/cognito-scanner
Last updated