Cognito User Pools
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
User pool je direktorijum korisnika u Amazon Cognitu. Sa user pool-om, vaši korisnici mogu prijaviti se na vašu web ili mobilnu aplikaciju putem Amazona Cognita, ili se federisati putem treće strane provajdera identiteta (IdP). Bez obzira da li se vaši korisnici prijavljuju direktno ili putem treće strane, svi članovi user pool-a imaju profil u direktorijumu kojem možete pristupiti putem SDK-a.
User pool-ovi pružaju:
Usluge registracije i prijavljivanja.
Ugrađeni, prilagodljivi web UI za prijavljivanje korisnika.
Društveno prijavljivanje putem Facebook-a, Google-a, Login with Amazon, i Sign in with Apple, kao i putem SAML i OIDC provajdera identiteta iz vašeg user pool-a.
Upravljanje korisničkim direktorijumom i korisničkim profilima.
Bezbednosne funkcije kao što su višefaktorska autentifikacija (MFA), provere za kompromitovane akreditive, zaštita od preuzimanja naloga, i verifikacija telefona i email-a.
Prilagođeni radni tokovi i migracija korisnika putem AWS Lambda okidača.
Izvorni kod aplikacija obično takođe sadrži user pool ID i ID klijentske aplikacije, (i ponekad tajnu aplikacije?) koji su potrebni za prijavu korisnika na Cognito User Pool.
Registracija: Po defaultu, korisnik se može registrovati sam, 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 brute-force.
Brute-force prijava: U Authentication sekciji imate sve metode koje korisnik ima za prijavu, možete pokušati da ih brute-force-ujete da pronađete validne akreditive.
Pacu, sada uključuje cognito__enum
i cognito__attack
module koji automatski enumeriraju sve Cognito resurse u nalogu i označavaju slabe konfiguracije, korisničke atribute korišćene za kontrolu pristupa, itd., i takođe automatski kreiraju korisnike (uključujući podršku za MFA) i eskalaciju privilegija na osnovu modifikabilnih prilagođenih atributa, upotrebljivih akreditiva identiteta, preuzimljivih uloga u id tokenima, itd.
Za opis funkcija modula pogledajte deo 2 blog posta. Za uputstva za instalaciju pogledajte glavnu Pacu stranicu.
Cognito Scanner je CLI alat u pythonu koji implementira različite napade na Cognito uključujući neželjeno kreiranje naloga i oracle naloga. Proverite ovaj link za više informacija.
CognitoAttributeEnum: Ovaj skript omogućava enumeraciju validnih atributa za korisnike.
User Pools omogućava podrazumevano da se registruju novi korisnici.
Možda ćete naići na grešku koja ukazuje da treba da obezbedite više detalja o korisniku:
Možete pružiti potrebne detalje sa JSON-om kao što je:
Možete koristiti ovu funkcionalnost takođe da enumerišete postojeće korisnike. Ovo je poruka o grešci kada korisnik već postoji sa tim imenom:
Obratite pažnju na prethodnu komandu kako prilagođene atribute počinju sa "custom:". Takođe, znajte da prilikom registracije ne možete kreirati nove prilagođene atribute za korisnika. Možete samo dodeliti vrednost podrazumevanim atributima (čak i ako nisu obavezni) i prilagođenim atributima koji su navedeni.
Ili samo da testirate da li klijent id postoji. Ovo je greška ako klijent-id ne postoji:
Naći ćete ovu grešku i nećete moći da registrujete ili enumerišete korisnike:
Cognito omogućava da verifikujete novog korisnika verifikovanjem njegovog emaila ili broja telefona. Stoga, prilikom kreiranja korisnika obično će vam biti potrebni barem korisničko ime i lozinka, kao i email i/ili broj telefona. Samo postavite jedan koji kontrolišete kako biste primili kod za verifikaciju vašeg novokreiranog korisničkog naloga ovako:
Čak i ako izgleda da možete koristiti istu email adresu i broj telefona, kada treba da verifikujete kreiranog korisnika, Cognito će se žaliti na korišćenje istih informacija i neće vam dozvoliti da verifikujete nalog.
Po defaultu, korisnik može modifikovati vrednost svojih atributa sa nečim poput:
Možda ćete pronaći prilagođene atribute koji se koriste (kao što je isAdmin
), jer po defaultu možete promeniti vrednosti svojih atributa, možda ćete moći da escalate privilegije menjajući vrednost sami!
Možete koristiti ovo da modifikujete email i broj telefona korisnika, ali tada, čak i ako račun ostane kao verifikovan, ti atributi su postavljeni u status neproveren (morate ih ponovo verifikovati).
Nećete moći da se prijavite sa emailom ili brojem telefona dok ih ne verifikujete, ali ćete moći da se prijavite sa korisničkim imenom.
Imajte na umu da čak i ako je email modifikovan i nije verifikovan, pojaviće se u ID Token-u unutar email
polja i polje email_verified
će biti false, ali ako aplikacija ne proverava to, možda ćete moći da se pretvarate da ste drugi korisnici.
Pored toga, imajte na umu da možete staviti bilo šta unutar name
polja jednostavno modifikujuć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 pretvarate da ste drugi korisnici.
U svakom slučaju, ako ste iz nekog razloga promenili svoj email, na primer, na novi na koji možete pristupiti, možete potvrditi email sa kodom koji ste primili na tu email adresu:
Koristite phone_number
umesto email
da promenite/overite novi broj telefona.
Administrator takođe može omogućiti opciju da se prijavite sa korisničkim imenom po izboru. Imajte na umu da nećete moći da promenite ovu vrednost na bilo koje korisničko ime ili preferred_username koje se već koristi za impersonaciju drugog korisnika.
Moguće je oporaviti lozinku samo znajući korisničko ime (ili email ili telefon se prihvata) i imati pristup jer će kod biti poslat tamo:
Odgovor servera će uvek biti pozitivan, kao da korisničko ime postoji. Ne možete koristiti ovu metodu za enumeraciju korisnika.
Sa kodom možete promeniti lozinku sa:
Da biste promenili lozinku, potrebno je da znate prethodnu lozinku:
Grupa korisnika podržava različite načine autentifikacije. Ako imate korisničko ime i lozinku, takođe su podržane različite metode za prijavu. Pored toga, kada je korisnik autentifikovan u grupi, dodeljuju se 3 vrste tokena: ID token, Access token i Refresh token.
ID Token: Sadrži tvrdnje o identitetu autentifikovanog korisnika, kao što su ime
, email
i broj_telefona
. ID token se takođe može koristiti za autentifikaciju korisnika na vašim serverskim resursima ili 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đenih.
Access Token: Sadrži tvrdnje o autentifikovanom korisniku, listu grupa korisnika i listu opsega. Svrha access tokena je da ovlasti API operacije u kontekstu korisnika u grupi korisnika. Na primer, možete koristiti access token da dodelite svom korisniku pristup za dodavanje, promenu ili brisanje atributa korisnika.
Refresh Token: Sa refresh tokenima možete dobiti nove ID tokene i Access tokene za korisnika dok refresh token nije nevažeći. Po defaultu, refresh token isteče 30 dana nakon što se korisnik vaše aplikacije prijavi u vašu grupu korisnika. Kada kreirate aplikaciju za vašu grupu korisnika, možete postaviti isteka refresh tokena aplikacije na bilo koju vrednost između 60 minuta i 10 godina.
Ovo je tok autentifikacije sa servera:
Aplikacija na serveru poziva AdminInitiateAuth
API operaciju (umesto InitiateAuth
). Ova operacija zahteva AWS kredencijale sa dozvolama koje uključuju cognito-idp:AdminInitiateAuth
i cognito-idp:AdminRespondToAuthChallenge
. Operacija vraća potrebne parametre za autentifikaciju.
Nakon što aplikacija na serveru ima parametre za autentifikaciju, poziva AdminRespondToAuthChallenge
API operaciju. AdminRespondToAuthChallenge
API operacija uspeva samo kada obezbedite AWS kredencijale.
Ova metoda NIJE omogućena po defaultu.
Da biste prijavili potrebno je da znate:
id grupe korisnika
id klijenta
korisničko ime
lozinku
tajnu klijenta (samo ako je aplikacija konfigurisana da koristi tajnu)
Da biste bili u mogućnosti da se prijavite ovom metodom, ta aplikacija mora dozvoliti prijavu sa ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Pored toga, da biste izvršili ovu akciju, potrebni su vam kredencijali sa dozvolama cognito-idp:AdminInitiateAuth
i cognito-idp:AdminRespondToAuthChallenge