Cognito User Pools
Lernen & üben Sie AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Lernen & üben Sie GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Grundinformationen
Ein Benutzerpool ist ein Benutzerverzeichnis in Amazon Cognito. Mit einem Benutzerpool können sich Ihre Benutzer in Ihre Web- oder mobile App über Amazon Cognito einloggen oder sich über einen drittanbieter Identitätsanbieter (IdP) föderieren. Egal, ob sich Ihre Benutzer direkt oder über einen Drittanbieter anmelden, alle Mitglieder des Benutzerpools haben ein Verzeichnisprofil, auf das Sie über ein SDK zugreifen können.
Benutzerpools bieten:
Anmelde- und Registrierungsdienste.
Eine integrierte, anpassbare Web-Benutzeroberfläche, um Benutzer anzumelden.
Soziale Anmeldungen mit Facebook, Google, Login mit Amazon und Anmelden mit Apple sowie über SAML- und OIDC-Identitätsanbieter aus Ihrem Benutzerpool.
Benutzerverzeichnisverwaltung und Benutzerprofile.
Sicherheitsfunktionen wie Multi-Faktor-Authentifizierung (MFA), Überprüfungen auf kompromittierte Anmeldeinformationen, Schutz vor Kontoübernahme und Telefon- und E-Mail-Verifizierung.
Angepasste Workflows und Benutzermigration durch AWS Lambda-Trigger.
Quellcode von Anwendungen enthält normalerweise auch die Benutzerpool-ID und die Client-Anwendungs-ID (und manchmal das Anwendungsgeheimnis?), die benötigt werden, damit sich ein Benutzer in einen Cognito-Benutzerpool einloggen kann.
Potenzielle Angriffe
Registrierung: Standardmäßig kann sich ein Benutzer selbst registrieren, sodass er einen Benutzer für sich selbst erstellen könnte.
Benutzerenumeration: Die Registrierungsfunktionalität kann verwendet werden, um Benutzernamen zu finden, die bereits existieren. Diese Informationen können für den Brute-Force-Angriff nützlich sein.
Login-Brute-Force: Im Abschnitt Authentifizierung finden Sie alle Methoden, die ein Benutzer hat, um sich einzuloggen. Sie könnten versuchen, sie zu brute-forcen, um gültige Anmeldeinformationen zu finden.
Tools für pentesting
Pacu enthält jetzt die Module
cognito__enum
undcognito__attack
, die die Enumeration aller Cognito-Ressourcen in einem Konto automatisieren und schwache Konfigurationen, Benutzerattribute, die für die Zugriffskontrolle verwendet werden, usw. kennzeichnen. Außerdem automatisieren sie die Benutzererstellung (einschließlich MFA-Unterstützung) und die Privilegieneskalation basierend auf modifizierbaren benutzerdefinierten Attributen, verwendbaren Identitätspool-Anmeldeinformationen, übernehmbaren Rollen in ID-Token usw. Für eine Beschreibung der Funktionen der Module siehe Teil 2 des Blogbeitrags. Für Installationsanweisungen siehe die Hauptseite von Pacu.
Cognito Scanner ist ein CLI-Tool in Python, das verschiedene Angriffe auf Cognito implementiert, einschließlich unerwünschter Kontoerstellung und Konto-Orakel. Weitere Informationen finden Sie unter diesem Link.
CognitoAttributeEnum: Dieses Skript ermöglicht es, gültige Attribute für Benutzer aufzulisten.
Registrierung
User Pools erlaubt standardmäßig die Registrierung neuer Benutzer.
Wenn sich jeder registrieren kann
Möglicherweise finden Sie einen Fehler, der Ihnen anzeigt, dass Sie mehr Details über den Benutzer bereitstellen müssen:
Sie können die benötigten Details mit einem JSON wie folgt bereitstellen:
Sie könnten diese Funktionalität auch verwenden, um bestehende Benutzer aufzulisten. Dies ist die Fehlermeldung, wenn ein Benutzer mit diesem Namen bereits existiert:
Beachten Sie im vorherigen Befehl, wie die benutzerdefinierten Attribute mit "custom:" beginnen. Wissen Sie auch, dass Sie bei der Registrierung keine neuen benutzerdefinierten Attribute für den Benutzer erstellen können. Sie können nur Werte für Standardattribute (auch wenn sie nicht erforderlich sind) und angegebene benutzerdefinierte Attribute angeben.
Oder um einfach zu testen, ob eine Client-ID existiert. Dies ist der Fehler, wenn die Client-ID nicht existiert:
Wenn nur der Administrator Benutzer registrieren kann
Sie werden diesen Fehler finden und Sie werden nicht in der Lage sein, Benutzer zu registrieren oder aufzulisten:
Verifying Registration
Cognito ermöglicht es, einen neuen Benutzer zu verifizieren, indem seine E-Mail oder Telefonnummer verifiziert wird. Daher werden Sie beim Erstellen eines Benutzers normalerweise mindestens den Benutzernamen und das Passwort sowie die E-Mail und/oder Telefonnummer benötigen. Setzen Sie einfach eine die Sie kontrollieren, damit Sie den Code erhalten, um Ihr neu erstelltes Benutzer konto zu verifizieren.
Selbst wenn es so aussieht, als könnte man dieselbe E-Mail und Telefonnummer verwenden, wird Cognito bei der Verifizierung des erstellten Benutzers sich darüber beschweren, dass dieselben Informationen verwendet werden, und wird die Verifizierung des Kontos nicht zulassen.
Privilegieneskalation / Aktualisierung von Attributen
Standardmäßig kann ein Benutzer den Wert seiner Attribute ändern mit etwas wie:
Benutzerdefinierte Attribut-Privesc
Sie könnten benutzerdefinierte Attribute finden (wie isAdmin
), da Sie standardmäßig die Werte Ihrer eigenen Attribute ändern können, könnten Sie in der Lage sein, Privilegien zu eskalieren, indem Sie den Wert selbst ändern!
E-Mail/Benutzername-Modifikation Privesc
Sie können dies verwenden, um die E-Mail und Telefonnummer eines Benutzers zu ändern, aber selbst wenn das Konto als verifiziert bleibt, sind diese Attribute im unverifizierten Status gesetzt (Sie müssen sie erneut verifizieren).
Sie werden sich nicht mit E-Mail oder Telefonnummer anmelden können, bis Sie sie verifizieren, aber Sie werden sich mit dem Benutzernamen anmelden können.
Beachten Sie, dass selbst wenn die E-Mail geändert und nicht verifiziert wurde, sie im ID-Token im email
Feld erscheinen wird und das Feld email_verified
falsch sein wird, aber wenn die App nicht überprüft, könnten Sie andere Benutzer imitieren.
Darüber hinaus beachten Sie, dass Sie alles in das name
Feld einfügen können, indem Sie das name-Attribut ändern. Wenn eine App aus irgendeinem Grund dieses Feld anstatt des email
(oder eines anderen Attributs) überprüft, könnten Sie in der Lage sein, andere Benutzer zu imitieren.
Wenn Sie aus irgendeinem Grund Ihre E-Mail beispielsweise auf eine neue, auf die Sie zugreifen können, geändert haben, können Sie die E-Mail mit dem Code bestätigen, den Sie an diese E-Mail-Adresse erhalten haben:
Verwenden Sie phone_number
anstelle von email
, um eine neue Telefonnummer zu ändern/zu verifizieren.
Der Administrator könnte auch die Option aktivieren, sich mit einem vom Benutzer bevorzugten Benutzernamen anzumelden. Beachten Sie, dass Sie diesen Wert nicht auf irgendeinen Benutzernamen oder bevorzugten_Benutzernamen, der bereits verwendet wird, ändern können, um einen anderen Benutzer zu impersonieren.
Passwort wiederherstellen/ändern
Es ist möglich, ein Passwort nur mit dem Benutzernamen (oder E-Mail oder Telefon wird akzeptiert) wiederherzustellen, und der Zugriff darauf ist erforderlich, da ein Code dorthin gesendet wird:
Die Antwort des Servers wird immer positiv sein, als ob der Benutzername existiert. Sie können diese Methode nicht verwenden, um Benutzer zu enumerieren.
Mit dem Code können Sie das Passwort ändern mit:
Um das Passwort zu ändern, müssen Sie das vorherige Passwort kennen:
Authentifizierung
Ein Benutzerpool unterstützt verschiedene Möglichkeiten zur Authentifizierung. Wenn Sie einen Benutzernamen und ein Passwort haben, werden auch verschiedene Methoden zum Anmelden unterstützt. Darüber hinaus werden, wenn ein Benutzer im Pool 3 Arten von Tokens vergeben: Das ID-Token, das Zugriffstoken und das Aktualisierungstoken.
ID-Token: Es enthält Ansprüche über die Identität des authentifizierten Benutzers, wie
name
,email
undphone_number
. Das ID-Token kann auch verwendet werden, um Benutzer zu Ihren Ressourcenservern oder Serveranwendungen zu authentifizieren. Sie müssen die Signatur des ID-Tokens überprüfen, bevor Sie irgendwelche Ansprüche im ID-Token vertrauen können, wenn Sie es in externen Anwendungen verwenden.Das ID-Token ist das Token, das die Attributwerte des Benutzers enthält, sogar die benutzerdefinierten.
Zugriffstoken: Es enthält Ansprüche über den authentifizierten Benutzer, eine Liste der Benutzergruppen und eine Liste von Scopes. Der Zweck des Zugriffstokens ist es, API-Operationen im Kontext des Benutzers im Benutzerpool zu autorisieren. Zum Beispiel können Sie das Zugriffstoken verwenden, um Ihrem Benutzer Zugriff zu gewähren, um Benutzerattribute hinzuzufügen, zu ändern oder zu löschen.
Aktualisierungstoken: Mit Aktualisierungstokens können Sie neue ID-Tokens und Zugriffstokens für den Benutzer erhalten, bis das Aktualisierungstoken ungültig ist. Standardmäßig läuft das Aktualisierungstoken 30 Tage nach der Anmeldung Ihres Anwendungsbenutzers in Ihrem Benutzerpool ab. Wenn Sie eine Anwendung für Ihren Benutzerpool erstellen, können Sie die Ablaufzeit des Aktualisierungstokens der Anwendung auf einen Wert zwischen 60 Minuten und 10 Jahren festlegen.
ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
Dies ist der Authentifizierungsfluss auf der Serverseite:
Die serverseitige Anwendung ruft die
AdminInitiateAuth
API-Operation auf (anstattInitiateAuth
). Diese Operation erfordert AWS-Anmeldeinformationen mit Berechtigungen, diecognito-idp:AdminInitiateAuth
undcognito-idp:AdminRespondToAuthChallenge
umfassen. Die Operation gibt die erforderlichen Authentifizierungsparameter zurück.Nachdem die serverseitige Anwendung die Authentifizierungsparameter hat, ruft sie die
AdminRespondToAuthChallenge
API-Operation auf. DieAdminRespondToAuthChallenge
API-Operation ist nur erfolgreich, wenn Sie AWS-Anmeldeinformationen bereitstellen.
Diese Methode ist standardmäßig NICHT aktiviert.
Um sich anzumelden, müssen Sie wissen:
Benutzerpool-ID
Client-ID
Benutzername
Passwort
Client-Geheimnis (nur wenn die Anwendung so konfiguriert ist, dass sie ein Geheimnis verwendet)
Um mit dieser Methode einloggen zu können, muss die Anwendung die Anmeldung mit ALLOW_ADMIN_USER_PASSWORD_AUTH
erlauben.
Darüber hinaus benötigen Sie zur Durchführung dieser Aktion Anmeldeinformationen mit den Berechtigungen cognito-idp:AdminInitiateAuth
und cognito-idp:AdminRespondToAuthChallenge
Last updated