Cognito User Pools

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Informations de base

Un pool d’utilisateurs est un annuaire d’utilisateurs dans Amazon Cognito. Avec un pool d’utilisateurs, vos utilisateurs peuvent se connecter Ă  votre application web ou mobile via Amazon Cognito, ou se fĂ©dĂ©rer via un fournisseur d’identitĂ© tiers (IdP). Que vos utilisateurs se connectent directement ou via un tiers, tous les membres du pool d’utilisateurs ont un profil dans l’annuaire auquel vous pouvez accĂ©der via un SDK.

Les pools d’utilisateurs fournissent :

  • Des services d’inscription et de connexion.
  • Une interface utilisateur web intĂ©grĂ©e et personnalisable pour connecter les utilisateurs.
  • Connexion sociale avec Facebook, Google, Login with Amazon, et Sign in with Apple, ainsi que via des fournisseurs d’identitĂ© SAML et OIDC de votre pool d’utilisateurs.
  • Gestion de l’annuaire des utilisateurs et des profils utilisateurs.
  • FonctionnalitĂ©s de sĂ©curitĂ© telles que l’authentification multi-facteurs (MFA), des vĂ©rifications pour des identifiants compromis, la protection contre la prise de contrĂŽle de compte, et la vĂ©rification par tĂ©lĂ©phone et par email.
  • Flux de travail personnalisĂ©s et migration des utilisateurs via des dĂ©clencheurs AWS Lambda.

Le code source des applications contiendra gĂ©nĂ©ralement Ă©galement l’ID du pool d’utilisateurs et l’ID de l’application cliente, (et parfois le secret de l’application ?) qui sont nĂ©cessaires pour qu’un utilisateur se connecte Ă  un pool d’utilisateurs Cognito.

Attaques potentielles

  • Inscription : Par dĂ©faut, un utilisateur peut s’inscrire lui-mĂȘme, il pourrait donc crĂ©er un utilisateur pour lui-mĂȘme.
  • ÉnumĂ©ration des utilisateurs : La fonctionnalitĂ© d’inscription peut ĂȘtre utilisĂ©e pour trouver des noms d’utilisateur qui existent dĂ©jĂ . Cette information peut ĂȘtre utile pour une attaque par force brute.
  • Force brute de connexion : Dans la section Authentification, vous avez tous les mĂ©thodes qu’un utilisateur a pour se connecter, vous pourriez essayer de les forcer Ă  trouver des identifiants valides.

Outils pour le pentesting

  • Pacu, inclut maintenant les modules cognito__enum et cognito__attack qui automatisent l’énumĂ©ration de tous les actifs Cognito dans un compte et signalent les configurations faibles, les attributs des utilisateurs utilisĂ©s pour le contrĂŽle d’accĂšs, etc., et automatisent Ă©galement la crĂ©ation d’utilisateurs (y compris le support MFA) et l’escalade de privilĂšges basĂ©e sur des attributs personnalisables modifiables, des identifiants de pool d’identitĂ© utilisables, des rĂŽles assumables dans les jetons d’identitĂ©, etc.
    Pour une description des fonctions des modules, voir la partie 2 du blog. Pour des instructions d’installation, voir la page principale de Pacu.
# Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account
Pacu (new:test) > run cognito__enum

# cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and user pool client:
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 Scanner est un outil CLI en python qui implĂ©mente diffĂ©rentes attaques sur Cognito, y compris la crĂ©ation de comptes non dĂ©sirĂ©s et l’oracle de compte. Consultez ce lien pour plus d’infos.
# Install
pip install cognito-scanner
# Run
cognito-scanner --help
  • CognitoAttributeEnum : Ce script permet d’énumĂ©rer les attributs valides pour les utilisateurs.
python cognito-attribute-enu.py -client_id 16f1g98bfuj9i0g3f8be36kkrl

Inscription

User Pools permet par dĂ©faut de s’inscrire de nouveaux utilisateurs.

aws cognito-idp sign-up --client-id <client-id> \
--username <username> --password <password> \
--region <region> --no-sign-request

Si quelqu’un peut s’inscrire

Vous pourriez trouver une erreur indiquant que vous devez fournir plus de dĂ©tails sur l’utilisateur :

An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: address: The attribute is required

Vous pouvez fournir les détails nécessaires avec un JSON tel que :

--user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]'

Vous pouvez Ă©galement utiliser cette fonctionnalitĂ© pour Ă©numĂ©rer les utilisateurs existants. Voici le message d’erreur lorsqu’un utilisateur existe dĂ©jĂ  avec ce nom :

An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists

Note

Notez dans la commande prĂ©cĂ©dente comment les attributs personnalisĂ©s commencent par “custom:”.
Sachez Ă©galement que lors de l’enregistrement, vous ne pouvez pas crĂ©er de nouveaux attributs personnalisĂ©s pour l’utilisateur. Vous ne pouvez donner de valeur qu’aux attributs par dĂ©faut (mĂȘme s’ils ne sont pas requis) et aux attributs personnalisĂ©s spĂ©cifiĂ©s.

Ou juste pour tester si un identifiant client existe. Voici l’erreur si l’identifiant client n’existe pas :

An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist.

Si seul l’administrateur peut enregistrer des utilisateurs

Vous trouverez cette erreur et vous ne pourrez pas enregistrer ou énumérer des utilisateurs :

An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool

VĂ©rification de l’inscription

Cognito permet de vĂ©rifier un nouvel utilisateur en vĂ©rifiant son email ou son numĂ©ro de tĂ©lĂ©phone. Par consĂ©quent, lors de la crĂ©ation d’un utilisateur, vous devrez gĂ©nĂ©ralement fournir au moins le nom d’utilisateur et le mot de passe ainsi que l’email et/ou le numĂ©ro de tĂ©lĂ©phone. Il suffit de dĂ©finir un que vous contrĂŽlez afin de recevoir le code pour vĂ©rifier votre compte d’utilisateur nouvellement créé comme ceci :

aws cognito-idp confirm-sign-up --client-id <cliet_id> \
--username aasdasd2 --confirmation-code <conf_code> \
--no-sign-request --region us-east-1

Warning

MĂȘme si il semble que vous pouvez utiliser le mĂȘme email et le mĂȘme numĂ©ro de tĂ©lĂ©phone, lorsque vous devez vĂ©rifier l’utilisateur créé, Cognito se plaindra d’utiliser les mĂȘmes informations et ne vous permettra pas de vĂ©rifier le compte.

Escalade de privilĂšges / Mise Ă  jour des attributs

Par défaut, un utilisateur peut modifier la valeur de ses attributs avec quelque chose comme :

aws cognito-idp update-user-attributes \
--region us-east-1 --no-sign-request \
--user-attributes Name=address,Value=street \
--access-token <access token>

Privesc d’attributs personnalisĂ©s

Caution

Vous pourriez trouver des attributs personnalisĂ©s utilisĂ©s (comme isAdmin), car par dĂ©faut vous pouvez changer les valeurs de vos propres attributs, vous pourriez ĂȘtre en mesure d’escalader les privilĂšges en changeant la valeur vous-mĂȘme !

Privesc de modification d’email/nom d’utilisateur

Vous pouvez utiliser cela pour modifier l’email et le numĂ©ro de tĂ©lĂ©phone d’un utilisateur, mais ensuite, mĂȘme si le compte reste vĂ©rifiĂ©, ces attributs sont dĂ©finis en statut non vĂ©rifiĂ© (vous devez les vĂ©rifier Ă  nouveau).

Warning

Vous ne pourrez pas vous connecter avec l’email ou le numĂ©ro de tĂ©lĂ©phone tant que vous ne les avez pas vĂ©rifiĂ©s, mais vous pourrez vous connecter avec le nom d’utilisateur.
Notez que mĂȘme si l’email a Ă©tĂ© modifiĂ© et non vĂ©rifiĂ©, il apparaĂźtra dans le jeton ID Ă  l’intĂ©rieur du champ email et le champ email_verified sera faux, mais si l’application ne vĂ©rifie pas cela, vous pourriez usurper l’identitĂ© d’autres utilisateurs.

De plus, notez que vous pouvez mettre n’importe quoi dans le champ name en modifiant simplement l’attribut name. Si une application vĂ©rifie ce champ pour une raison quelconque au lieu de l’email (ou tout autre attribut), vous pourriez ĂȘtre en mesure d’usurper l’identitĂ© d’autres utilisateurs.

Quoi qu’il en soit, si pour une raison quelconque vous avez changĂ© votre email par exemple pour un nouveau auquel vous pouvez accĂ©der, vous pouvez confirmer l’email avec le code que vous avez reçu Ă  cette adresse email :

aws cognito-idp verify-user-attribute \
--access-token <access_token> \
--attribute-name email --code <code> \
--region <region> --no-sign-request

Utilisez phone_number au lieu de email pour changer/vérifier un nouveau numéro de téléphone.

Note

L’administrateur pourrait Ă©galement activer l’option de connexion avec un nom d’utilisateur prĂ©fĂ©rĂ© par l’utilisateur. Notez que vous ne pourrez pas changer cette valeur pour un nom d’utilisateur ou un preferred_username dĂ©jĂ  utilisĂ© pour usurper l’identitĂ© d’un autre utilisateur.

Récupérer/Changer le mot de passe

Il est possible de rĂ©cupĂ©rer un mot de passe en connaissant le nom d’utilisateur (ou l’email ou le tĂ©lĂ©phone est acceptĂ©) et en y ayant accĂšs car un code y sera envoyĂ© :

aws cognito-idp forgot-password \
--client-id <client_id> \
--username <username/email/phone> --region <region>

Note

La rĂ©ponse du serveur sera toujours positive, comme si le nom d’utilisateur existait. Vous ne pouvez pas utiliser cette mĂ©thode pour Ă©numĂ©rer les utilisateurs

Avec le code, vous pouvez changer le mot de passe avec :

aws cognito-idp confirm-forgot-password \
--client-id <client_id> \
--username <username> \
--confirmation-code <conf_code> \
--password <pwd> --region <region>

Pour changer le mot de passe, vous devez connaßtre le mot de passe précédent :

aws cognito-idp change-password \
--previous-password <value> \
--proposed-password <value> \
--access-token <value>

Authentification

Un pool d’utilisateurs prend en charge diffĂ©rentes maniĂšres de s’authentifier. Si vous avez un nom d’utilisateur et un mot de passe, il existe Ă©galement diffĂ©rentes mĂ©thodes prises en charge pour se connecter.
De plus, lorsqu’un utilisateur est authentifiĂ© dans le Pool, 3 types de jetons sont fournis : le jeton ID, le jeton d’accĂšs et le jeton d’actualisation.

  • Jeton ID : Il contient des revendications sur l’identitĂ© de l’utilisateur authentifiĂ©, telles que name, email et phone_number. Le jeton ID peut Ă©galement ĂȘtre utilisĂ© pour authentifier les utilisateurs auprĂšs de vos serveurs de ressources ou applications serveur. Vous devez vĂ©rifier la signature du jeton ID avant de pouvoir faire confiance Ă  des revendications Ă  l’intĂ©rieur du jeton ID si vous l’utilisez dans des applications externes.
  • Le jeton ID est le jeton qui contient les valeurs des attributs de l’utilisateur, mĂȘme les personnalisĂ©s.
  • Jeton d’accĂšs : Il contient des revendications sur l’utilisateur authentifiĂ©, une liste des groupes de l’utilisateur et une liste de portĂ©es. Le but du jeton d’accĂšs est de autoriser les opĂ©rations API dans le contexte de l’utilisateur dans le pool d’utilisateurs. Par exemple, vous pouvez utiliser le jeton d’accĂšs pour accorder Ă  votre utilisateur l’accĂšs pour ajouter, modifier ou supprimer des attributs d’utilisateur.
  • Jeton d’actualisation : Avec les jetons d’actualisation, vous pouvez obtenir de nouveaux jetons ID et jetons d’accĂšs pour l’utilisateur jusqu’à ce que le jeton d’actualisation soit invalide. Par dĂ©faut, le jeton d’actualisation expire 30 jours aprĂšs que l’utilisateur de votre application se soit connectĂ© Ă  votre pool d’utilisateurs. Lorsque vous crĂ©ez une application pour votre pool d’utilisateurs, vous pouvez dĂ©finir l’expiration du jeton d’actualisation de l’application Ă  n’importe quelle valeur entre 60 minutes et 10 ans.

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

Voici le flux d’authentification cĂŽtĂ© serveur :

  • L’application cĂŽtĂ© serveur appelle l’opĂ©ration API AdminInitiateAuth (au lieu de InitiateAuth). Cette opĂ©ration nĂ©cessite des identifiants AWS avec des autorisations incluant cognito-idp:AdminInitiateAuth et cognito-idp:AdminRespondToAuthChallenge. L’opĂ©ration renvoie les paramĂštres d’authentification requis.
  • AprĂšs que l’application cĂŽtĂ© serveur a les paramĂštres d’authentification, elle appelle l’opĂ©ration API AdminRespondToAuthChallenge. L’opĂ©ration API AdminRespondToAuthChallenge ne rĂ©ussit que si vous fournissez des identifiants AWS.

Cette mĂ©thode n’est PAS activĂ©e par dĂ©faut.

Pour se connecter, vous devez connaĂźtre :

  • l’identifiant du pool d’utilisateurs
  • l’identifiant du client
  • le nom d’utilisateur
  • le mot de passe
  • le secret du client (uniquement si l’application est configurĂ©e pour utiliser un secret)

Note

Afin de pouvoir se connecter avec cette méthode, cette application doit autoriser la connexion avec ALLOW_ADMIN_USER_PASSWORD_AUTH.
De plus, pour effectuer cette action, vous avez besoin d’identifiants avec les autorisations cognito-idp:AdminInitiateAuth et cognito-idp:AdminRespondToAuthChallenge

aws cognito-idp admin-initiate-auth \
--client-id <client-id> \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'
--user-pool-id "<pool-id>"

# Check the python code to learn how to generate the hsecret_hash
Code pour se connecter ```python import boto3 import botocore import hmac import hashlib import base64

client_id = “” user_pool_id = “” client_secret = “” username = “” password = “”

boto_client = boto3.client(‘cognito-idp’, region_name=‘us-east-1’)

def get_secret_hash(username, client_id, client_secret): key = bytes(client_secret, ‘utf-8’) message = bytes(f’{username}{client_id}’, ‘utf-8’) return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

If the Client App isn’t configured to use a secret

just delete the line setting the SECRET_HASH

def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): try: return boto_client.admin_initiate_auth( UserPoolId=user_pool_id, ClientId=client_id, AuthFlow=‘ADMIN_USER_PASSWORD_AUTH’, AuthParameters={ ‘USERNAME’: username_or_alias, ‘PASSWORD’: password, ‘SECRET_HASH’: get_secret_hash(username_or_alias, client_id, client_secret) } ) except botocore.exceptions.ClientError as e: return e.response

print(login_user(username, password, client_id, client_secret, user_pool_id))

</details>

### USER_PASSWORD_AUTH

Cette méthode est un autre flux simple et **traditionnel d'authentification utilisateur et mot de passe**. Il est recommandé de **migrer une méthode d'authentification traditionnelle** vers **Cognito** et **recommandé** de **la désactiver** ensuite et **d'utiliser** la méthode **ALLOW_USER_SRP_AUTH** à la place (car celle-ci n'envoie jamais le mot de passe sur le réseau).\
Cette **méthode n'est PAS activée** par défaut.

La principale **différence** avec la **méthode d'authentification précédente** dans le code est que vous **n'avez pas besoin de connaßtre l'ID du pool d'utilisateurs** et que vous **n'avez pas besoin de permissions supplémentaires** dans le pool d'utilisateurs Cognito.

Pour **se connecter**, vous **devez** connaĂźtre :

- client id
- nom d'utilisateur
- mot de passe
- secret client (uniquement si l'application est configurée pour utiliser un secret)

> [!NOTE]
> Afin de **pouvoir se connecter avec cette méthode**, cette application doit permettre de se connecter avec ALLOW_USER_PASSWORD_AUTH.
```python
aws cognito-idp initiate-auth  --client-id <client-id> \
--auth-flow USER_PASSWORD_AUTH --region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'

# Check the python code to learn how to generate the secret_hash
Code Python pour se connecter ```python import boto3 import botocore import hmac import hashlib import base64

client_id = “” user_pool_id = “” client_secret = “” username = “” password = “”

boto_client = boto3.client(‘cognito-idp’, region_name=‘us-east-1’)

def get_secret_hash(username, client_id, client_secret): key = bytes(client_secret, ‘utf-8’) message = bytes(f’{username}{client_id}’, ‘utf-8’) return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

If the Client App isn’t configured to use a secret

just delete the line setting the SECRET_HASH

def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): try: return boto_client.initiate_auth( ClientId=client_id, AuthFlow=‘ADMIN_USER_PASSWORD_AUTH’, AuthParameters={ ‘USERNAME’: username_or_alias, ‘PASSWORD’: password, ‘SECRET_HASH’: get_secret_hash(username_or_alias, client_id, client_secret) } ) except botocore.exceptions.ClientError as e: return e.response

print(login_user(username, password, client_id, client_secret, user_pool_id))

</details>

### USER_SRP_AUTH

Ce scĂ©nario est similaire au prĂ©cĂ©dent mais **au lieu d'envoyer le mot de passe** Ă  travers le rĂ©seau pour se connecter, une **authentification par dĂ©fi est effectuĂ©e** (donc pas de mot de passe naviguant mĂȘme cryptĂ© Ă  travers le net).\
Cette **méthode est activée** par défaut.

Pour **se connecter**, vous **devez** connaĂźtre :

- l'identifiant du pool d'utilisateurs
- l'identifiant du client
- le nom d'utilisateur
- le mot de passe
- le secret du client (uniquement si l'application est configurée pour utiliser un secret)

<details>

<summary>Code to login</summary>
```python
from warrant.aws_srp import AWSSRP
import os

USERNAME='xxx'
PASSWORD='yyy'
POOL_ID='us-east-1_zzzzz'
CLIENT_ID = '12xxxxxxxxxxxxxxxxxxxxxxx'
CLIENT_SECRET = 'secreeeeet'
os.environ["AWS_DEFAULT_REGION"] = "<region>"

aws = AWSSRP(username=USERNAME, password=PASSWORD, pool_id=POOL_ID,
client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
tokens = aws.authenticate_user()
id_token = tokens['AuthenticationResult']['IdToken']
refresh_token = tokens['AuthenticationResult']['RefreshToken']
access_token = tokens['AuthenticationResult']['AccessToken']
token_type = tokens['AuthenticationResult']['TokenType']

REFRESH_TOKEN_AUTH & REFRESH_TOKEN

Cette mĂ©thode sera toujours valide (elle ne peut pas ĂȘtre dĂ©sactivĂ©e) mais vous devez avoir un jeton de rafraĂźchissement valide.

aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'
Code pour rafraĂźchir ```python import boto3 import botocore import hmac import hashlib import base64

client_id = “” token = ‘’

boto_client = boto3.client(‘cognito-idp’, region_name=‘’)

def refresh(client_id, refresh_token): try: return boto_client.initiate_auth( ClientId=client_id, AuthFlow=‘REFRESH_TOKEN_AUTH’, AuthParameters={ ‘REFRESH_TOKEN’: refresh_token } ) except botocore.exceptions.ClientError as e: return e.response

print(refresh(client_id, token))

</details>

### CUSTOM_AUTH

Dans ce cas, l'**authentification** va ĂȘtre effectuĂ©e par l'**exĂ©cution d'une fonction lambda**.

## Sécurité supplémentaire

### Sécurité avancée

Par dĂ©faut, c'est dĂ©sactivĂ©, mais si activĂ©, Cognito pourrait ĂȘtre capable de **dĂ©tecter les prises de contrĂŽle de compte**. Pour minimiser la probabilitĂ©, vous devriez vous connecter depuis un **rĂ©seau Ă  l'intĂ©rieur de la mĂȘme ville, en utilisant le mĂȘme agent utilisateur** (et l'IP si c'est possible)**.**

### **MFA Se souvenir de l'appareil**

Si l'utilisateur se connecte depuis le mĂȘme appareil, la MFA pourrait ĂȘtre contournĂ©e, essayez donc de vous connecter depuis le mĂȘme navigateur avec les mĂȘmes mĂ©tadonnĂ©es (IP ?) pour essayer de contourner la protection MFA.

## RĂŽles IAM des groupes de User Pool

Il est possible d'ajouter des **utilisateurs aux groupes de User Pool** qui sont liés à un **rÎle IAM**.\
De plus, des **utilisateurs** peuvent ĂȘtre assignĂ©s Ă  **plus d'un groupe avec diffĂ©rents rĂŽles IAM** attachĂ©s.

Notez que mĂȘme si un groupe est Ă  l'intĂ©rieur d'un groupe avec un rĂŽle IAM attachĂ©, pour pouvoir accĂ©der aux identifiants IAM de ce groupe, il est nĂ©cessaire que le **User Pool soit approuvĂ© par un Identity Pool** (et connaĂźtre les dĂ©tails de cet Identity Pool).

Un autre requis pour obtenir le **rĂŽle IAM indiquĂ© dans l'IdToken** lorsqu'un utilisateur est authentifiĂ© dans le User Pool (`aws cognito-idp initiate-auth...`) est que le **fournisseur d'authentification Identity Provider** doit indiquer que le **rĂŽle doit ĂȘtre sĂ©lectionnĂ© Ă  partir du token.**

<figure><img src="../../../../images/image (250).png" alt=""><figcaption></figcaption></figure>

Les **rÎles** auxquels un utilisateur a accÚs sont **dans le `IdToken`**, et un utilisateur peut **sélectionner quel rÎle il aimerait obtenir des identifiants** avec le **`--custom-role-arn`** de `aws cognito-identity get-credentials-for-identity`.\
Cependant, si l'**option par défaut** est celle **configurée** (`use default role`), et que vous essayez d'accéder à un rÎle à partir de l'IdToken, vous obtiendrez une **erreur** (c'est pourquoi la configuration précédente est nécessaire) :

An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN.

> [!WARNING]
> Notez que le rĂŽle attribuĂ© Ă  un **User Pool Group** doit ĂȘtre **accessible par le fournisseur d'identitĂ©** qui **fait confiance au User Pool** (car les **informations d'identification de session du rĂŽle IAM vont ĂȘtre obtenues Ă  partir de celui-ci**).
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:2361092e-9db6-a876-1027-10387c9de439"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}js

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks