
एक S3 खाता आईडी गणना और बकेट खोज उपकरण
एक S3 खाता आईडी गणना और बकेट खोज उपकरण
एक एकल सुलभ S3 बकेट दिए जाने पर, bucky उसके मालिक की 12 अंकों की AWS खाता आईडी निकालता है, फिर एक वर्डलिस्ट के विरुद्ध बकेट नामों को फ़ज़ करके उसी खाते से संबंधित अतिरिक्त बकेट खोजता है — सब एक ही कमांड में।
s3:ResourceAccount IAM शर्त कुंजी का उपयोग करके 12 अंकों की AWS खाता आईडी को एक-एक अंक करके ब्रूट-फ़ोर्स करता है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 के शोध पर आधारित, यह पहले s3-account-search तकनीक का उपयोग करके किसी भी सुलभ बकेट से 12 अंकों की खाता आईडी प्राप्त करता है, फिर {name}-{accountID}-{region}-an पैटर्न को ब्रूट-फ़ोर्स करके लक्ष्य के व्यापक S3 पदचिह्न को उजागर करता है।
s3:ListBucket या s3:GetObject की अनुमति हैsts:AssumeRole कॉल करते हैं, जिसमें "1*" जैसी s3:ResourceAccount शर्त के साथ एक इनलाइन सत्र नीति पारित करते हैं1 से शुरू होता है, तो HeadBucket कॉल सफल होती है; अन्यथा यह 403 लौटाता हैइसके लिए अधिकतम 120 API कॉल (12 स्थान × 10 अंक) की आवश्यकता होती है और यह आमतौर पर एक मिनट से भी कम समय में पूरा होता है।
go install का उपयोग करकेgo 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 का उपयोग करने से पहले, आपको अपने AWS खाते में एक IAM भूमिका की आवश्यकता है जो लक्ष्य 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>को अपनी 12 अंकों की AWS खाता आईडी से बदलें। आप:rootके बजाय प्रिंसिपल को किसी विशिष्ट IAM उपयोगकर्ता या भूमिका ARN तक सीमित कर सकते हैं।
s3-policy.json बनाएँ — भूमिका को व्यापक S3 पढ़ने की पहुँच की आवश्यकता है (bucky की इनलाइन सत्र नीति में s3:ResourceAccount शर्त खाता-स्तरीय फ़िल्टरिंग को संभालती है):
{
"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
# आउटपुट: 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
आउटपुट:
=== चरण 1: खाता आईडी गणना ===
[*] बकेट तक पहुँच सत्यापित की जा रही है: target-bucket
[+] पहुँच की पुष्टि हुई
[+] बकेट क्षेत्र: us-west-2
[*] खाता आईडी की गणना की जा रही है...
[██████████████████████████████] 12/12 | 675351422352
[+] खाता आईडी: 675351422352
=== चरण 2: बकेट खोज ===
[*] खाते के लिए बकेट फ़ज़ किए जा रहे हैं: 675351422352
[*] वर्डलिस्ट से 312 उम्मीदवार लोड किए गए
[+] मिला: target-backups
[+] मिला: target-logs
[██████████████████████████████] 312/312 | 2 मिले
=== सारांश ===
खाता आईडी : 675351422352
स्रोत : target-bucket
क्षेत्र : us-west-2
खोजा गया : 2 अतिरिक्त बकेट
- 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 |
| S3 URI | s3://my-bucket/path/to/key |
| वर्चुअल-होस्टेड URL |
--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 x-amz-bucket-region HTTP प्रतिक्रिया हेडर के माध्यम से सही क्षेत्र का समाधान करता है और इसे सभी बाद के अनुरोधों के लिए कैश करता है। लक्ष्य बकेट के लिए किसी मैन्युअल क्षेत्र कॉन्फ़िगरेशन की आवश्यकता नहीं है।
यदि आपके पास Genzai के बारे में कोई प्रश्न या प्रतिक्रिया है या बस मुझसे जुड़ना चाहते हैं, तो कृपया LinkedIn या ईमेल के माध्यम से संपर्क करें।
| चर | फ़्लैग | विवरण |
|---|
AWS_ACCESS_KEY_ID | --access-key | AWS एक्सेस कुंजी ID |
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/credentials से AWS नामित प्रोफ़ाइल |
BUCKY_ROLE_ARN | --role-arn | ग्रहण करने के लिए IAM भूमिका का ARN |
BUCKY_BUCKET | --bucket | लक्ष्य S3 बकेट नाम |
BUCKY_ACCOUNT_ID | --account-id | लक्ष्य AWS खाता ID (केवल fuzz) |
BUCKY_WORDLIST | --wordlist | वर्डलिस्ट फ़ाइल का पथ |
BUCKY_WORKERS | --workers | समवर्ती फ़ज़िंग वर्कर (डिफ़ॉल्ट: 10) |
build-outputdocker-images| फ़्लैग | विवरण |
|---|
--access-key | AWS एक्सेस कुंजी ID |
--secret-key | AWS गुप्त एक्सेस कुंजी |
--session-token | AWS सत्र टोकन |
--region | AWS क्षेत्र (डिफ़ॉल्ट: us-east-1) |
--profile | AWS नामित प्रोफ़ाइल |
--role-arn | ग्रहण करने के लिए IAM भूमिका का ARN |
--json | परिणाम JSON फ़ाइल में सहेजें |
--output | JSON आउटपुट फ़ाइल पथ (डिफ़ॉल्ट: bucky-{uuid}.json) |
| लक्ष्य S3 बकेट, अल्पविराम से अलग |
--bucket-file | बकेट नाम/URL वाली फ़ाइल, प्रति पंक्ति एक |
--wordlist | वर्डलिस्ट फ़ाइल का पथ |
--workers | समवर्ती वर्कर (डिफ़ॉल्ट: 10) |
| लक्ष्य 12 अंकों की AWS खाता ID |
--wordlist | वर्डलिस्ट फ़ाइल का पथ |
--workers | समवर्ती वर्कर (डिफ़ॉल्ट: 10) |
--regions | नाम उत्परिवर्तन के लिए अल्पविराम से अलग किए गए क्षेत्र |
https://my-bucket.s3.us-west-2.amazonaws.com/key |
| पथ-शैली URL | https://s3.us-west-2.amazonaws.com/my-bucket/key |