AWS - IAM, Identity Center & SSO Enum

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

IAM

Aşağıda IAM için bir açıklama bulabilirsiniz:

AWS - Basic Information

Taramalar

Gerekli ana izinler:

  • 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

Kasıtlı hatalar yoluyla gizli izin doğrulama

When List* or simulator APIs are blocked, you can öngörülebilir doğrulama hataları oluşturarak kalıcı kaynak yaratmadan mutasyon izinlerini doğrulayabilirsiniz. AWS yine de bu hataları döndürmeden önce IAM’i değerlendirir; bu yüzden hatayı görmek, isteği yapanın ilgili action’a sahip olduğunu kanıtlar:

# 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

Bu denemeler yine CloudTrail olayları oluşturur (errorCode ayarlı olarak) ancak yeni IAM artefaktları bırakmaktan kaçınır; bu yüzden etkileşimli keşif sırasında düşük-gürültülü izin doğrulaması için kullanışlıdır.

İzinler Brute Force

Kendi izinlerinizi merak ediyorsanız ama IAM sorgulama erişiminiz yoksa, onları her zaman brute-force ile deneyebilirsiniz.

bf-aws-permissions

The tool bf-aws-permissions is just a bash script that will run using the indicated profile all the list*, describe*, get* actions it can find using aws cli help messages and return the successful executions.

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

bf-aws-perms-simulate

Bu araç bf-aws-perms-simulate, eğer iam:SimulatePrincipalPolicy iznine sahipseniz mevcut izinlerinizi (veya diğer principal’lerin izinlerini) bulabilir.

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

Perms2ManagedPolicies

Eğer kullanıcınızın sahip olduğu bazı izinleri keşfettiyseniz ve bunların bir managed AWS role (özel bir rol tarafından değil) tarafından verildiğini düşünüyorsanız, sahip olduğunuzu keşfettiğiniz izinleri veren tüm AWS managed roles’u kontrol etmek için aws-Perms2ManagedRoles aracını kullanabilirsiniz.

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

Warning

Örneğin kullanılmayan hizmetler üzerinde yetkiniz olduğunu görürseniz, sahip olduğunuz izinlerin AWS tarafından yönetilen bir role verildiğini “bilmek” mümkün olabilir.

Cloudtrail2IAM

CloudTrail2IAM bir Python aracıdır; herkesin veya sadece belirli bir kullanıcı veya rolün gerçekleştirdiği eylemleri çıkarmak ve özetlemek için AWS CloudTrail logs’ı analiz eder. Araç belirtilen bucket’taki her cloudtrail logunu parse edecek.

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

Eğer .tfstate (Terraform state dosyaları) veya CloudFormation dosyaları (genellikle cf-templates önekine sahip bir bucket içinde bulunan yaml dosyaları) bulursanız, bunları okuyarak aws yapılandırmasını ve hangi izinlerin kime atandığını tespit edebilirsiniz.

enumerate-iam

Aracı https://github.com/andresriancho/enumerate-iam kullanmak için önce tüm AWS API endpoint’lerini indirmeniz gerekir; bu endpoint’lerden script generate_bruteforce_tests.py tüm “list_”, “describe_”, and “get_” endpoints. alacaktır. Son olarak verilen kimlik bilgileriyle bunlara erişmeyi dener ve çalışıp çalışmadığını belirtir.

(Benim deneyimime göre tool bir noktada takılıyor, checkout this fix bunu düzeltmek için).

Warning

Benim deneyimime göre bu tool önceki olandan daha kötü çalışıyor ve daha az izin kontrolü yapıyor

# 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

Bu aracı ayrıca weirdAAL kullanabilirsiniz. Bu araç birçok yaygın serviste birçok yaygın işlemi kontrol edecektir (bazı enumeration izinlerini ve ayrıca bazı privesc izinlerini kontrol eder). Ancak yalnızca kodlanmış kontrolleri denetler (daha fazla şeyi kontrol etmenin tek yolu daha fazla test kodlamaktır).

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

BF izinleri için Sertleştirme Araçları

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

Önceki araçların hiçbiri neredeyse tüm izinleri kontrol edebilecek kadar kapsamlı değil; daha iyi bir araç biliyorsanız PR gönderin!

Unauthenticated Access

AWS - IAM & STS Unauthenticated Enum

Privilege Escalation

Aşağıdaki sayfada abuse IAM permissions to escalate privileges nasıl yapılacağını inceleyebilirsiniz:

AWS - IAM Privesc

IAM Post Exploitation

AWS - IAM Post Exploitation

IAM Persistence

AWS - IAM Persistence

IAM Identity Center

IAM Identity Center açıklamasını şu adreste bulabilirsiniz:

AWS - Basic Information

Connect via SSO with 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

Enumerasyon

Identity Center’ın ana öğeleri şunlardır:

  • Kullanıcılar ve gruplar
  • Permission Sets: Politikalar iliştirilir
  • AWS Accounts

Daha sonra, kullanıcılar/grupların AWS Account üzerinde Permission Sets’e sahip olması için ilişkiler oluşturulur.

Note

Bir Permission Set’e politika iliştirmenin 3 yolu olduğunu unutmayın: AWS managed policies eklemek, Customer managed policies (bu policies’lerin Permission Set’in etki ettiği tüm hesaplarda oluşturulması gerekir) ve inline policies (Permission Set içinde tanımlananlar).

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

Yerel Keşif

SSO aracılığıyla erişilebilen profilleri yapılandırmak için $HOME/.aws klasörüne config adlı bir dosya oluşturabilirsiniz, örneğin:

[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

Bu yapılandırma şu komutlarla kullanılabilir:

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

Bir SSO profilinin kullanılmasıyla bazı bilgilere erişildiğinde, kimlik bilgileri $HOME/.aws/sso/cache klasörünün içindeki bir dosyada önbelleğe alınır. Bu nedenle oradan okunup kullanılabilirler.

Ayrıca, daha fazla kimlik bilgisi $HOME/.aws/cli/cache klasöründe saklanabilir. Bu önbellek dizini öncelikle IAM kullanıcı kimlik bilgilerini kullanan veya IAM aracılığıyla rol üstlenen (SSO olmadan) AWS CLI profilleri ile çalışırken kullanılır. Konfigürasyon örneği:

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

Unauthenticated Access

AWS - Identity Center & SSO Unauthenticated Enum

Privilege Escalation

AWS - SSO & identitystore Privesc

Post Exploitation

AWS - SSO & identitystore Post Exploitation

Persistence

Bir kullanıcı oluşturun ve ona izinler atayın

# 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
  • Bir grup oluşturun, ona izinler atayın ve bir kontrollü kullanıcı atayın
  • Kontrollü bir kullanıcıya veya gruba ekstra izinler verin
  • Varsayılan olarak, yalnızca Management Account’tan izinlere sahip kullanıcılar IAM Identity Center’a erişip onu kontrol edebilecek.

Ancak, Delegate Administrator aracılığıyla farklı bir hesaptan kullanıcıların bunu yönetmesine izin vermek mümkündür. Aynı izinlere tam olarak sahip olmayacaklar, ancak management activities gerçekleştirebilecekler.

Tip

AWS Hacking’i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking’i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE)
Az Hacking’i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin