AWS - IAM, Identity Center & SSO Enum

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert Red Team AWS de HackTricks)!

Autres façons de soutenir HackTricks:

IAM

Vous pouvez trouver une description de IAM dans:

pageAWS - Basic Information

Énumération

Permissions principales nécessaires:

  • iam:ListPolicies, iam:GetPolicy et iam:GetPolicyVersion

  • iam:ListRoles

  • iam:ListUsers

  • iam:ListGroups

  • iam:ListGroupsForUser

  • iam:ListAttachedUserPolicies

  • iam:ListAttachedRolePolicies

  • iam:ListAttachedGroupPolicies

  • iam:ListUserPolicies et iam:GetUserPolicy

  • iam:ListGroupPolicies et iam:GetGroupPolicy

  • iam:ListRolePolicies et iam: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 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

Brute Force des autorisations

Si vous êtes intéressé par vos propres autorisations mais que vous n'avez pas accès pour interroger IAM, vous pouvez toujours les brute-forcer.

bf-aws-permissions

L'outil bf-aws-permissions est simplement un script bash qui s'exécutera en utilisant le profil indiqué pour toutes les actions list*, describe*, get* qu'il peut trouver en utilisant les messages d'aide de la CLI aws et retourner 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 autorisations actuelles (ou celles d'autres principaux) si vous avez l'autorisation iam:SimulatePrincipalPolicy.

# Ask for permissions
python3 aws_permissions_checker.py --profile <AWS_PROFILE> [--arn <USER_ARN>]

Perms2ManagedPolicies

Si vous avez trouvé certaines autorisations que votre utilisateur possède, et que vous pensez qu'elles sont accordées par un rôle AWS géré (et non par un rôle personnalisé), vous pouvez utiliser l'outil aws-Perms2ManagedRoles pour vérifier tous les rôles gérés par AWS qui accordent les autorisations que vous avez découvertes.

# Run example with my profile
python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt

Il est possible de "savoir" si les autorisations que vous avez sont accordées par un rôle géré par AWS si vous constatez que vous avez des autorisations sur des services qui ne sont pas utilisés, par exemple.

Cloudtrail2IAM

CloudTrail2IAM est un outil Python qui analyse les journaux AWS CloudTrail pour extraire et résumer les actions effectuées par tout le monde ou juste un utilisateur ou un rôle spécifique. L'outil va analyser chaque journal cloudtrail du 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]

Si vous trouvez des fichiers .tfstate (fichiers d'état Terraform) ou des fichiers CloudFormation (ceux-ci sont généralement des fichiers yaml situés dans un compartiment 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.

énumérer-iam

Pour utiliser l'outil https://github.com/andresriancho/enumerate-iam, vous devez d'abord télécharger tous les points de terminaison API AWS, à partir desquels le script generate_bruteforce_tests.py obtiendra tous les points de terminaison "list_", "describe_" et "get_". Enfin, il essaiera de y accéder avec les informations d'identification fournies et indiquera si cela a fonctionné.

(Dans mon expérience, l'outil se bloque à un moment donné, consultez cette correction pour essayer de résoudre ce problème).

Dans mon expérience, cet outil est similaire au 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 pourriez également utiliser l'outil weirdAAL. Cet outil vérifiera plusieurs opérations courantes sur plusieurs services courants (il vérifiera certaines autorisations d'énumération et également certaines autorisations de privilèges). Mais il ne vérifiera que les vérifications codées (le seul moyen de vérifier plus de choses 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 renforcement pour BF permissions

# 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

<VotreOutil>

Aucun des outils précédents n'est capable de vérifier la quasi-totalité des autorisations, donc si vous connaissez un meilleur outil, envoyez une PR!

Accès non authentifié

pageAWS - IAM & STS Unauthenticated Enum

Élévation de privilèges

Sur la page suivante, vous pouvez vérifier comment abuser des autorisations IAM pour escalader les privilèges:

pageAWS - IAM Privesc

Post-exploitation IAM

pageAWS - IAM Post Exploitation

Persistance IAM

pageAWS - IAM Persistence

Centre d'identité IAM

Vous pouvez trouver une description du Centre d'identité IAM dans:

pageAWS - Basic Information

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 principaux éléments du Centre d'Identité sont :

  • Utilisateurs et groupes

  • Ensembles de permissions : Ont des politiques attachées

  • Comptes AWS

Ensuite, des relations sont créées pour que les utilisateurs/groupes aient des ensembles de permissions sur le compte AWS.

Notez qu'il existe 3 façons d'attacher des politiques à un ensemble de permissions. Attacher des politiques gérées par AWS, des politiques gérées par le client (ces politiques doivent être créées dans tous les comptes sur lesquels l'ensemble de permissions a un impact), et des politiques intégrées (définies à cet endroit).

# 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 à l'intérieur du 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 de SSO est utilisé pour accéder à certaines informations, les informations d'identification sont mises en cache dans un fichier à l'intérieur du dossier $HOME/.aws/sso/cache. Par conséquent, elles peuvent être lues et utilisées à partir de là.

De plus, d'autres informations d'identification peuvent être stockées 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 informations d'identification d'utilisateur IAM ou assument des rôles 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é

pageAWS - Identity Center & SSO Unauthenticated Enum

Élévation de privilèges

pageAWS - SSO & identitystore Privesc

Post-exploitation

pageAWS - 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éez un groupe et attribuez-lui des autorisations, puis définissez un utilisateur contrôlé.

  • Accordez des autorisations supplémentaires à un utilisateur ou groupe contrôlé.

  • Par défaut, seuls les utilisateurs avec des autorisations provenant du compte de gestion pourront accéder et contrôler le Centre d'identité IAM.

Cependant, il est possible via l'Administrateur délégué d'autoriser les utilisateurs d'un compte différent à le gérer. Ils n'auront pas exactement les mêmes autorisations, mais ils pourront effectuer des activités de gestion.

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks :

Dernière mise à jour