AWS - IAM, Identity Center & SSO Enum

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

IAM

Możesz znaleźć opis IAM w:

pageAWS - Basic Information

Enumeracja

Główne uprawnienia potrzebne:

  • iam:ListPolicies, iam:GetPolicy i iam:GetPolicyVersion

  • iam:ListRoles

  • iam:ListUsers

  • iam:ListGroups

  • iam:ListGroupsForUser

  • iam:ListAttachedUserPolicies

  • iam:ListAttachedRolePolicies

  • iam:ListAttachedGroupPolicies

  • iam:ListUserPolicies i iam:GetUserPolicy

  • iam:ListGroupPolicies i iam:GetGroupPolicy

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

Przydziały Brute Force

Jeśli interesują Cię Twoje własne uprawnienia, ale nie masz dostępu do zapytań IAM, zawsze możesz je przeprowadzić siłowo.

bf-aws-permissions

Narzędzie bf-aws-permissions to po prostu skrypt bashowy, który będzie uruchamiał wszystkie akcje list*, describe*, get* znalezione w wiadomościach pomocy aws cli przy użyciu wskazanego profilu i zwracał udane wykonania.

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

bf-aws-perms-simulate

Narzędzie bf-aws-perms-simulate może znaleźć twoje obecne uprawnienia (lub te innych podmiotów), jeśli masz uprawnienie iam:SimulatePrincipalPolicy.

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

Perms2ManagedPolicies

Jeśli znalazłeś niektóre uprawnienia twojego użytkownika, i sądzisz, że są one przyznawane przez zarządzaną rolę AWS (a nie niestandardową). Możesz użyć narzędzia aws-Perms2ManagedRoles do sprawdzenia wszystkich zarządzanych ról AWS, które przyznają uprawnienia, których odkryłeś, że posiadasz.

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

Możliwe jest "zorientowanie się", czy uprawnienia, które posiadasz, są udzielane przez zarządzaną rolę AWS, jeśli zauważysz, że masz uprawnienia do usług, których nie używasz, na przykład.

Cloudtrail2IAM

CloudTrail2IAM to narzędzie napisane w Pythonie, które analizuje dzienniki AWS CloudTrail w celu wyodrębnienia i podsumowania działań podejmowanych przez wszystkich lub tylko określonego użytkownika lub rolę. Narzędzie analizuje każdy dziennik cloudtrail z wskazanego kubełka.

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]

Jeśli znajdziesz pliki .tfstate (pliki stanu Terraforma) lub pliki CloudFormation (zazwyczaj są to pliki yaml znajdujące się w kubełku z prefiksem cf-templates), możesz je również odczytać, aby znaleźć konfigurację aws i sprawdzić, jakie uprawnienia zostały przypisane komu.

enumerate-iam

Aby użyć narzędzia https://github.com/andresriancho/enumerate-iam, najpierw musisz pobrać wszystkie punkty końcowe API AWS, z których skrypt generate_bruteforce_tests.py pobierze wszystkie punkty końcowe z "list_", "describe_" i "get_". Na koniec spróbuje uzyskać do nich dostęp za pomocą podanych poświadczeń i wskaże, czy to zadziałało.

(W moim doświadczeniu narzędzie zawiesza się w pewnym momencie, sprawdź tę poprawkę, aby spróbować to naprawić).

W moim doświadczeniu to narzędzie jest podobne do poprzedniego, ale działa gorzej i sprawdza mniej uprawnień.

# 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

Możesz również użyć narzędzia weirdAAL. To narzędzie sprawdzi kilka powszechnych operacji na kilku powszechnych usługach (sprawdzi uprawnienia do wyliczania oraz niektóre uprawnienia do eskalacji uprawnień). Jednak sprawdzi tylko zakodowane testy (jedyny sposób na sprawdzenie większej liczby rzeczy to zakodowanie więcej testów).

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

Narzędzia usztywniające do BF uprawnień

# 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

<TwójNarzędzie>

Żaden z poprzednich narzędzi nie jest w stanie sprawdzić wszystkich uprawnień, więc jeśli znasz lepsze narzędzie, prześlij PR!

Dostęp bez uwierzytelnienia

pageAWS - IAM & STS Unauthenticated Enum

Eskalacja uprawnień

Na następnej stronie możesz sprawdzić, jak nadużyć uprawnień IAM do eskalacji uprawnień:

pageAWS - IAM Privesc

Wykorzystanie po eksploatacji IAM

pageAWS - IAM Post Exploitation

Trwałość IAM

pageAWS - IAM Persistence

Centrum tożsamości IAM

Możesz znaleźć opis Centrum Tożsamości IAM w:

pageAWS - Basic Information

Połączenie za pomocą SSO z 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

Wyliczanie

Główne elementy Centrum Tożsamości to:

  • Użytkownicy i grupy

  • Zbiory uprawnień: Mają dołączone polityki

  • Konta AWS

Następnie tworzone są relacje, aby użytkownicy/grupy miały Zbiory uprawnień nad Kontem AWS.

Zauważ, że istnieją 3 sposoby dołączania polityk do Zbioru uprawnień. Dołączanie zarządzanych polityk AWS, Polityki zarządzane przez klienta (te polityki muszą być utworzone we wszystkich kontach, na które wpływa Zbiór uprawnień), oraz polityki wbudowane (zdefiniowane w nim).

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

Lokalne wyliczenie

Możliwe jest utworzenie wewnątrz folderu $HOME/.aws pliku config w celu skonfigurowania profili, które są dostępne za pośrednictwem SSO, na przykład:

[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

Ta konfiguracja może być użyta za pomocą poleceń:

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

Kiedy profil z SSO jest używany do uzyskania dostępu do pewnych informacji, poświadczenia są przechowywane w pliku wewnątrz folderu $HOME/.aws/sso/cache. Dlatego mogą być odczytane i użyte stamtąd.

Co więcej, więcej poświadczeń może być przechowywanych w folderze $HOME/.aws/cli/cache. Ten katalog pamięci podręcznej jest głównie używany, gdy pracujesz z profilami AWS CLI, które używają poświadczeń użytkownika IAM lub przyjmują role za pośrednictwem IAM (bez SSO). Przykład konfiguracji:

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

Nieuwierzytelniony dostęp

pageAWS - Identity Center & SSO Unauthenticated Enum

Eskalacja uprawnień

pageAWS - SSO & identitystore Privesc

Po wykorzystaniu

pageAWS - SSO & identitystore Post Exploitation

Trwałość

Utwórz użytkownika i przypisz mu uprawnienia

# 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
  • Utwórz grupę, przypisz jej uprawnienia i ustaw na niej kontrolowanego użytkownika

  • Udziel dodatkowych uprawnień kontrolowanemu użytkownikowi lub grupie

  • Domyślnie tylko użytkownicy z uprawnieniami z Konta Zarządzającego będą mogli uzyskać dostęp i kontrolować Centrum Tożsamości IAM.

Jednak za pośrednictwem Administratora Delegowanego można zezwolić użytkownikom z innego konta na zarządzanie nim. Nie będą mieli dokładnie tych samych uprawnień, ale będą mogli wykonywać działania zarządzania.

Last updated