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)
Pula użytkowników to katalog użytkowników w Amazon Cognito. Dzięki puli użytkowników, Twoi użytkownicy mogą zalogować się do Twojej aplikacji internetowej lub mobilnej za pośrednictwem Amazon Cognito, lub federować przez dostawcę tożsamości (IdP) trzeciej strony. Niezależnie od tego, czy Twoi użytkownicy logują się bezpośrednio, czy przez stronę trzecią, wszyscy członkowie puli użytkowników mają profil katalogu, do którego możesz uzyskać dostęp za pośrednictwem SDK.
Pule użytkowników oferują:
Usługi rejestracji i logowania.
Wbudowany, dostosowywalny interfejs użytkownika do logowania użytkowników.
Logowanie społecznościowe za pomocą Facebooka, Google, Logowanie z Amazon i Logowanie z Apple, oraz przez dostawców tożsamości SAML i OIDC z Twojej puli użytkowników.
Zarządzanie katalogiem użytkowników i profilami użytkowników.
Funkcje bezpieczeństwa, takie jak uwierzytelnianie wieloskładnikowe (MFA), kontrole dotyczące skompromitowanych poświadczeń, ochrona przed przejęciem konta oraz weryfikacja telefonu i e-maila.
Dostosowane przepływy pracy i migracja użytkowników za pomocą wyzwalaczy AWS Lambda.
Kod źródłowy aplikacji zazwyczaj zawiera również ID puli użytkowników oraz ID aplikacji klienckiej, (a czasami sekret aplikacji?), które są potrzebne do logowania użytkownika do puli użytkowników Cognito.
Rejestracja: Domyślnie użytkownik może zarejestrować się samodzielnie, więc mógłby stworzyć konto dla siebie.
Enumaracja użytkowników: Funkcjonalność rejestracji może być używana do znajdowania nazw użytkowników, które już istnieją. Ta informacja może być przydatna do ataku brute-force.
Brute-force logowania: W sekcji Uwierzytelnianie masz wszystkie metody, które użytkownik ma do logowania, możesz spróbować je brutalnie przetestować, aby znaleźć ważne poświadczenia.
Pacu, teraz zawiera moduły cognito__enum
i cognito__attack
, które automatyzują enumerację wszystkich zasobów Cognito w koncie i oznaczają słabe konfiguracje, atrybuty użytkowników używane do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym wsparcie MFA) oraz eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń z puli tożsamości, ról, które można przyjąć w tokenach id itp.
Aby uzyskać opis funkcji modułów, zobacz część 2 postu na blogu. Aby uzyskać instrukcje instalacji, zobacz główną stronę Pacu.
Cognito Scanner to narzędzie CLI w pythonie, które implementuje różne ataki na Cognito, w tym niechciane tworzenie kont i oracle kont. Sprawdź ten link po więcej informacji.
CognitoAttributeEnum: Ten skrypt umożliwia enumerację ważnych atrybutów dla użytkowników.
User Pools pozwala domyślnie na rejestrowanie nowych użytkowników.
Możesz napotkać błąd wskazujący, że musisz podać więcej szczegółów dotyczących użytkownika:
Możesz dostarczyć potrzebne szczegóły w formacie JSON, takim jak:
Możesz również użyć tej funkcjonalności do enumeracji istniejących użytkowników. Oto komunikat o błędzie, gdy użytkownik o tej nazwie już istnieje:
Zauważ w poprzedniej komendzie, jak niestandardowe atrybuty zaczynają się od "custom:". Wiedz również, że podczas rejestracji nie możesz tworzyć nowych niestandardowych atrybutów dla użytkownika. Możesz tylko nadać wartość domyślnym atrybutom (nawet jeśli nie są wymagane) oraz określonym niestandardowym atrybutom.
Lub po prostu, aby sprawdzić, czy identyfikator klienta istnieje. Oto błąd, jeśli identyfikator klienta nie istnieje:
Napotkasz ten błąd i nie będziesz w stanie zarejestrować ani enumerować użytkowników:
Cognito pozwala na weryfikację nowego użytkownika poprzez potwierdzenie jego adresu e-mail lub numeru telefonu. Dlatego podczas tworzenia użytkownika zazwyczaj będziesz musiał podać przynajmniej nazwę użytkownika i hasło oraz adres e-mail i/lub numer telefonu. Po prostu ustaw jeden który kontrolujesz, aby otrzymać kod do potwierdzenia nowo utworzonego konta użytkownika w ten sposób:
Nawet jeśli wygląda na to, że możesz użyć tego samego adresu e-mail i numeru telefonu, gdy musisz zweryfikować utworzonego użytkownika, Cognito będzie narzekać na użycie tych samych informacji i nie pozwoli ci zweryfikować konta.
Domyślnie użytkownik może zmienić wartość swoich atrybutów za pomocą czegoś takiego:
Możesz znaleźć atrybuty niestandardowe używane (takie jak isAdmin
), ponieważ domyślnie możesz zmieniać wartości swoich własnych atrybutów, możesz być w stanie eskalować uprawnienia, zmieniając wartość samodzielnie!
Możesz użyć tego do modyfikacji e-maila i numeru telefonu użytkownika, ale wtedy, nawet jeśli konto pozostaje zweryfikowane, te atrybuty są ustawione w statusie nieweryfikowanym (musisz je zweryfikować ponownie).
Nie będziesz mógł zalogować się za pomocą e-maila lub numeru telefonu aż do ich weryfikacji, ale będziesz mógł zalogować się za pomocą nazwy użytkownika.
Zauważ, że nawet jeśli e-mail został zmodyfikowany i niezweryfikowany, pojawi się w tokenie ID w polu email
, a pole email_verified
będzie fałszywe, ale jeśli aplikacja nie sprawdza tego, możesz podszyć się pod innych użytkowników.
Ponadto, zauważ, że możesz wpisać cokolwiek w polu name
, po prostu modyfikując atrybut nazwy. Jeśli aplikacja sprawdza to pole z jakiegoś powodu zamiast email
(lub jakiegokolwiek innego atrybutu), możesz być w stanie podszyć się pod innych użytkowników.
W każdym razie, jeśli z jakiegoś powodu zmieniłeś swój e-mail na nowy, do którego masz dostęp, możesz potwierdzić e-mail za pomocą kodu, który otrzymałeś na ten adres e-mail:
Użyj phone_number
zamiast email
, aby zmienić/weryfikować nowy numer telefonu.
Administrator może również włączyć opcję logowania za pomocą preferowanej nazwy użytkownika. Należy pamiętać, że nie będziesz mógł zmienić tej wartości na dowolną nazwę użytkownika lub preferowaną_nazwę użytkownika, która jest już używana do podszywania się pod innego użytkownika.
Możliwe jest przywrócenie hasła, znając nazwę użytkownika (lub akceptowany jest email lub telefon), a dostęp do niego jest konieczny, ponieważ kod zostanie tam wysłany:
Odpowiedź serwera zawsze będzie pozytywna, jakby nazwa użytkownika istniała. Nie możesz użyć tej metody do enumeracji użytkowników.
Za pomocą kodu możesz zmienić hasło na:
Aby zmienić hasło, musisz znać poprzednie hasło:
Pula użytkowników obsługuje różne sposoby uwierzytelniania. Jeśli masz nazwa użytkownika i hasło, obsługiwane są również różne metody logowania. Ponadto, gdy użytkownik jest uwierzytelniony w Puli, przyznawane są 3 typy tokenów: Token ID, Token dostępu i Token odświeżania.
Token ID: Zawiera roszczenia dotyczące tożsamości uwierzytelnionego użytkownika, takie jak name
, email
i phone_number
. Token ID może być również używany do uwierzytelniania użytkowników w serwerach zasobów lub aplikacjach serwerowych. Musisz zweryfikować podpis tokena ID, zanim będziesz mógł zaufać jakimkolwiek roszczeniom wewnątrz tokena ID, jeśli używasz go w aplikacjach zewnętrznych.
Token ID to token, który zawiera wartości atrybutów użytkownika, nawet tych niestandardowych.
Token dostępu: Zawiera roszczenia dotyczące uwierzytelnionego użytkownika, listę grup użytkownika oraz listę zakresów. Celem tokena dostępu jest autoryzacja operacji API w kontekście użytkownika w puli użytkowników. Na przykład, możesz użyć tokena dostępu, aby przyznać swojemu użytkownikowi dostęp do dodawania, zmieniania lub usuwania atrybutów użytkownika.
Token odświeżania: Dzięki tokenom odświeżania możesz uzyskać nowe tokeny ID i tokeny dostępu dla użytkownika, dopóki token odświeżania jest ważny. Domyślnie token odświeżania wygasa 30 dni po tym, jak użytkownik aplikacji zaloguje się do puli użytkowników. Gdy tworzysz aplikację dla swojej puli użytkowników, możesz ustawić czas wygaśnięcia tokena odświeżania aplikacji na dowolną wartość między 60 minutami a 10 latami.
To jest przepływ uwierzytelniania po stronie serwera:
Aplikacja po stronie serwera wywołuje operację API AdminInitiateAuth
(zamiast InitiateAuth
). Ta operacja wymaga poświadczeń AWS z uprawnieniami, które obejmują cognito-idp:AdminInitiateAuth
i cognito-idp:AdminRespondToAuthChallenge
. Operacja zwraca wymagane parametry uwierzytelniania.
Po uzyskaniu parametrów uwierzytelniania przez aplikację po stronie serwera, wywołuje operację API AdminRespondToAuthChallenge
. Operacja API AdminRespondToAuthChallenge
kończy się sukcesem tylko wtedy, gdy dostarczysz poświadczenia AWS.
Ta metoda NIE jest włączona domyślnie.
Aby zalogować się, musisz znać:
identyfikator puli użytkowników
identyfikator klienta
nazwę użytkownika
hasło
sekret klienta (tylko jeśli aplikacja jest skonfigurowana do używania sekretu)
Aby móc zalogować się tą metodą, ta aplikacja musi zezwalać na logowanie z ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Ponadto, aby wykonać tę akcję, potrzebujesz poświadczeń z uprawnieniami cognito-idp:AdminInitiateAuth
i cognito-idp:AdminRespondToAuthChallenge