AWS - IAM, Identity Center & SSO Enum

Support HackTricks

IAM

Puedes encontrar una descripción de IAM en:

AWS - Basic Information

Enumeration

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 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

Fuerza Bruta de Permisos

Si estás interesado en tus propios permisos pero no tienes acceso para consultar IAM, siempre podrías forzarlos.

bf-aws-permissions

La herramienta bf-aws-permissions es solo un script de bash que ejecutará, utilizando el perfil indicado, todas las acciones list*, describe*, get* que pueda encontrar usando los mensajes de ayuda de 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 otros principales) 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 piensas que están siendo otorgados por un rol gestionado de AWS (y no por uno personalizado). Puedes usar la herramienta aws-Perms2ManagedRoles para verificar todos los roles gestionados 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 de Python que analiza los registros de AWS CloudTrail para extraer y resumir acciones realizadas por todos 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 (que 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 averiguar 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 puntos finales de la API de AWS, de los cuales el script generate_bruteforce_tests.py obtendrá todos los puntos finales de "list_", "describe_" y "get_". Y finalmente, intentará acceder a ellos con las credenciales dadas e indicar si funcionó.

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

En mi experiencia, esta herramienta es como 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 puedes 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 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

<YourTool>

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

Acceso No Autenticado

AWS - IAM & STS Unauthenticated Enum

Escalación de Privilegios

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

AWS - IAM Privesc

Post Explotación de IAM

AWS - IAM Post Exploitation

Persistencia de IAM

AWS - IAM Persistence

Centro de Identidad de IAM

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

AWS - 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 elementos principales 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 ser creadas 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 alguna 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, se pueden almacenar más credenciales en la carpeta $HOME/.aws/cli/cache. Este directorio de caché se utiliza principalmente cuando estás 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

AWS - Identity Center & SSO Unauthenticated Enum

Escalación de Privilegios

AWS - SSO & identitystore Privesc

Post Explotación

AWS - 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
  • Crea un grupo y asígnale permisos y establece un usuario controlado en él

  • Da permisos adicionales a un usuario o grupo controlado

  • Por defecto, solo los usuarios con permisos de la 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 que usuarios de una cuenta diferente lo gestionen. No tendrán exactamente los mismos permisos, pero podrán realizar actividades de gestión.

Support HackTricks

Last updated