AWS - IAM, Identity Center & SSO Enumeración
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
IAM
Puedes encontrar una descripción de IAM en:
Enumeración
Permisos principales necesarios:
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
Confirmación sigilosa de permisos mediante fallos intencionales
Cuando las APIs List* o las simulator APIs están bloqueadas, puedes confirmar permisos de modificación sin crear recursos duraderos forzando errores de validación predecibles. AWS aún evalúa IAM antes de devolver estos errores, por lo que ver el error demuestra que el solicitante tiene la acción:
# 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
Estos intentos aún generan eventos de CloudTrail (con errorCode establecido) pero evitan dejar nuevos artefactos de IAM, lo que los hace útiles para una validación de permisos de bajo ruido durante el reconocimiento interactivo.
Permissions Brute Force
Si te interesan tus propios permisos pero no tienes acceso para consultar IAM, siempre puedes recurrir al brute-force.
bf-aws-permissions
La herramienta bf-aws-permissions es simplemente un script bash que ejecutará, usando el perfil indicado, todas las acciones list*, describe*, get* que pueda encontrar utilizando los mensajes de ayuda del aws cli y devolverá las ejecuciones exitosas.
# Bruteforce permissions
bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt
bf-aws-perms-simulate
La herramienta bf-aws-perms-simulate puede encontrar tus permisos actuales (o los de otras identidades) si tienes el permiso iam:SimulatePrincipalPolicy
# Ask for permissions
python3 aws_permissions_checker.py --profile <AWS_PROFILE> [--arn <USER_ARN>]
Perms2ManagedPolicies
Si encontraste algunos permisos que tiene tu usuario, y crees que se le están otorgando por un rol administrado de AWS (y no por uno personalizado). Puedes usar la herramienta aws-Perms2ManagedRoles para comprobar todos los roles administrados de AWS que conceden los permisos que descubriste que tienes.
# Run example with my profile
python3 aws-Perms2ManagedPolicies.py --profile myadmin --permissions-file example-permissions.txt
Warning
Es posible “saber” si los permisos que tienes son concedidos por un rol administrado por AWS si ves que, por ejemplo, tienes permisos sobre servicios que no se utilizan.
Cloudtrail2IAM
CloudTrail2IAM es una herramienta en Python que analiza los registros de AWS CloudTrail para extraer y resumir acciones realizadas por todos o solo por un usuario o rol específico. La herramienta analizará cada registro de CloudTrail del bucket indicado.
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 encuentras .tfstate (archivos de estado de Terraform) o archivos de CloudFormation (estos suelen ser archivos yaml ubicados dentro de un bucket con el prefijo cf-templates), también puedes leerlos para encontrar la configuración de aws y saber qué permisos se han asignado a quién.
enumerate-iam
Para usar la herramienta https://github.com/andresriancho/enumerate-iam primero necesitas descargar todos los endpoints de la API de AWS, a partir de esos el script generate_bruteforce_tests.py obtendrá todos los endpoints “list_”, “describe_”, and “get_”. Y finalmente, intentará acceder a ellos con las credenciales dadas y indicar si funcionó.
(En mi experiencia la herramienta se queda colgada en algún punto, checkout this fix para intentar solucionarlo).
Warning
En mi experiencia esta herramienta es como la anterior pero funciona peor y comprueba menos permisos
# 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
También puedes usar la herramienta weirdAAL. Esta herramienta comprobará varias operaciones comunes en varios servicios comunes (verificará algunos permisos de enumeration y también algunos permisos de privesc). Pero solo realizará las comprobaciones codificadas (la única manera de comprobar más cosas es escribir más pruebas).
# 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']
Herramientas de hardening para permisos 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>
Ninguna de las herramientas anteriores es capaz de comprobar casi todos los permisos, así que si conoces una mejor herramienta, ¡envía un PR!
Acceso no autenticado
AWS - IAM & STS Unauthenticated Enum
Escalada de privilegios
En la página siguiente puedes ver cómo abusar de los permisos de IAM para escalar privilegios:
IAM Post Exploitation
IAM Persistence
IAM Identity Center
Puedes encontrar una descripción de IAM Identity Center en:
Conectar vía SSO con 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
Enumeración
Los elementos principales del Identity Center son:
- Usuarios y grupos
- Permission Sets: Tienen políticas adjuntas
- AWS Accounts
Luego se crean relaciones para que usuarios/grupos tengan Permission Sets sobre AWS Account.
Note
Ten en cuenta que existen 3 formas de adjuntar políticas a un Permission Set: AWS managed policies, Customer managed policies (estas deben crearse en todas las cuentas que el Permission Set afecta), e inline policies (definidas en el propio Permission Set).
# 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>
Enumeración local
Es posible crear dentro de la carpeta $HOME/.aws el archivo config para configurar perfiles que son accesibles vía SSO, por ejemplo:
[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
Esta configuración puede usarse con los comandos:
# Login in ms-sso-profile
aws sso login --profile my-sso-profile
# Use dependent-profile
aws s3 ls --profile dependent-profile
Cuando se utiliza un perfil de SSO para acceder a cierta información, las credenciales se almacenan en caché en un archivo dentro de la carpeta $HOME/.aws/sso/cache. Por lo tanto, pueden leerse y utilizarse desde allí.
Además, más credenciales pueden almacenarse en la carpeta $HOME/.aws/cli/cache. Este directorio de caché se utiliza principalmente cuando estás trabajando con perfiles de AWS CLI que usan credenciales de usuario IAM o asumen roles a través de IAM (sin SSO). Ejemplo de configuración:
[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456
Unauthenticated Access
AWS - Identity Center & SSO Unauthenticated Enum
Privilege Escalation
AWS - SSO & identitystore Privesc
Post Exploitation
AWS - SSO & identitystore Post Exploitation
Persistence
Crear un usuario y asignarle permisos
# 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
- Crear un grupo, asignarle permisos y establecer en él un usuario controlado
- Dar permisos adicionales a un usuario controlado o a un grupo
- Por defecto, solo los usuarios con permisos de la Management Account podrán acceder y controlar el IAM Identity Center.
Sin embargo, es posible, a través de Delegate Administrator, permitir que usuarios de una cuenta diferente lo administren. No tendrán exactamente los mismos permisos, pero podrán realizar management activities.
Tip
Aprende y practica AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Apoya a HackTricks
- Consulta los subscription plans!
- Únete al 💬 Discord group o al telegram group o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud github repos.
HackTricks Cloud

