AWS - IAM, Identity Center & SSO Enum

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

IAM

Puedes encontrar una descripción de IAM en:

pageAWS - Basic Information

Enumeración

Permisos principales necesarios:

  • iam:ListPolicies, iam:GetPolicy y iam:GetPolicyVersion

  • iam:ListRoles

  • iam:ListUsers

  • iam:ListGroups

  • iam:ListGroupsForUser

  • iam:ListAttachedUserPolicies

  • iam:ListAttachedRolePolicies

  • iam:ListAttachedGroupPolicies

  • iam:ListUserPolicies y iam:GetUserPolicy

  • iam:ListGroupPolicies y iam:GetGroupPolicy

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

Fuerza bruta de permisos

Si estás interesado en tus propios permisos pero no tienes acceso para consultar IAM, siempre puedes probar a fuerza bruta.

bf-aws-permissions

La herramienta bf-aws-permissions es simplemente un script de bash que se ejecutará utilizando el perfil indicado para todas las acciones list*, describe*, get* que pueda encontrar utilizando los mensajes de ayuda de la CLI de aws 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 otros principios) 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 están siendo otorgados por un rol AWS administrado (y no por uno personalizado). Puedes usar la herramienta aws-Perms2ManagedRoles para verificar todos los roles administrados de AWS que otorgan los permisos que descubriste que tienes.

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

Es posible "saber" si los permisos que tienes son otorgados por un rol administrado de AWS si ves que tienes permisos sobre servicios que no se utilizan, por ejemplo.

Cloudtrail2IAM

CloudTrail2IAM es una herramienta en Python que analiza registros de AWS CloudTrail para extraer y resumir acciones realizadas por cualquier persona o solo 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]

Si encuentras archivos .tfstate (archivos de estado de Terraform) o archivos de CloudFormation (generalmente archivos yaml ubicados dentro de un bucket con el prefijo cf-templates), también puedes leerlos para encontrar la configuración de aws y ver qué permisos se han asignado a quién.

enumerar-iam

Para usar la herramienta https://github.com/andresriancho/enumerate-iam primero necesitas descargar todos los puntos finales de la API de AWS, a partir de los cuales el script generate_bruteforce_tests.py obtendrá todos los puntos finales "list_", "describe_" y "get_". Y finalmente, intentará acceder a ellos con las credenciales proporcionadas e indicará si funcionó.

(En mi experiencia, la herramienta se cuelga en algún momento, consulta esta corrección para intentar solucionarlo).

En mi experiencia, esta herramienta es similar a la anterior pero funciona peor y verifica 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 podrías usar la herramienta weirdAAL. Esta herramienta verificará varias operaciones comunes en varios servicios comunes (verificará algunos permisos de enumeración y también algunos permisos de escalada de privilegios). Pero solo verificará las comprobaciones codificadas (la única forma de verificar más cosas es codificando 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 endurecimiento para BF de permisos

# 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

<TuHerramienta>

Ninguna de las herramientas anteriores es capaz de verificar cerca de todos los permisos, ¡así que si conoces una mejor herramienta envía un PR!

Acceso sin autenticación

pageAWS - IAM & STS Unauthenticated Enum

Escalada de privilegios

En la siguiente página puedes verificar cómo abusan de los permisos de IAM para escalar privilegios:

pageAWS - IAM Privesc

Post Explotación de IAM

pageAWS - IAM Post Exploitation

Persistencia de IAM

pageAWS - IAM Persistence

Centro de Identidad IAM

Puedes encontrar una descripción del Centro de Identidad IAM en:

pageAWS - Basic Information

Conectar a través de 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 principales elementos del Centro de Identidad son:

  • Usuarios y grupos

  • Conjuntos de Permisos: Tienen políticas adjuntas

  • Cuentas de AWS

Luego, se crean relaciones para que los usuarios/grupos tengan Conjuntos de Permisos sobre la Cuenta de AWS.

Tenga en cuenta que hay 3 formas de adjuntar políticas a un Conjunto de Permisos. Adjuntando políticas administradas por AWS, políticas administradas por el cliente (estas políticas deben crearse en todas las cuentas que el Conjunto de Permisos está afectando) y políticas en línea (definidas allí).

# 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 a través de 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 se puede utilizar 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 ser leídas y utilizadas desde allí.

Además, más credenciales pueden ser almacenadas en la carpeta $HOME/.aws/cli/cache. Este directorio de caché se utiliza principalmente cuando se está trabajando con perfiles de AWS CLI que utilizan 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

Acceso no autenticado

pageAWS - Identity Center & SSO Unauthenticated Enum

Escalada de privilegios

pageAWS - SSO & identitystore Privesc

Post Explotación

pageAWS - SSO & identitystore Post Exploitation

Persistencia

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 y asignarle permisos y establecer en él un usuario controlado

  • Dar permisos adicionales a un usuario o grupo controlado

  • Por defecto, solo los usuarios con permisos del Cuenta de Gestión podrán acceder y controlar el Centro de Identidad IAM.

Sin embargo, es posible a través de Administrador Delegado permitir a usuarios de una cuenta diferente gestionarlo. No tendrán exactamente los mismos permisos, pero podrán realizar actividades de gestión.

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización