AWS - IAM, Identity Center & SSO Enum

Support HackTricks

IAM

Você pode encontrar uma descrição do IAM em:

AWS - Basic Information

Enumeração

Principais permissões necessárias:

  • iam:ListPolicies, iam:GetPolicy e iam:GetPolicyVersion

  • iam:ListRoles

  • iam:ListUsers

  • iam:ListGroups

  • iam:ListGroupsForUser

  • iam:ListAttachedUserPolicies

  • iam:ListAttachedRolePolicies

  • iam:ListAttachedGroupPolicies

  • iam:ListUserPolicies e iam:GetUserPolicy

  • iam:ListGroupPolicies e iam:GetGroupPolicy

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

Força Bruta de Permissões

Se você estiver interessado em suas próprias permissões, mas não tiver acesso para consultar o IAM, você sempre pode forçá-las.

bf-aws-permissions

A ferramenta bf-aws-permissions é apenas um script bash que executará, usando o perfil indicado, todas as ações list*, describe*, get* que puder encontrar usando as mensagens de ajuda do cli aws e retornará as execuções bem-sucedidas.

# Bruteforce permissions
bash bf-aws-permissions.sh -p default > /tmp/bf-permissions-verbose.txt

bf-aws-perms-simulate

A ferramenta bf-aws-perms-simulate pode encontrar suas permissões atuais (ou as de outros principais) se você tiver a permissão iam:SimulatePrincipalPolicy

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

Perms2ManagedPolicies

Se você encontrou algumas permissões que seu usuário possui, e você acha que elas estão sendo concedidas por um papel gerenciado da AWS (e não por um personalizado). Você pode usar a ferramenta aws-Perms2ManagedRoles para verificar todos os papéis gerenciados da AWS que concedem as permissões que você descobriu que possui.

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

É possível "saber" se as permissões que você possui são concedidas por um papel gerenciado da AWS se você perceber que tem permissões sobre serviços que não são utilizados, por exemplo.

Cloudtrail2IAM

CloudTrail2IAM é uma ferramenta em Python que analisa logs do AWS CloudTrail para extrair e resumir ações realizadas por todos ou apenas um usuário ou papel específico. A ferramenta irá analisar cada log do cloudtrail do 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]

Se você encontrar arquivos .tfstate (arquivos de estado do Terraform) ou arquivos do CloudFormation (geralmente são arquivos yaml localizados dentro de um bucket com o prefixo cf-templates), você também pode lê-los para encontrar a configuração do aws e descobrir quais permissões foram atribuídas a quem.

enumerate-iam

Para usar a ferramenta https://github.com/andresriancho/enumerate-iam, você primeiro precisa baixar todos os endpoints da API AWS, a partir dos quais o script generate_bruteforce_tests.py obterá todos os endpoints "list_", "describe_" e "get_". E, finalmente, tentará acessá-los com as credenciais fornecidas e indicar se funcionou.

(Com base na minha experiência, a ferramenta trava em algum ponto, veja esta correção para tentar corrigir isso).

Na minha experiência, esta ferramenta é como a anterior, mas funciona pior e verifica menos permissões.

# 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

Você também pode usar a ferramenta weirdAAL. Esta ferramenta verificará várias operações comuns em vários serviços comuns (verificará algumas permissões de enumeração e também algumas permissões de privesc). Mas ela só verificará os testes codificados (a única maneira de verificar mais coisas é codificando mais testes).

# 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']

Ferramentas de Hardening para BF permissões

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

Nenhuma das ferramentas anteriores é capaz de verificar todas as permissões, então se você conhece uma ferramenta melhor, envie um PR!

Acesso Não Autenticado

AWS - IAM & STS Unauthenticated Enum

Escalação de Privilégios

Na página seguinte, você pode verificar como abusar das permissões do IAM para escalar privilégios:

AWS - IAM Privesc

Pós Exploração do IAM

AWS - IAM Post Exploitation

Persistência do IAM

AWS - IAM Persistence

Centro de Identidade do IAM

Você pode encontrar uma descrição do Centro de Identidade do IAM em:

AWS - Basic Information

Conectar via SSO com 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

Enumeração

Os principais elementos do Identity Center são:

  • Usuários e grupos

  • Conjuntos de Permissões: Têm políticas anexadas

  • Contas AWS

Então, relacionamentos são criados para que usuários/grupos tenham Conjuntos de Permissões sobre a Conta AWS.

Observe que existem 3 maneiras de anexar políticas a um Conjunto de Permissões. Anexando políticas gerenciadas pela AWS, políticas gerenciadas pelo cliente (essas políticas precisam ser criadas em todas as contas que o Conjunto de Permissões está afetando) e políticas inline (definidas lá).

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

Local Enumeration

É possível criar dentro da pasta $HOME/.aws o arquivo config para configurar perfis que são acessíveis via SSO, por exemplo:

[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 configuração pode ser usada com os comandos:

# Login in ms-sso-profile
aws sso login --profile my-sso-profile
# Use dependent-profile
aws s3 ls --profile dependent-profile

Quando um perfil do SSO é usado para acessar algumas informações, as credenciais são armazenadas em cache em um arquivo dentro da pasta $HOME/.aws/sso/cache. Portanto, elas podem ser lidas e usadas a partir daí.

Além disso, mais credenciais podem ser armazenadas na pasta $HOME/.aws/cli/cache. Este diretório de cache é usado principalmente quando você está trabalhando com perfis do AWS CLI que usam credenciais de usuário IAM ou assumem funções através do IAM (sem SSO). Exemplo de configuração:

[profile crossaccountrole]
role_arn = arn:aws:iam::234567890123:role/SomeRole
source_profile = default
mfa_serial = arn:aws:iam::123456789012:mfa/saanvi
external_id = 123456

Acesso Não Autenticado

AWS - Identity Center & SSO Unauthenticated Enum

Escalação de Privilégios

AWS - SSO & identitystore Privesc

Pós Exploração

AWS - SSO & identitystore Post Exploitation

Persistência

Criar um usuário e atribuir permissões a ele

# 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
  • Crie um grupo e atribua permissões a ele e defina um usuário controlado

  • Dê permissões extras a um usuário ou grupo controlado

  • Por padrão, apenas usuários com permissões da Conta de Gerenciamento poderão acessar e controlar o IAM Identity Center.

No entanto, é possível, através do Administrador Delegado, permitir que usuários de uma conta diferente o gerenciem. Eles não terão exatamente as mesmas permissões, mas poderão realizar atividades de gerenciamento.

Support HackTricks

Last updated