
أداة تعداد معرفات حسابات S3 واكتشاف الدلاء
أداة لتعداد معرف حساب S3 واكتشاف الدلاء (Buckets)
عند وجود دلو S3 واحد يمكن الوصول إليه، يستخرج Bucky معرف حساب AWS المكون من 12 رقمًا الذي يملكه، ثم يكتشف دلاء إضافية تابعة لنفس الحساب عن طريق تخمين أسماء الدلاء باستخدام قائمة كلمات — كل ذلك في أمر واحد.
s3:ResourceAccount لتخمين معرف حساب AWS المكون من 12 رقمًا رقمًا تلو الآخر من خلال سياسات جلسة STS المضمنةكانت أسماء دلاء S3 تشترك في الأصل في مساحة اسم عالمية واحدة، مما أدى إلى ظهور bucketsquatting — حيث يمكن للمهاجمين احتلال أسماء يتوقعون أن المنظمات ستقوم بإنشائها. عالجت AWS هذه المشكلة من خلال طرح مساحات أسماء للحساب-المنطقة، وهو مخطط تسمية يربط كل دلو بحسابه ومنطقته المالكة:
{name}-{accountID}-{region}-an
دلو باسم myapp-123456789123-eu-north-1-an سيكون موجودًا على https://myapp-123456789123-eu-north-1-an.s3.eu-north-1.amazonaws.com. توصي AWS الآن بهذا التنسيق للدلاء الجديدة، على الرغم من أنه ليس الإعداد الافتراضي بعد. (للاطلاع على خلفية حول كيفية إنهاء مساحة الاسم الجديدة لظاهرة bucketsquatting، راجع One Cloud Please.)
المقابل هو أن معرف الحساب والمنطقة أصبحا الآن جزءًا من اسم الدلو نفسه. بمجرد حصول المهاجم على معرف حساب الهدف، يمكنه إقرانه بقائمة كلمات وبناء عناوين URL صالحة للدلاء بشكل منهجي — وسيؤكد S3 ما إذا كان كل منها موجودًا، حتى لو كان الدلو خاصًا. هذا الرد وحده يعد استطلاعًا مفيدًا.
يستغل Bucky هذه النقطة تحديدًا. بالاستناد إلى أبحاث من Pwned Labs، يقوم أولاً باستعادة معرف الحساب المكون من 12 رقمًا من أي دلو يمكن الوصول إليه باستخدام تقنية s3-account-search، ثم يقوم بتخمين نمط {name}-{accountID}-{region}-an للكشف عن البصمة الأوسع لنظام S3 للهدف.
s3:ListBucket أو s3:GetObject على الدلو الهدفsts:AssumeRole على ذلك الدور، مررًا سياسة جلسة مضمنة مع شرط s3:ResourceAccount مثل "1*"1، فإن استدعاء HeadBucket ينجح؛ وإلا فإنه يُرجع 403يتطلب هذا على الأكثر 120 استدعاء API (12 موضعًا × 10 أرقام) وعادة ما يكتمل في أقل من دقيقة.
go installgo install github.com/umair9747/bucky@latest
git clone https://github.com/umair9747/bucky.git
cd bucky
go build -o bucky .
sudo mv bucky /usr/local/bin/
bucky --update
هذا يسحب وينصب أحدث إصدار من المستودع.
قبل استخدام Bucky، تحتاج إلى دور IAM في حسابك الخاص في AWS يمكنه الوصول إلى دلو S3 الهدف. يجب أن يكون الدلو الهدف عامًا أو لديه سياسة دلو تسمح بالوصول من حسابك.
أنشئ trust-policy.json — هذا يسمح لمستخدم IAM الخاص بك بافتراض الدور:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<YOUR_ACCOUNT_ID>:root"
},
"Action": "sts:AssumeRole"
}
]
}
استبدل
<YOUR_ACCOUNT_ID>بمعرف حساب AWS المكون من 12 رقمًا. يمكنك تقييد الأساس إلى ARN مستخدم أو دور IAM محدد بدلاً من:root.
أنشئ s3-policy.json — يحتاج الدور إلى صلاحية قراءة S3 واسعة (شرط s3:ResourceAccount في سياسة جلسة Bucky المضمنة يتعامل مع التصفية على مستوى الحساب):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": "*"
}
]
}
aws iam create-role \
--role-name bucky-role \
--assume-role-policy-document file://trust-policy.json
aws iam put-role-policy \
--role-name bucky-role \
--policy-name S3ReadAccess \
--policy-document file://s3-policy.json
aws iam get-role --role-name bucky-role --query 'Role.Arn' --output text
# Output: arn:aws:iam::123456789012:role/bucky-role
إذا لم يكن لدى مستخدم IAM لديك صلاحية sts:AssumeRole بالفعل، قم بإرفاقها:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<YOUR_ACCOUNT_ID>:role/bucky-role"
}
]
}
الطريقة الأساسية لاستخدام Bucky — تعداد معرف الحساب من دلو معروف، ثم التخمين لمزيد من الدلاء في أمر واحد:
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket target-bucket \
--wordlist wordlists/default.txt \
--access-key AKIA... \
--secret-key wJal...
مع مفتاح كائن معروف (يحسن الموثوقية):
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket s3://target-bucket/index.html \
--wordlist wordlists/default.txt \
--workers 20
دلاء متعددة (مفصولة بفاصلة):
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket bucket1,bucket2,bucket3 \
--wordlist wordlists/default.txt
دلاء متعددة من ملف:
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket-file targets.txt \
--wordlist wordlists/default.txt
حفظ النتائج إلى JSON:
bucky --bucket target-bucket --wordlist wordlists/default.txt --json
bucky --bucket target-bucket --wordlist wordlists/default.txt --json --output results.json
المخرجات:
=== Phase 1: Account ID Enumeration ===
[*] Verifying access to bucket: target-bucket
[+] Access confirmed
[+] Bucket region: us-west-2
[*] Enumerating account ID...
[██████████████████████████████] 12/12 | 675351422352
[+] Account ID: 675351422352
=== Phase 2: Bucket Discovery ===
[*] Fuzzing buckets for account: 675351422352
[*] Loaded 312 candidates from wordlist
[+] FOUND: target-backups
[+] FOUND: target-logs
[██████████████████████████████] 312/312 | 2 found
=== Summary ===
Account ID : 675351422352
Source : target-bucket
Region : us-west-2
Discovered : 2 additional bucket(s)
- target-backups
- target-logs
إذا كنت تحتاج فقط إلى معرف الحساب:
bucky enum \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket target-bucket
الدلاء المتعددة ومخرجات JSON تعمل أيضًا مع الأوامر الفرعية:
bucky enum --bucket bucket1,bucket2 --json
bucky enum --bucket-file targets.txt --json --output results.json
إذا كان لديك بالفعل معرف حساب وتريد اكتشاف الدلاء:
bucky fuzz \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--account-id 675351422352 \
--wordlist wordlists/default.txt \
--workers 20
يمكن تعيين جميع الأعلام عبر متغيرات البيئة. الأعلام لها الأولوية عند ضبط كليهما.