AWS - IAM, Identity Center & SSO Enum

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks

IAM

Eine Beschreibung von IAM findest du in:

AWS - Basic Information

Enumeration

Hauptsächlich benötigte Berechtigungen:

  • iam:ListPolicies, iam:GetPolicy and iam:GetPolicyVersion
  • iam:ListRoles
  • iam:ListUsers
  • iam:ListGroups
  • iam:ListGroupsForUser
  • iam:ListAttachedUserPolicies
  • iam:ListAttachedRolePolicies
  • iam:ListAttachedGroupPolicies
  • iam:ListUserPolicies and iam:GetUserPolicy
  • iam:ListGroupPolicies and iam:GetGroupPolicy
  • iam:ListRolePolicies and 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

Stealth permission confirmation via intentional failures

Wenn List*- oder Simulator-APIs blockiert sind, können Sie Berechtigungen für Änderungsvorgänge bestätigen, ohne dauerhafte Ressourcen zu erstellen, indem Sie vorhersehbare Validierungsfehler erzwingen. AWS wertet IAM weiterhin aus, bevor diese Fehler zurückgegeben werden, sodass das Auftreten des Fehlers beweist, dass der Aufrufer die Aktion besitzt:

# 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

Diese Versuche erzeugen weiterhin CloudTrail-Ereignisse (mit errorCode gesetzt), hinterlassen aber keine neuen IAM-Artefakte, wodurch sie während interactive recon nützlich für eine geräuscharme Berechtigungsvalidierung sind.

Permissions Brute Force

Wenn Sie an Ihren eigenen Berechtigungen interessiert sind, aber keinen Zugriff haben, um IAM abzufragen, könnten Sie sie immer brute-force ermitteln.

bf-aws-permissions

Das Tool bf-aws-permissions ist nur ein bash-Skript, das mit dem angegebenen Profil alle list*, describe*, get* Aktionen ausführt, die es über die aws CLI-Hilfetexte finden kann, und gibt die erfolgreichen Ausführungen zurück.

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

bf-aws-perms-simulate

Das Tool bf-aws-perms-simulate kann deine aktuellen Berechtigungen (oder die von anderen principals) ermitteln, wenn du die Berechtigung iam:SimulatePrincipalPolicy hast.

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

Perms2ManagedPolicies

Wenn du einige Berechtigungen deines Users gefunden hast und denkst, dass sie von einer managed AWS role (und nicht von einer benutzerdefinierten) vergeben werden, kannst du das Tool aws-Perms2ManagedRoles verwenden, um alle AWS managed roles zu überprüfen, die die Berechtigungen gewähren, die du entdeckt hast.

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

Warning

Es ist möglich zu erkennen, ob die permissions, die Sie haben, von einer AWS managed role gewährt werden, wenn Sie zum Beispiel sehen, dass Sie permissions für services haben, die nicht genutzt werden.

Cloudtrail2IAM

CloudTrail2IAM ist ein Python-Tool, das AWS CloudTrail logs analysiert, um Aktionen zu extrahieren und zusammenzufassen, die von allen oder nur einem bestimmten user oder role ausgeführt werden. Das Tool wird jedes cloudtrail log aus dem angegebenen bucket parsen.

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

Wenn du .tfstate (Terraform state files) oder CloudFormation-Dateien findest (das sind normalerweise yaml-Dateien, die sich in einem Bucket mit dem Präfix cf-templates befinden), kannst du diese ebenfalls lesen, um aws-Konfigurationen zu finden und herauszufinden, welche Berechtigungen wem zugewiesen wurden.

enumerate-iam

Um das Tool https://github.com/andresriancho/enumerate-iam zu verwenden, musst du zuerst alle AWS API-Endpunkte herunterladen. Aus diesen extrahiert das Skript generate_bruteforce_tests.py alle “list_”, “describe_” und “get_” Endpunkte. Schließlich versucht es mit den angegebenen Anmeldeinformationen, auf sie zuzugreifen und anzuzeigen, ob es funktioniert hat.

(In meiner Erfahrung hängt das Tool irgendwann, siehe diesen Fix, um das zu beheben).

Warning

Meiner Erfahrung nach ist dieses Tool wie das vorherige, funktioniert aber schlechter und prüft weniger Berechtigungen

# 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

Du kannst auch das Tool weirdAAL verwenden. Dieses Tool prüft mehrere gängige Operationen auf mehreren gängigen Diensten (prüft einige enumeration permissions und auch einige privesc permissions). Es prüft jedoch nur die codierten Checks — die einzige Möglichkeit, mehr zu prüfen, ist, selbst weitere Tests zu schreiben.

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

Hardening Tools für BF permissions

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

Keines der vorherigen Tools ist in der Lage, auch nur annähernd alle Berechtigungen zu prüfen. Wenn du ein besseres Tool kennst, sende bitte einen PR!

Unauthentifizierter Zugriff

AWS - IAM & STS Unauthenticated Enum

Privilege Escalation

Auf der folgenden Seite kannst du nachlesen, wie man abuse IAM permissions to escalate privileges:

AWS - IAM Privesc

IAM Post Exploitation

AWS - IAM Post Exploitation

IAM Persistence

AWS - IAM Persistence

IAM Identity Center

Du findest eine Beschreibung des IAM Identity Center in:

AWS - Basic Information

Mit SSO über die CLI verbinden

# 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

Enumeration

Die Hauptelemente des Identity Center sind:

  • Benutzer und Gruppen
  • Permission Sets: sind mit Policies verknüpft
  • AWS Accounts

Anschließend werden Beziehungen erstellt, sodass Benutzer/Gruppen Permission Sets für AWS Accounts erhalten.

Note

Beachte, dass es 3 Möglichkeiten gibt, Policies an ein Permission Set anzuhängen: AWS managed policies, Customer managed policies (diese Policies müssen in allen Accounts erstellt werden, die vom Permission Set betroffen sind), und inline policies (dort definiert).

# 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

Es ist möglich, im Ordner $HOME/.aws die Datei config zu erstellen, um Profile zu konfigurieren, die über SSO zugänglich sind, zum Beispiel:

[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

Diese Konfiguration kann mit den folgenden Befehlen verwendet werden:

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

Wenn ein Profil aus SSO verwendet wird, um auf Informationen zuzugreifen, werden die Anmeldeinformationen in einer Datei im Ordner $HOME/.aws/sso/cache zwischengespeichert. Daher können sie dort gelesen und verwendet werden.

Außerdem können weitere Anmeldeinformationen im Ordner $HOME/.aws/cli/cache gespeichert werden. Dieses Cache-Verzeichnis wird hauptsächlich verwendet, wenn Sie mit AWS CLI profiles arbeiten, die IAM-Benutzer-Anmeldeinformationen verwenden oder Rollen über IAM übernehmen (ohne SSO). Konfigurationsbeispiel:

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

Nicht authentifizierter Zugriff

AWS - Identity Center & SSO Unauthenticated Enum

Privilegieneskalation

AWS - SSO & identitystore Privesc

Nach der Kompromittierung

AWS - SSO & identitystore Post Exploitation

Persistenz

Erstelle einen Benutzer und weise ihm Berechtigungen zu

# 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
  • Erstelle eine Gruppe, weise ihr Berechtigungen zu und weise einen kontrollierten Benutzer zu
  • Gewähre einem kontrollierten Benutzer oder einer Gruppe zusätzliche Berechtigungen
  • Standardmäßig können nur Benutzer mit Berechtigungen aus dem Management Account auf das IAM Identity Center zugreifen und es verwalten.

Es ist jedoch möglich, über Delegate Administrator Benutzern aus einem anderen Account die Verwaltung zu erlauben. Sie haben nicht genau die gleichen Berechtigungen, aber sie können management activities durchführen.

Tip

Lerne & übe AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Lerne & übe GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Lerne & übe Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Unterstütze HackTricks