Cognito User Pools
Osnovne informacije
Korisnički bazen je direktorijum korisnika u Amazon Cognitu. Sa korisničkim bazenom, vaši korisnici mogu da se prijave na vašu veb ili mobilnu aplikaciju putem Amazon Cognita, ili da federišu putem trećeg lica identiteta (IdP). Bez obzira da li se vaši korisnici prijavljuju direktno ili putem trećeg lica, svi članovi korisničkog bazena imaju profil direktorijuma kojem možete pristupiti putem SDK-a.
Korisnički bazeni pružaju:
Usluge registracije i prijave.
Ugrađeni, prilagodljivi veb korisnički interfejs za prijavu korisnika.
Društvenu prijavu sa Facebook-om, Google-om, Prijavom sa Amazon-om i Prijavom sa Apple-om, kao i putem SAML i OIDC provajdera identiteta iz vašeg korisničkog bazena.
Upravljanje korisničkim direktorijumom i korisničkim profilima.
Bezbednosne funkcije poput višefaktorske autentifikacije (MFA), provere kompromitovanih akreditiva, zaštite od preuzimanja naloga, i verifikacije telefonom i e-poštom.
Prilagođene radne tokove i migraciju korisnika putem AWS Lambda okidača.
Izvorni kod aplikacija obično takođe sadrži ID korisničkog bazena i ID klijentske aplikacije, (i ponekad tajnu aplikacije?) koje su potrebne da bi korisnik se prijavio na Cognito korisnički bazen.
Potencijalni napadi
Registracija: Podrazumevano, korisnik može sam sebe registrovati, tako da može kreirati korisnika za sebe.
Enumeracija korisnika: Funkcionalnost registracije može se koristiti za pronalaženje korisničkih imena koja već postoje. Ove informacije mogu biti korisne za napad metodom pokušaja i greške.
Brute-force napad na prijavu: U odeljku Autentifikacija imate sve metode koje korisnik mora da koristi za prijavu, možete pokušati da ih napadnete metodom pokušaja i greške kako biste pronašli validne akreditive.
Alati za pentesting
Pacu, okvir za eksploataciju AWS-a, 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 korištene za kontrolu pristupa, itd., i takođe automatizuju kreiranje korisnika (uključujući podršku za MFA) i eskalaciju privilegija na osnovu modifikovanih prilagodljivih atributa, korisnih identitetskih kredencijala, 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.
Korišćenje
Primer korišćenja cognito__attack za pokušaj kreiranja korisnika i svih vektora eskalacije privilegija protiv datog identitetskog bazena i klijentske aplikacije korisničkog bazena:
Primer korišćenja cognito__enum alata za prikupljanje svih bazena korisnika, klijenata bazena korisnika, identitetskih bazena, korisnika, itd. vidljivih u trenutnom AWS nalogu:
Cognito Scanner je alat u CLI formatu napisan u Pythonu koji implementira različite napade na Cognito, uključujući neželjenu kreaciju naloga i orakl naloge.
Instalacija
Upotreba
Za više informacija posetite https://github.com/padok-team/cognito-scanner
Registracija
User Pools podrazumevano omogućava registraciju novih korisnika.
Ako se bilo ko može registrovati
Možda ćete naići na grešku koja ukazuje da treba da pružite više detalja o korisniku:
Možete pružiti potrebne detalje pomoću JSON-a kao što je:
Možete koristiti ovu funkcionalnost i za enumeraciju postojećih korisnika. Ovo je poruka o grešci kada korisnik već postoji sa tim imenom:
Uočite u prethodnoj komandi kako prilagođeni atributi počinju sa "custom:". Takođe, imajte na umu da prilikom registracije ne možete kreirati nove prilagođene atribute za korisnika. Možete samo dati vrednost podrazumevanim atributima (čak i ako nisu obavezni) i specifikovanim prilagođenim atributima.
Ili samo da testirate da li postoji identifikator klijenta. Ovo je greška ako identifikator klijenta ne postoji:
Ako samo administrator može da registruje korisnike
Naći ćete ovu grešku i nećete moći da registrujete ili nabrojite korisnike:
Provera registracije
Cognito omogućava verifikaciju novog korisnika putem provere njegove email adrese ili broja telefona. Stoga, prilikom kreiranja korisnika obično će vam biti potrebno barem korisničko ime i lozinka, kao i email i/ili broj telefona. Postavite onaj koji kontrolišete kako biste primili kod za verifikaciju vašeg nedavno kreiranog korisničkog računa kao što je ovde:
Čak i ako izgleda da možete koristiti isti email i broj telefona, kada treba da verifikujete kreiranog korisnika, Cognito će se žaliti zbog korišćenja istih informacija i neće vam dozvoliti da verifikujete nalog.
Eskalacija privilegija / Ažuriranje atributa
Podrazumevano, korisnik može izmeniti vrednost svojih atributa nečim poput:
Eskalacija privilegija putem prilagođenih atributa
Možete naići na prilagođene atribute koji se koriste (kao što je isAdmin
), jer prema podrazumevanim postavkama možete promeniti vrednosti svojih sopstvenih atributa i možda ćete moći eskalarirati privilegije menjajući vrednost sami!
Eskalacija privilegija putem izmene emaila/korisničkog imena
Možete koristiti ovo da izmenite email i broj telefona korisnika, ali čak i ako nalog ostane verifikovan, ti atributi su postavljeni u neverifikovan status (morati ćete ih ponovo verifikovati).
Nećete moći da se prijavite putem emaila ili broja telefona dok ih ne verifikujete, ali ćete moći da se prijavite koristeći korisničko ime.
Imajte na umu da čak i ako je email izmenjen i nije verifikovan, pojaviće se u ID Token-u unutar polja email
i polje email_verified
će biti false, ali ako aplikacija ne proverava to, možete se predstaviti kao drugi korisnici.
Takođe, imajte na umu da možete staviti bilo šta unutar polja name
samo menjajući atribut imena. Ako aplikacija proverava to polje iz nekog razloga umesto email
(ili bilo kog drugog atributa), možda ćete moći da se predstavite kao drugi korisnici.
U svakom slučaju, ako iz nekog razloga promenite svoj email na primer na novi, možete potvrditi email sa kodom koji ste dobili na tu email adresu:
Koristite phone_number
umesto email
da biste promenili/verifikovali novi broj telefona.
Administrator takođe može omogućiti opciju za prijavu sa korisničkim imenom po izboru korisnika. Imajte na umu da nećete moći promeniti ovu vrednost u bilo koje korisničko ime ili preferred_username koje već bude korišćeno kako biste se predstavili kao drugi korisnik.
Obnova/Promena Lozinke
Moguće je obnoviti lozinku samo znajući korisničko ime (ili email ili telefon su prihvaćeni) i imajući pristup tome jer će tamo biti poslat kod:
Odgovor servera će uvek biti pozitivan, kao da korisničko ime postoji. Ne možete koristiti ovu metodu za enumeraciju korisnika.
With the code you can change the password with:
Da biste promenili lozinku, potrebno je znati prethodnu lozinku:
Autentikacija
Korisnički bazen podržava različite načine autentikacije. Ako imate korisničko ime i lozinku, podržani su i različiti metodi za prijavljivanje. Osim toga, kada je korisnik autentikovan u bazenu, dodeljuju se 3 vrste tokena: ID token, Pristupni token i Osvežavajući token.
ID Token: Sadrži tvrdnje o identitetu autentikovanog korisnika, kao što su
ime
,email
ibroj telefona
. ID token se takođe može koristiti za autentikaciju korisnika na vašim serverskim aplikacijama. Morate verifikovati potpis ID tokena pre nego što možete verovati bilo kojim tvrdnjama unutar ID tokena ako ga koristite u spoljnim aplikacijama.ID Token je token koji sadrži vrednosti atributa korisnika, čak i prilagođene.
Pristupni token: Sadrži tvrdnje o autentikovanom korisniku, listu grupa korisnika i listu opsega. Svrha pristupnog tokena je da autorizuje API operacije u kontekstu korisnika u korisničkom bazenu. Na primer, možete koristiti pristupni token da omogućite korisniku pristup za dodavanje, menjanje ili brisanje atributa korisnika.
Osvežavajući token: Pomoću osvežavajućih tokena možete dobiti nove ID tokene i pristupne tokene za korisnika dok je osvežavajući token važeći. Podrazumevano, osvežavajući token ističe 30 dana nakon što se vaš korisnik aplikacije prijavi u vaš korisnički bazen. Kada kreirate aplikaciju za svoj korisnički bazen, možete postaviti istek osvežavajućeg tokena aplikacije na bilo koju vrednost između 60 minuta i 10 godina.
ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
Ovo je autentikacioni tok na serverskoj strani:
Aplikacija na serverskoj strani poziva operaciju API-ja
AdminInitiateAuth
(umestoInitiateAuth
). Ova operacija zahteva AWS akreditive sa dozvolama koje uključujucognito-idp:AdminInitiateAuth
icognito-idp:AdminRespondToAuthChallenge
. Operacija vraća potrebne parametre autentikacije.Nakon što aplikacija na serverskoj strani dobije parametre autentikacije, poziva operaciju API-ja
AdminRespondToAuthChallenge
. Operacija API-jaAdminRespondToAuthChallenge
uspeva samo kada pružite AWS akreditive.
Ovaj metod NIJE omogućen podrazumevano.
Za prijavu morate znati:
ID korisničkog bazena
ID klijenta
korisničko ime
lozinku
tajnu klijenta (samo ako je aplikacija konfigurisana da koristi tajnu)
Da biste mogli da se prijavite ovim metodom, aplikacija mora dozvoliti prijavu sa ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Osim toga, da biste izvršili ovu radnju, potrebne su vam dozvole sa cognito-idp:AdminInitiateAuth
i cognito-idp:AdminRespondToAuthChallenge
REFRESH_TOKEN_AUTH & REFRESH_TOKEN
Ova metoda će uvek biti validna (ne može biti onemogućena), ali morate imati validan refresh token.
Kod za osvežavanje```python import boto3 import botocore import hmac import hashlib import base64
client_id = "" token = ''
boto_client = boto3.client('cognito-idp', region_name='')
def refresh(client_id, refresh_token): try: return boto_client.initiate_auth( ClientId=client_id, AuthFlow='REFRESH_TOKEN_AUTH', AuthParameters={ 'REFRESH_TOKEN': refresh_token } ) except botocore.exceptions.ClientError as e: return e.response
print(refresh(client_id, token))
An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN.
Last updated