
أداة تعداد معرفات حسابات 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
يمكن تعيين جميع الأعلام عبر متغيرات البيئة. الأعلام لها الأولوية عند ضبط كليهما.
export AWS_ACCESS_KEY_ID=AKIA...
export AWS_SECRET_ACCESS_KEY=wJal...
export BUCKY_ROLE_ARN=arn:aws:iam::123456789012:role/bucky-role
# الآن حدد الهدف فقط
bucky --bucket target-bucket --wordlist wordlists/default.txt
يأتي Bucky مع قائمة كلمات افتراضية في wordlists/default.txt تحتوي على حوالي 300 نمط تسمية شائع لدلاء S3:
backups, logs, data, assets, uploads)cloudtrail-logs, terraform-state, lambda-artifacts)prod-logs, staging-data, dev-backups)api, web-assets, cdn-origin)ci-artifacts, , )للتدخلات المستهدفة، قم بإنشاء قائمة كلمات مخصصة بإضافة اسم المنظمة:
ORG="acme"
while read -r line; do
[[ "$line" =~ ^#.*$ || -z "$line" ]] && continue
echo "${ORG}-${line}"
echo "${line}-${ORG}"
echo "${ORG}${line}"
done < wordlists/default.txt > wordlists/acme.txt
أي قائمة كلمات متوافقة مع أدوات مثل ffuf أو gobuster تعمل. التنسيق: اسم دلو واحد في كل سطر، تعليقات #، الأسطر الفارغة تُتجاهل.
| الأمر | الوصف |
|---|---|
bucky | سير العمل الكامل — تعداد معرف الحساب ثم التخمين لمزيد من الدلاء |
bucky enum | تعداد معرف الحساب المكون من 12 رقمًا من دلو معروف |
bucky fuzz | تخمين أسماء الدلاء مقابل معرف حساب معروف |
الأعلام العامة (جميع الأوامر):
bucky (سير العمل الكامل):
| العلم | الوصف |
|---|---|
--bucket |
bucky enum:
| العلم | الوصف |
|---|---|
--bucket | دلاء S3 الهدف، مفصولة بفاصلة |
--bucket-file | ملف يحتوي على أسماء/عناوين URL للدلاء، دلو واحد في كل سطر |
bucky fuzz:
| العلم | الوصف |
|---|---|
--account-id |
يقبل العلم --bucket و--bucket-file تنسيقات إدخال متعددة. يستخرج Bucky تلقائيًا اسم الدلو (والمفتاح الاختياري) من:
| التنسيق | مثال |
|---|---|
| اسم عادي | my-bucket |
| URI S3 | s3://my-bucket/path/to/key |
يمكن تمرير دلاء متعددة مفصولة بفاصلة عبر --bucket:
--bucket bucket1,s3://bucket2/key,https://bucket3.s3.amazonaws.com/
أو مذكورة سطرًا سطرًا في ملف عبر --bucket-file:
my-bucket
s3://another-bucket/index.html
https://third.s3.us-east-1.amazonaws.com/
عندما تتحل عدة دلاء إلى نفس معرف الحساب، يقوم Bucky بإزالة التكرار ويقوم بالتخمين مرة واحدة فقط لكل حساب فريد.
استخدم --json لحفظ النتائج إلى ملف JSON. اسم الملف الافتراضي هو bucky-{uuid}.json في الدليل الحالي، أو حدد مسارًا باستخدام --output:
bucky --bucket target-bucket --wordlist wordlists/default.txt --json
bucky --bucket target-bucket --wordlist wordlists/default.txt --json --output results.json
تنسيق المخرجات:
{
"timestamp": "2024-01-15T10:30:00Z",
"results": [
{
"bucket": "target-bucket",
"account_id": "675351422352",
"region": "ap-south-1",
"discovered_buckets": [
"dev-675351422352-ap-south-1-an.s3.ap-south-1.amazonaws.com",
"prod-675351422352-ap-south-1-an.s3.ap-south-1.amazonaws.com"
]
}
]
}
يكتشف Bucky تلقائيًا منطقة الدلاء الهدف. عندما يُرجع S3 إعادة توجيه 301 (الدلو في منطقة مختلفة عن --region)، يحل Bucky المنطقة الصحيحة عبر رأس استجابة HTTP x-amz-bucket-region ويخزنها مؤقتًا لجميع الطلبات اللاحقة. لا حاجة لتكوين يدوي للمنطقة للدلو الهدف.
إذا كان لديك أي أسئلة أو تعليقات حول Bucky أو ترغب فقط في التواصل معي، فلا تتردد في الاتصال بي عبر LinkedIn أو البريد الإلكتروني.
| متغير | العلم | الوصف |
|---|
AWS_ACCESS_KEY_ID | --access-key | معرف مفتاح الوصول AWS |
AWS_SECRET_ACCESS_KEY | --secret-key | مفتاح الوصول السري AWS |
AWS_SESSION_TOKEN | --session-token | رمز جلسة AWS (للبيانات المعتمدة المؤقتة) |
AWS_REGION | --region | منطقة AWS (الافتراضي: us-east-1) |
AWS_DEFAULT_REGION | --region | احتياطي إذا لم يتم تعيين AWS_REGION |
AWS_PROFILE | --profile | ملف تعريف AWS المسمى من ~/.aws/credentials |
BUCKY_ROLE_ARN | --role-arn | ARN لدور IAM لافتراضه |
BUCKY_BUCKET | --bucket | اسم دلو S3 الهدف |
BUCKY_ACCOUNT_ID | --account-id | معرف حساب AWS الهدف (fuzz فقط) |
BUCKY_WORDLIST | --wordlist | مسار ملف قائمة الكلمات |
BUCKY_WORKERS | --workers | العمال المتزامنين للتخمين (الافتراضي: 10) |
build-outputdocker-images| العلم | الوصف |
|---|
--access-key | معرف مفتاح الوصول AWS |
--secret-key | مفتاح الوصول السري AWS |
--session-token | رمز جلسة AWS |
--region | منطقة AWS (الافتراضي: us-east-1) |
--profile | ملف تعريف AWS المسمى |
--role-arn | ARN لدور IAM لافتراضه |
--json | حفظ النتائج إلى ملف JSON |
--output | مسار ملف مخرجات JSON (الافتراضي: bucky-{uuid}.json) |
| دلاء S3 الهدف، مفصولة بفاصلة |
--bucket-file | ملف يحتوي على أسماء/عناوين URL للدلاء، دلو واحد في كل سطر |
--wordlist | مسار ملف قائمة الكلمات |
--workers | العمال المتزامنين (الافتراضي: 10) |
| معرف حساب AWS الهدف المكون من 12 رقمًا |
--wordlist | مسار ملف قائمة الكلمات |
--workers | العمال المتزامنين (الافتراضي: 10) |
--regions | مناطق مفصولة بفاصلة لتحويرات الأسماء |
| URL مستضاف افتراضيًا |
https://my-bucket.s3.us-west-2.amazonaws.com/key |
| URL بنمط المسار | https://s3.us-west-2.amazonaws.com/my-bucket/key |