Cognito User Pools

Support HackTricks

Basic Information

एक उपयोगकर्ता पूल Amazon Cognito में एक उपयोगकर्ता निर्देशिका है। एक उपयोगकर्ता पूल के साथ, आपके उपयोगकर्ता Amazon Cognito के माध्यम से आपके वेब या मोबाइल ऐप में साइन इन कर सकते हैं, या एक तृतीय-पक्ष पहचान प्रदाता (IdP) के माध्यम से संघनित कर सकते हैं। चाहे आपके उपयोगकर्ता सीधे साइन इन करें या एक तृतीय पक्ष के माध्यम से, उपयोगकर्ता पूल के सभी सदस्य एक निर्देशिका प्रोफ़ाइल रखते हैं जिसे आप एक SDK के माध्यम से एक्सेस कर सकते हैं।

उपयोगकर्ता पूल प्रदान करते हैं:

  • साइन-अप और साइन-इन सेवाएँ।

  • उपयोगकर्ताओं को साइन इन करने के लिए एक अंतर्निहित, अनुकूलन योग्य वेब UI।

  • फेसबुक, गूगल, अमेज़न के साथ लॉगिन, और एप्पल के साथ साइन इन, और आपके उपयोगकर्ता पूल से SAML और OIDC पहचान प्रदाताओं के माध्यम से सामाजिक साइन-इन।

  • उपयोगकर्ता निर्देशिका प्रबंधन और उपयोगकर्ता प्रोफाइल।

  • सुरक्षा सुविधाएँ जैसे बहु-कारक प्रमाणीकरण (MFA), समझौता किए गए क्रेडेंशियल्स के लिए जांच, खाता अधिग्रहण सुरक्षा, और फोन और ईमेल सत्यापन।

  • AWS Lambda ट्रिगर्स के माध्यम से अनुकूलित वर्कफ़्लो और उपयोगकर्ता माइग्रेशन।

एप्लिकेशन का स्रोत कोड आमतौर पर उपयोगकर्ता पूल ID और क्लाइंट एप्लिकेशन ID (और कभी-कभी एप्लिकेशन सीक्रेट?) भी शामिल करेगा, जो एक उपयोगकर्ता को Cognito उपयोगकर्ता पूल में लॉगिन करने के लिए आवश्यक हैं।

Potential attacks

  • पंजीकरण: डिफ़ॉल्ट रूप से एक उपयोगकर्ता स्वयं को पंजीकृत कर सकता है, इसलिए वह अपने लिए एक उपयोगकर्ता बना सकता है।

  • उपयोगकर्ता गणना: पंजीकरण कार्यक्षमता का उपयोग पहले से मौजूद उपयोगकर्ता नामों को खोजने के लिए किया जा सकता है। यह जानकारी ब्रूट-फोर्स हमले के लिए उपयोगी हो सकती है।

  • लॉगिन ब्रूट-फोर्स: प्रमाणीकरण अनुभाग में आपके पास सभी विधियाँ हैं जिनका उपयोगकर्ता को लॉगिन करने के लिए उपयोग करना है, आप उन्हें मान्य क्रेडेंशियल्स खोजने के लिए ब्रूट-फोर्स करने का प्रयास कर सकते हैं।

Tools for pentesting

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

# Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account
Pacu (new:test) > run cognito__enum

# cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:
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 Scanner एक CLI टूल है जो पायथन में लिखा गया है और यह Cognito पर विभिन्न हमलों को लागू करता है, जिसमें अनचाही खाता निर्माण और खाता ओरेकल शामिल हैं। अधिक जानकारी के लिए इस लिंक की जांच करें।

# Install
pip install cognito-scanner
# Run
cognito-scanner --help
  • CognitoAttributeEnum: यह स्क्रिप्ट उपयोगकर्ताओं के लिए मान्य विशेषताओं को सूचीबद्ध करने की अनुमति देती है।

python cognito-attribute-enu.py -client_id 16f1g98bfuj9i0g3f8be36kkrl

Registration

User Pools डिफ़ॉल्ट द्वारा नए उपयोगकर्ताओं को पंजीकरण करने की अनुमति देता है।

aws cognito-idp sign-up --client-id <client-id> \
--username <username> --password <password> \
--region <region> --no-sign-request

यदि कोई भी पंजीकरण कर सकता है

आपको एक त्रुटि मिल सकती है जो आपको बताती है कि आपको उपयोगकर्ता के बारे में अधिक विवरण प्रदान करने की आवश्यकता है:

An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: address: The attribute is required

आप आवश्यक विवरण एक JSON के साथ प्रदान कर सकते हैं जैसे:

--user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]'

आप इस कार्यक्षमता का उपयोग मौजूदा उपयोगकर्ताओं की गणना करने के लिए भी कर सकते हैं। जब उस नाम के साथ एक उपयोगकर्ता पहले से मौजूद होता है, तो यह त्रुटि संदेश है:

An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists

पिछले कमांड में ध्यान दें कि कस्टम विशेषताएँ "custom:" से शुरू होती हैं। यह भी जानें कि पंजीकरण करते समय आप उपयोगकर्ता के लिए नई कस्टम विशेषताएँ नहीं बना सकते। आप केवल डिफ़ॉल्ट विशेषताओं (भले ही वे आवश्यक न हों) और निर्धारित कस्टम विशेषताओं को मान दे सकते हैं।

या बस यह परीक्षण करने के लिए कि क्या एक क्लाइंट आईडी मौजूद है। यदि क्लाइंट-आईडी मौजूद नहीं है तो यह त्रुटि है:

An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist.

यदि केवल व्यवस्थापक उपयोगकर्ताओं को पंजीकृत कर सकता है

आप इस त्रुटि को पाएंगे और आप उपयोगकर्ताओं को पंजीकृत या सूचीबद्ध नहीं कर पाएंगे:

An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool

पंजीकरण की पुष्टि करना

Cognito एक नए उपयोगकर्ता की पुष्टि करने के लिए उसके ईमेल या फोन नंबर की पुष्टि करने की अनुमति देता है। इसलिए, जब आप एक उपयोगकर्ता बना रहे होते हैं, तो आमतौर पर आपको कम से कम उपयोगकर्ता नाम और पासवर्ड और ईमेल और/या फोन नंबर की आवश्यकता होगी। बस एक ऐसा सेट करें जिसे आप नियंत्रित करते हैं ताकि आप अपने नए बनाए गए उपयोगकर्ता खाते की पुष्टि करने के लिए कोड प्राप्त कर सकें जैसे:

aws cognito-idp confirm-sign-up --client-id <cliet_id> \
--username aasdasd2 --confirmation-code <conf_code> \
--no-sign-request --region us-east-1

यहां तक कि ऐसा लगता है कि आप वही ईमेल और फोन नंबर का उपयोग कर सकते हैं, जब आपको बनाए गए उपयोगकर्ता को सत्यापित करने की आवश्यकता होती है, तो Cognito समान जानकारी का उपयोग करने के बारे में शिकायत करेगा और आपको खाता सत्यापित करने नहीं देगा

विशेषाधिकार वृद्धि / गुण अपडेट करना

डिफ़ॉल्ट रूप से, एक उपयोगकर्ता अपने गुणों के मान को संशोधित कर सकता है कुछ इस तरह:

aws cognito-idp update-user-attributes \
--region us-east-1 --no-sign-request \
--user-attributes Name=address,Value=street \
--access-token <access token>

कस्टम विशेषता प्रिवेस्क

आपको कस्टम विशेषताएँ मिल सकती हैं (जैसे isAdmin), क्योंकि डिफ़ॉल्ट रूप से आप अपनी विशेषताओं के मान बदल सकते हैं, आप अधिकार बढ़ाने के लिए मान स्वयं बदल सकते हैं!

ईमेल/उपयोगकर्ता नाम संशोधन प्रिवेस्क

आप इसका उपयोग किसी उपयोगकर्ता का ईमेल और फोन नंबर संशोधित करने के लिए कर सकते हैं, लेकिन फिर, भले ही खाता सत्यापित रहे, वे विशेषताएँ असत्यापित स्थिति में सेट होती हैं (आपको उन्हें फिर से सत्यापित करना होगा)।

आप ईमेल या फोन नंबर के साथ लॉगिन नहीं कर पाएंगे जब तक कि आप उन्हें सत्यापित नहीं करते, लेकिन आप उपयोगकर्ता नाम के साथ लॉगिन करने में सक्षम होंगे। ध्यान दें कि भले ही ईमेल संशोधित किया गया हो और सत्यापित न हो, यह email क्षेत्र के अंदर ID Token में दिखाई देगा और email_verified फ़ील्ड false होगी, लेकिन यदि ऐप यह नहीं देख रहा है तो आप अन्य उपयोगकर्ताओं का अनुकरण कर सकते हैं

इसके अलावा, ध्यान दें कि आप नाम विशेषता को संशोधित करके name फ़ील्ड के अंदर कुछ भी डाल सकते हैं। यदि कोई ऐप किसी कारण से email (या किसी अन्य विशेषता) के बजाय उस फ़ील्ड की जांच कर रहा है तो आप अन्य उपयोगकर्ताओं का अनुकरण कर सकते हैं

खैर, यदि किसी कारण से आपने अपना ईमेल, उदाहरण के लिए, एक नए ईमेल में बदल दिया है जिसे आप एक्सेस कर सकते हैं, तो आप उस ईमेल पते पर प्राप्त कोड के साथ ईमेल की पुष्टि कर सकते हैं:

aws cognito-idp verify-user-attribute \
--access-token <access_token> \
--attribute-name email --code <code> \
--region <region> --no-sign-request

फोन_नंबर का उपयोग करें ईमेल के बजाय नए फोन नंबर को बदलने/सत्यापित करने के लिए।

व्यवस्थापक विकल्प को सक्षम कर सकता है उपयोगकर्ता द्वारा पसंद किए गए उपयोगकर्ता नाम के साथ लॉगिन करने के लिए। ध्यान दें कि आप इस मान को किसी भी उपयोगकर्ता नाम या पसंदीदा_उपयोगकर्ता नाम में नहीं बदल पाएंगे जो पहले से किसी अन्य उपयोगकर्ता का प्रतिनिधित्व करने के लिए उपयोग किया जा रहा है।

पासवर्ड पुनर्प्राप्त करें/बदलें

यह संभव है कि केवल उपयोगकर्ता नाम (या ईमेल या फोन स्वीकार किया जाता है) जानकर पासवर्ड को पुनर्प्राप्त किया जा सके और वहां एक कोड भेजा जाएगा:

aws cognito-idp forgot-password \
--client-id <client_id> \
--username <username/email/phone> --region <region>

सर्वर की प्रतिक्रिया हमेशा सकारात्मक होगी, जैसे कि यदि उपयोगकर्ता नाम मौजूद है। आप इस विधि का उपयोग उपयोगकर्ताओं की गणना करने के लिए नहीं कर सकते

With the code you can change the password with:

aws cognito-idp confirm-forgot-password \
--client-id <client_id> \
--username <username> \
--confirmation-code <conf_code> \
--password <pwd> --region <region>

पासवर्ड बदलने के लिए आपको पिछला पासवर्ड जानना होगा:

aws cognito-idp change-password \
--previous-password <value> \
--proposed-password <value> \
--access-token <value>

Authentication

एक उपयोगकर्ता पूल प्रमाणित करने के लिए विभिन्न तरीकों का समर्थन करता है। यदि आपके पास उपयोगकर्ता नाम और पासवर्ड हैं, तो लॉगिन के लिए भी विभिन्न विधियाँ समर्थित हैं। इसके अलावा, जब एक उपयोगकर्ता पूल में प्रमाणित होता है, तो 3 प्रकार के टोकन दिए जाते हैं: ID टोकन, एक्सेस टोकन और रीफ्रेश टोकन

  • ID Token: इसमें प्रमाणित उपयोगकर्ता की पहचान के बारे में दावे होते हैं, जैसे name, email, और phone_number। ID टोकन का उपयोग आपके संसाधन सर्वरों या सर्वर अनुप्रयोगों में उपयोगकर्ताओं को प्रमाणित करने के लिए भी किया जा सकता है। यदि आप इसे बाहरी अनुप्रयोगों में उपयोग करते हैं, तो आपको ID टोकन के अंदर किसी भी दावे पर भरोसा करने से पहले हस्ताक्षर की सत्यापन करनी चाहिए।

  • ID टोकन वह टोकन है जो उपयोगकर्ता के विशेषताओं के मान को शामिल करता है, यहां तक कि कस्टम वाले भी।

  • Access Token: इसमें प्रमाणित उपयोगकर्ता के बारे में दावे, उपयोगकर्ता के समूहों की सूची, और स्कोप की सूची होती है। एक्सेस टोकन का उद्देश्य उपयोगकर्ता पूल में उपयोगकर्ता के संदर्भ में API संचालन को अधिकृत करना है। उदाहरण के लिए, आप एक्सेस टोकन का उपयोग करके अपने उपयोगकर्ता को एक्सेस देने के लिए उपयोगकर्ता विशेषताओं को जोड़ने, बदलने या हटाने के लिए कर सकते हैं।

  • Refresh Token: रीफ्रेश टोकनों के साथ आप उपयोगकर्ता के लिए नए ID टोकन और एक्सेस टोकन प्राप्त कर सकते हैं जब तक कि रीफ्रेश टोकन अमान्य न हो जाए। डिफ़ॉल्ट रूप से, रीफ्रेश टोकन 30 दिनों के बाद समाप्त हो जाता है जब आपका अनुप्रयोग उपयोगकर्ता आपके उपयोगकर्ता पूल में साइन इन करता है। जब आप अपने उपयोगकर्ता पूल के लिए एक अनुप्रयोग बनाते हैं, तो आप अनुप्रयोग के रीफ्रेश टोकन की समाप्ति को 60 मिनट से 10 वर्षों के बीच किसी भी मान पर सेट कर सकते हैं।

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

यह सर्वर साइड प्रमाणीकरण प्रवाह है:

  • सर्वर-साइड ऐप AdminInitiateAuth API ऑपरेशन को कॉल करता है (इसके बजाय InitiateAuth)। इस ऑपरेशन के लिए AWS क्रेडेंशियल्स की आवश्यकता होती है जिनमें cognito-idp:AdminInitiateAuth और cognito-idp:AdminRespondToAuthChallenge शामिल हैं। यह ऑपरेशन आवश्यक प्रमाणीकरण पैरामीटर लौटाता है।

  • जब सर्वर-साइड ऐप के पास प्रमाणन पैरामीटर होते हैं, तो यह AdminRespondToAuthChallenge API ऑपरेशन को कॉल करता है। AdminRespondToAuthChallenge API ऑपरेशन केवल तभी सफल होता है जब आप AWS क्रेडेंशियल्स प्रदान करते हैं।

यह विधि डिफ़ॉल्ट रूप से सक्षम नहीं है

लॉगिन करने के लिए आपको जानना आवश्यक है:

  • उपयोगकर्ता पूल आईडी

  • क्लाइंट आईडी

  • उपयोगकर्ता नाम

  • पासवर्ड

  • क्लाइंट सीक्रेट (केवल यदि ऐप को एक सीक्रेट का उपयोग करने के लिए कॉन्फ़िगर किया गया है)

इस विधि के साथ लॉगिन करने के लिए उस अनुप्रयोग को ALLOW_ADMIN_USER_PASSWORD_AUTH के साथ लॉगिन करने की अनुमति देनी चाहिए। इसके अलावा, इस क्रिया को करने के लिए आपको cognito-idp:AdminInitiateAuth और cognito-idp:AdminRespondToAuthChallenge के साथ अनुमतियों के साथ क्रेडेंशियल्स की आवश्यकता है।

aws cognito-idp admin-initiate-auth \
--client-id <client-id> \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'
--user-pool-id "<pool-id>"

# Check the python code to learn how to generate the hsecret_hash
लॉगिन के लिए कोड

```python import boto3 import botocore import hmac import hashlib import base64

client_id = "" user_pool_id = "" client_secret = "" username = "" password = ""

boto_client = boto3.client('cognito-idp', region_name='us-east-1')

def get_secret_hash(username, client_id, client_secret): key = bytes(client_secret, 'utf-8') message = bytes(f'{username}{client_id}', 'utf-8') return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

If the Client App isn't configured to use a secret

just delete the line setting the SECRET_HASH

def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): try: return boto_client.admin_initiate_auth( UserPoolId=user_pool_id, ClientId=client_id, AuthFlow='ADMIN_USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': username_or_alias, 'PASSWORD': password, 'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) } ) except botocore.exceptions.ClientError as e: return e.response

print(login_user(username, password, client_id, client_secret, user_pool_id))

</details>

### USER\_PASSWORD\_AUTH

यह विधि एक और सरल और **पारंपरिक उपयोगकर्ता और पासवर्ड प्रमाणीकरण** प्रवाह है। इसे **Cognito** में **पारंपरिक** प्रमाणीकरण विधि **स्थानांतरित** करने की सिफारिश की जाती है और फिर इसे **अक्षम** करने और इसके बजाय **ALLOW\_USER\_SRP\_AUTH** विधि का **उपयोग** करने की सिफारिश की जाती है (क्योंकि यह कभी भी पासवर्ड को नेटवर्क पर नहीं भेजता)।\
यह **विधि डिफ़ॉल्ट रूप से सक्षम नहीं है**।

कोड के अंदर **पिछली प्रमाणीकरण विधि** के साथ मुख्य **अंतर** यह है कि आपको **उपयोगकर्ता पूल आईडी** जानने की **आवश्यकता नहीं है** और आपको Cognito उपयोगकर्ता पूल में **अतिरिक्त अनुमतियों** की **आवश्यकता नहीं है**।

**लॉगिन** करने के लिए आपको **जानने की आवश्यकता है**:

* क्लाइंट आईडी
* उपयोगकर्ता नाम
* पासवर्ड
* क्लाइंट सीक्रेट (केवल यदि ऐप को एक सीक्रेट का उपयोग करने के लिए कॉन्फ़िगर किया गया है)

<div data-gb-custom-block data-tag="hint" data-style='info'>

इस विधि के साथ **लॉगिन करने में सक्षम होने के लिए** उस एप्लिकेशन को ALLOW\_USER\_PASSWORD\_AUTH के साथ लॉगिन करने की अनुमति देनी चाहिए।

</div>

```python
aws cognito-idp initiate-auth  --client-id <client-id> \
--auth-flow USER_PASSWORD_AUTH --region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'

# Check the python code to learn how to generate the secret_hash

REFRESH_TOKEN_AUTH & REFRESH_TOKEN

यह विधि हमेशा मान्य रहने वाली है (इसे बंद नहीं किया जा सकता) लेकिन आपके पास एक मान्य रिफ्रेश टोकन होना चाहिए।

aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'

Last updated