AWS - IAM, Identity Center & SSO Énumération
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
- Consultez les subscription plans!
- Rejoignez le 💬 Discord group ou le telegram group ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
IAM
Vous pouvez trouver une description d’IAM dans :
Énumération
Permissions principales requises :
iam:ListPolicies,iam:GetPolicyandiam:GetPolicyVersioniam:ListRolesiam:ListUsersiam:ListGroupsiam:ListGroupsForUseriam:ListAttachedUserPoliciesiam:ListAttachedRolePoliciesiam:ListAttachedGroupPoliciesiam:ListUserPoliciesandiam:GetUserPolicyiam:ListGroupPoliciesandiam:GetGroupPolicyiam:ListRolePoliciesandiam:GetRolePolicy
# All IAMs
## Retrieves information about all IAM users, groups, roles, and policies
## in your Amazon Web Services account, including their relationships to
## one another. Use this operation to obtain a snapshot of the configura-
## tion of IAM permissions (users, groups, roles, and policies) in your
## account.
aws iam get-account-authorization-details
# List users
aws iam get-user #Get current user information
aws iam list-users
aws iam list-ssh-public-keys #User keys for CodeCommit
aws iam get-ssh-public-key --user-name <username> --ssh-public-key-id <id> --encoding SSH #Get public key with metadata
aws iam list-service-specific-credentials #Get special permissions of the IAM user over specific services
aws iam get-user --user-name <username> #Get metadata of user, included permissions boundaries
aws iam list-access-keys #List created access keys
## inline policies
aws iam list-user-policies --user-name <username> #Get inline policies of the user
aws iam get-user-policy --user-name <username> --policy-name <policyname> #Get inline policy details
## attached policies
aws iam list-attached-user-policies --user-name <username> #Get policies of user, it doesn't get inline policies
# List groups
aws iam list-groups #Get groups
aws iam list-groups-for-user --user-name <username> #Get groups of a user
aws iam get-group --group-name <name> #Get group name info
## inline policies
aws iam list-group-policies --group-name <username> #Get inline policies of the group
aws iam get-group-policy --group-name <username> --policy-name <policyname> #Get an inline policy info
## attached policies
aws iam list-attached-group-policies --group-name <name> #Get policies of group, it doesn't get inline policies
# List roles
aws iam list-roles #Get roles
aws iam get-role --role-name <role-name> #Get role
## inline policies
aws iam list-role-policies --role-name <name> #Get inline policies of a role
aws iam get-role-policy --role-name <name> --policy-name <name> #Get inline policy details
## attached policies
aws iam list-attached-role-policies --role-name <role-name> #Get policies of role, it doesn't get inline policies
# List policies
aws iam list-policies [--only-attached] [--scope Local]
aws iam list-policies-granting-service-access --arn <identity> --service-namespaces <svc> # Get list of policies that give access to the user to the service
## Get policy content
aws iam get-policy --policy-arn <policy_arn>
aws iam list-policy-versions --policy-arn <arn>
aws iam get-policy-version --policy-arn <arn:aws:iam::975426262029:policy/list_apigateways> --version-id <VERSION_X>
# Enumerate providers
aws iam list-saml-providers
aws iam get-saml-provider --saml-provider-arn <ARN>
aws iam list-open-id-connect-providers
aws iam get-open-id-connect-provider --open-id-connect-provider-arn <ARN>
# Password Policy
aws iam get-account-password-policy
# MFA
aws iam list-mfa-devices
aws iam list-virtual-mfa-devices
Confirmation furtive des permissions via des échecs intentionnels
Lorsque List* ou les API du simulateur sont bloquées, vous pouvez confirmer les permissions de modification sans créer de ressources durables en provoquant des erreurs de validation prévisibles. AWS évalue toujours IAM avant de renvoyer ces erreurs, donc l’apparition de l’erreur prouve que l’appelant est autorisé à exécuter l’action :
# Confirm iam:CreateUser without creating a new principal (fails only after authz)
aws iam create-user --user-name <existing_user> # -> EntityAlreadyExistsException
# Confirm iam:CreateLoginProfile while learning password policy requirements
aws iam create-login-profile --user-name <target_user> --password lower --password-reset-required # -> PasswordPolicyViolationException
Ces tentatives génèrent toujours des événements CloudTrail (avec errorCode défini) mais évitent de laisser de nouveaux artefacts IAM, ce qui les rend utiles pour une validation discrète des permissions pendant l’interactive recon.
Permissions Brute Force
Si vous êtes intéressé par vos propres permissions mais que vous n’avez pas accès pour interroger IAM, vous pouvez toujours effectuer un brute-force.
bf-aws-permissions
L’outil bf-aws-permissions est simplement un script bash qui exécutera, en utilisant le profile indiqué, toutes les actions list*, describe*, get* qu’il peut trouver en se basant sur les messages d’aide du aws cli et retournera les exécutions réussies.
# Bruteforce permissions
bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt
bf-aws-perms-simulate
L’outil bf-aws-perms-simulate peut trouver vos permissions actuelles (ou celles d’autres principals) si vous disposez de l’autorisation iam:SimulatePrincipalPolicy
# Ask for permissions
python3 aws_permissions_checker.py --profile <AWS_PROFILE> [--arn <USER_ARN>]
Perms2ManagedPolicies
Si vous avez trouvé certaines permissions dont dispose votre utilisateur, et que vous pensez qu’elles sont accordées par un managed AWS role (et non par un rôle personnalisé). Vous pouvez utiliser l’outil aws-Perms2ManagedRoles pour vérifier tous les AWS managed roles qui accordent les permissions que vous avez découvertes.
# Run example with my profile
python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt
Warning
Il est possible de “savoir” si les permissions dont vous disposez sont accordées par un rôle géré par AWS si vous constatez, par exemple, que vous avez des permissions sur des services qui ne sont pas utilisés.
Cloudtrail2IAM
CloudTrail2IAM est un outil Python qui analyse les logs AWS CloudTrail pour extraire et résumer les actions effectuées par tout le monde ou juste un utilisateur ou rôle spécifique. L’outil va parser chaque cloudtrail log depuis le bucket indiqué.
git clone https://github.com/carlospolop/Cloudtrail2IAM
cd Cloudtrail2IAM
pip install -r requirements.txt
python3 cloudtrail2IAM.py --prefix PREFIX --bucket_name BUCKET_NAME --profile PROFILE [--filter-name FILTER_NAME] [--threads THREADS]
Warning
Si vous trouvez des .tfstate (Terraform state files) ou des fichiers CloudFormation (ce sont généralement des fichiers yaml situés dans un bucket avec le préfixe cf-templates), vous pouvez également les lire pour trouver la configuration aws et découvrir quelles autorisations ont été attribuées à qui.
enumerate-iam
To use the tool https://github.com/andresriancho/enumerate-iam you first need to download all the API AWS endpoints, from those the script generate_bruteforce_tests.py will get all the “list_”, “describe_”, and “get_” endpoints. And finally, it will try to access them with the given credentials and indicate if it worked.
(D’après mon expérience l’outil se bloque à un moment donné, checkout this fix pour essayer de corriger cela).
Warning
D’après mon expérience cet outil est comme le précédent mais fonctionne moins bien et vérifie moins d’autorisations
# Install tool
git clone git@github.com:andresriancho/enumerate-iam.git
cd enumerate-iam/
pip install -r requirements.txt
# Download API endpoints
cd enumerate_iam/
git clone https://github.com/aws/aws-sdk-js.git
python3 generate_bruteforce_tests.py
rm -rf aws-sdk-js
cd ..
# Enumerate permissions
python3 enumerate-iam.py --access-key ACCESS_KEY --secret-key SECRET_KEY [--session-token SESSION_TOKEN] [--region REGION]
weirdAAL
Vous pouvez également utiliser l’outil weirdAAL. Cet outil vérifiera plusieurs opérations courantes sur plusieurs services courants (il vérifiera certaines permissions d’enumeration et aussi certaines permissions privesc). Mais il ne fera que les vérifications codées (le seul moyen d’en effectuer d’autres est de coder plus de tests).
# Install
git clone https://github.com/carnal0wnage/weirdAAL.git
cd weirdAAL
python3 -m venv weirdAAL
source weirdAAL/bin/activate
pip3 install -r requirements.txt
# Create a .env file with aws credentials such as
[default]
aws_access_key_id = <insert key id>
aws_secret_access_key = <insert secret key>
# Setup DB
python3 create_dbs.py
# Invoke it
python3 weirdAAL.py -m ec2_describe_instances -t ec2test # Just some ec2 tests
python3 weirdAAL.py -m recon_all -t MyTarget # Check all permissions
# You will see output such as:
# [+] elbv2 Actions allowed are [+]
# ['DescribeLoadBalancers', 'DescribeAccountLimits', 'DescribeTargetGroups']
Outils de durcissement pour les permissions BF
# Export env variables
./index.js --console=text --config ./config.js --json /tmp/out-cloudsploit.json
# Filter results removing unknown
jq 'map(select(.status | contains("UNKNOWN") | not))' /tmp/out-cloudsploit.json | jq 'map(select(.resource | contains("N/A") | not))' > /tmp/out-cloudsploit-filt.json
# Get services by regions
jq 'group_by(.region) | map({(.[0].region): ([map((.resource | split(":"))[2]) | unique])})' ~/Desktop/pentests/cere/greybox/core-dev-dev-cloudsploit-filtered.json
<YourTool>
Aucun des outils précédents n’est capable de vérifier la quasi-totalité des permissions, donc si vous connaissez un meilleur outil, envoyez un PR !
Accès non authentifié
AWS - IAM & STS Unauthenticated Enum
Escalade de privilèges
Sur la page suivante, vous pouvez voir comment abuser des permissions IAM pour escalader les privilèges :
IAM Post Exploitation
IAM Persistence
IAM Identity Center
Vous pouvez trouver une description de IAM Identity Center dans :
Se connecter via SSO avec CLI
# Connect with sso via CLI aws configure sso
aws configure sso
[profile profile_name]
sso_start_url = https://subdomain.awsapps.com/start/
sso_account_id = <account_numbre>
sso_role_name = AdministratorAccess
sso_region = us-east-1
Énumération
Les éléments principaux de l’Identity Center sont :
- Utilisateurs et groupes
- Permission Sets : ont des policies attachées
- AWS Accounts
Ensuite, des relations sont créées pour que les utilisateurs/groupes disposent de Permission Sets sur des AWS Accounts.
Note
Notez qu’il existe 3 manières d’attacher des policies à un Permission Set. Attacher des AWS managed policies, des Customer managed policies (ces policies doivent être créées dans tous les accounts que le Permission Set affecte), et des inline policies (définies à l’intérieur).
# Check if IAM Identity Center is used
aws sso-admin list-instances
# Get Permissions sets. These are the policies that can be assigned
aws sso-admin list-permission-sets --instance-arn <instance-arn>
aws sso-admin describe-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## Get managed policies of a permission set
aws sso-admin list-managed-policies-in-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## Get inline policies of a permission set
aws sso-admin get-inline-policy-for-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## Get customer managed policies of a permission set
aws sso-admin list-customer-managed-policy-references-in-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## Get boundaries of a permission set
aws sso-admin get-permissions-boundary-for-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## List accounts a permission set is affecting
aws sso-admin list-accounts-for-provisioned-permission-set --instance-arn <instance-arn> --permission-set-arn <perm-set-arn>
## List principals given a permission set in an account
aws sso-admin list-account-assignments --instance-arn <instance-arn> --permission-set-arn <perm-set-arn> --account-id <account_id>
# Get permissions sets affecting an account
aws sso-admin list-permission-sets-provisioned-to-account --instance-arn <instance-arn> --account-id <account_id>
# List users & groups from the identity store
aws identitystore list-users --identity-store-id <store-id>
aws identitystore list-groups --identity-store-id <store-id>
## Get members of groups
aws identitystore list-group-memberships --identity-store-id <store-id> --group-id <group-id>
## Get memberships or a user or a group
aws identitystore list-group-memberships-for-member --identity-store-id <store-id> --member-id <member-id>
Énumération locale
Il est possible de créer dans le dossier $HOME/.aws le fichier config pour configurer des profils accessibles via SSO, par exemple :
[default]
region = us-west-2
output = json
[profile my-sso-profile]
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_region = us-west-2
sso_account_id = 123456789012
sso_role_name = MySSORole
region = us-west-2
output = json
[profile dependent-profile]
role_arn = arn:aws:iam::<acc-id>:role/ReadOnlyRole
source_profile = Hacktricks-Admin
Cette configuration peut être utilisée avec les commandes :
# Login in ms-sso-profile
aws sso login --profile my-sso-profile
# Use dependent-profile
aws s3 ls --profile dependent-profile
Lorsqu’un profil SSO est utilisé pour accéder à certaines informations, les identifiants sont mis en cache dans un fichier à l’intérieur du dossier $HOME/.aws/sso/cache. Ils peuvent donc être lus et utilisés à partir de cet emplacement.
De plus, d’autres identifiants peuvent être stockés dans le dossier $HOME/.aws/cli/cache. Ce répertoire de cache est principalement utilisé lorsque vous travaillez avec des profils AWS CLI qui utilisent des identifiants d’utilisateur IAM ou assume roles via IAM (sans SSO). Exemple de configuration:
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456
Accès non authentifié
AWS - Identity Center & SSO Unauthenticated Enum
Élévation de privilèges
AWS - SSO & identitystore Privesc
Post-exploitation
AWS - SSO & identitystore Post Exploitation
Persistance
Créer un utilisateur et lui attribuer des permissions
# Create user identitystore:CreateUser
aws identitystore create-user --identity-store-id <store-id> --user-name privesc --display-name privesc --emails Value=sdkabflvwsljyclpma@tmmbt.net,Type=Work,Primary=True --name Formatted=privesc,FamilyName=privesc,GivenName=privesc
## After creating it try to login in the console using the selected username, you will receive an email with the code and then you will be able to select a password
- Créer un groupe, lui attribuer des permissions et y affecter un utilisateur contrôlé
- Accorder des permissions supplémentaires à un utilisateur contrôlé ou à un groupe
- Par défaut, seuls les utilisateurs disposant de permissions du Management Account pourront accéder et contrôler l’IAM Identity Center.
Cependant, il est possible, via Delegate Administrator, d’autoriser des utilisateurs d’un autre compte à le gérer. Ils n’auront pas exactement les mêmes permissions, mais ils pourront effectuer management activities.
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
- Consultez les subscription plans!
- Rejoignez le 💬 Discord group ou le telegram group ou suivez-nous sur Twitter 🐦 @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

