Cognito User Pools

htARTE (HackTricks AWS Red Team Expert) के साथ जीरो से हीरो तक AWS हैकिंग सीखें!

HackTricks का समर्थन करने के अन्य तरीके:

मौलिक जानकारी

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

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

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

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

  • Facebook, Google, Login with Amazon, और Sign in with Apple के साथ सामाजिक साइन-इन, और उपयोगकर्ता पूल से SAML और OIDC आईडेंटिटी प्रदाताओं के माध्यम से साइन-इन।

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

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

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

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

संभावित हमले

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

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

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

पेंटेस्टिंग के लिए उपकरण

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

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

उपयोग

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

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

वर्तमान AWS खाते में दिखाई देने वाले सभी उपयोगकर्ता पूल, उपयोगकर्ता पूल क्लाइंट, पहचान पूल, उपयोगकर्ता आदि को एकत्रित करने के लिए नमूना cognito__enum उपयोग:

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

स्थापना

$ pip install cognito-scanner

उपयोग

$ cognito-scanner --help

अधिक जानकारी के लिए https://github.com/padok-team/cognito-scanner देखें

पंजीकरण

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

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), क्योंकि डिफ़ॉल्ट रूप से आप अपनी विशेषताओं के मानों को बदल सकते हैं, आप खुद ही मान्यता बढ़ा सकते हैं और अपने आप को उच्च स्तर पर बढ़ा सकते हैं!

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

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

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

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

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

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

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

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

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

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

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

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

कोड के साथ आप पासवर्ड बदल सकते हैं:

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>

प्रमाणीकरण

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

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

  • आईडी टोकन वह टोकन है जो उपयोगकर्ता के गुणों के मान को शामिल करता है, यहाँ तक कि कस्टम गुणों को भी।

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

  • रिफ्रेश टोकन: रिफ्रेश टोकन के साथ आप नए आईडी टोकन और एक्सेस टोकन प्राप्त कर सकते हैं उपयोगकर्ता के लिए जब तक रिफ्रेश टोकन अमान्य नहीं हो जाताडिफ़ॉल्ट रूप से, रिफ्रेश टोकन 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

यह विधि एक और सरल और **पारंपरिक उपयोगकर्ता और पासवर्ड प्रमाणीकरण** फ्लो है। **सिफारिश की जाती है कि एक पारंपरिक** प्रमाणीकरण विधि **को कोग्निटो में स्थानांतरित** करें और फिर इसे **अक्षम** कर दें और फिर इसके बजाय **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