AWS - S3 अनधिकृत Enum
Reading time: 10 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
S3 सार्वजनिक बकेट
एक बकेट को “सार्वजनिक” माना जाता है यदि कोई भी उपयोगकर्ता बकेट की सामग्री को सूचीबद्ध कर सकता है, और “निजी” यदि बकेट की सामग्री को केवल कुछ उपयोगकर्ताओं द्वारा सूचीबद्ध या लिखा जा सकता है।
कंपनियों के पास बकेट अनुमतियाँ गलत कॉन्फ़िगर की गई हो सकती हैं जो या तो सब कुछ या AWS में किसी भी खाते में प्रमाणित सभी को पहुँच देती हैं (तो किसी को भी)। ध्यान दें, कि ऐसी गलत कॉन्फ़िगरेशन के साथ भी कुछ क्रियाएँ नहीं की जा सकती हैं क्योंकि बकेट की अपनी पहुँच नियंत्रण सूचियाँ (ACLs) हो सकती हैं।
AWS-S3 गलत कॉन्फ़िगरेशन के बारे में यहाँ जानें: http://flaws.cloud और http://flaws2.cloud/
AWS बकेट खोजने के तरीके
जब एक वेबपृष्ठ AWS का उपयोग करके कुछ संसाधनों को स्टोर कर रहा हो, तो खोजने के लिए विभिन्न तरीके:
Enumeration & OSINT:
- wappalyzer ब्राउज़र प्लगइन का उपयोग करना
- बर्प का उपयोग करना (वेब को स्पाइडर करना) या पृष्ठ के माध्यम से मैन्युअल रूप से नेविगेट करके सभी संसाधनों को इतिहास में सहेजना।
- संसाधनों के लिए जाँच करें जैसे डोमेन में:
http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
- CNAMES के लिए जाँच करें क्योंकि
resources.domain.com
में CNAMEbucket.s3.amazonaws.com
हो सकता है - s3dns – एक हल्का DNS सर्वर जो DNS ट्रैफ़िक का विश्लेषण करके क्लाउड स्टोरेज बकेट (S3, GCP, Azure) की पहचान करता है। यह CNAMEs का पता लगाता है, समाधान श्रृंखलाओं का पालन करता है, और बकेट पैटर्न से मेल खाता है, जो ब्रूट-फोर्स या API-आधारित खोज के लिए एक शांत विकल्प प्रदान करता है। पुनः खोज और OSINT कार्यप्रवाह के लिए आदर्श।
- https://buckets.grayhatwarfare.com, एक वेब जो पहले से खोजे गए खुले बकेट के साथ है।
- बकेट नाम और बकेट डोमेन नाम को एक समान होना चाहिए।
- flaws.cloud का IP 52.92.181.107 है और यदि आप वहाँ जाते हैं तो यह आपको https://aws.amazon.com/s3/ पर रीडायरेक्ट करता है। इसके अलावा,
dig -x 52.92.181.107
s3-website-us-west-2.amazonaws.com
देता है। - यह जाँचने के लिए कि यह एक बकेट है, आप यहाँ भी जा सकते हैं https://flaws.cloud.s3.amazonaws.com/।
ब्रूट-फोर्स
आप बकेट्स को कंपनी से संबंधित नामों को ब्रूट-फोर्स करके खोज सकते हैं:
- https://github.com/sa7mon/S3Scanner
- https://github.com/clario-tech/s3-inspector
- https://github.com/jordanpotti/AWSBucketDump (संभावित बकेट नामों की सूची शामिल है)
- https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets
- https://github.com/smaranchand/bucky
- https://github.com/tomdev/teh_s3_bucketeers
- https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3
- https://github.com/Eilonh/s3crets_scanner
- https://github.com/belane/CloudHunter
# Generate a wordlist to create permutations
curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt
# Generate a wordlist based on the domains and subdomains to test
## Write those domains and subdomains in subdomains.txt
cat subdomains.txt > /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "-" >> /tmp/words-hosts-s3.txt
cat subdomains.txt | tr "." "\n" | sort -u >> /tmp/words-hosts-s3.txt
# Create permutations based in a list with the domains and subdomains to attack
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## The previous tool is specialized increating permutations for subdomains, lets filter that list
### Remove lines ending with "."
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### Create list without TLD
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### Create list without dots
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Create list without hyphens
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5
## Generate the final wordlist
cat /tmp/final-words-s3.txt.temp2 /tmp/final-words-s3.txt.temp3 /tmp/final-words-s3.txt.temp4 /tmp/final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp/final-words-s3.txt
## Call s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt | grep bucket_exists
S3 बकेट्स का लूट
खुले S3 बकेट्स को देखते हुए, BucketLoot स्वचालित रूप से दिलचस्प जानकारी के लिए खोज कर सकता है।
क्षेत्र खोजें
आप https://docs.aws.amazon.com/general/latest/gr/s3.html में AWS द्वारा समर्थित सभी क्षेत्रों को खोज सकते हैं।
DNS द्वारा
आप dig
और nslookup
का उपयोग करके एक बकेट के क्षेत्र को प्राप्त कर सकते हैं खोजे गए IP का DNS अनुरोध करके:
dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud. 5 IN A 52.218.192.11
nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.
यह सुनिश्चित करें कि हल किया गया डोमेन "website" शब्द रखता है।
आप स्थिर वेबसाइट पर जा सकते हैं: flaws.cloud.s3-website-us-west-2.amazonaws.com
या आप बकेट पर जाकर पहुंच सकते हैं: flaws.cloud.s3-us-west-2.amazonaws.com
प्रयास करके
यदि आप एक बकेट तक पहुंचने की कोशिश करते हैं, लेकिन डोमेन नाम में आप एक अन्य क्षेत्र निर्दिष्ट करते हैं (उदाहरण के लिए बकेट bucket.s3.amazonaws.com
में है लेकिन आप bucket.s3-website-us-west-2.amazonaws.com
पर पहुंचने की कोशिश करते हैं, तो आपको सही स्थान पर निर्देशित किया जाएगा:
बकेट की गणना करना
बकेट की खुली स्थिति का परीक्षण करने के लिए, एक उपयोगकर्ता बस अपने वेब ब्राउज़र में URL दर्ज कर सकता है। एक निजी बकेट "Access Denied" के साथ प्रतिक्रिया देगा। एक सार्वजनिक बकेट पहले 1,000 वस्तुओं की सूची देगा जो संग्रहीत की गई हैं।
सभी के लिए खुला:
निजी:
आप इसे cli के साथ भी जांच सकते हैं:
#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
#--recursive if you want list recursivelyls
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]
यदि बकेट का डोमेन नाम नहीं है, तो इसे सूचीबद्ध करने का प्रयास करते समय, केवल बकेट का नाम डालें और पूरा AWSs3 डोमेन नहीं। उदाहरण: s3://<BUCKETNAME>
सार्वजनिक URL टेम्पलेट
https://{user_provided}.s3.amazonaws.com
सार्वजनिक बकेट से खाता आईडी प्राप्त करें
यह S3:ResourceAccount
नीति स्थिति कुंजी का लाभ उठाकर AWS खाते को निर्धारित करना संभव है। यह स्थिति उस S3 बकेट के आधार पर पहुंच को प्रतिबंधित करती है जिसमें एक खाता है (अन्य खाता-आधारित नीतियाँ उस खाते के आधार पर प्रतिबंधित करती हैं जिसमें अनुरोध करने वाला प्रमुख है)।
और क्योंकि नीति में वाइल्डकार्ड हो सकते हैं, इसलिए खाता संख्या केवल एक संख्या में पाई जा सकती है।
यह उपकरण प्रक्रिया को स्वचालित करता है:
# Installation
pipx install s3-account-search
pip install s3-account-search
# With a bucket
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# With an object
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext
यह तकनीक API Gateway URLs, Lambda URLs, Data Exchange डेटा सेट और यहां तक कि टैग के मान प्राप्त करने के लिए भी काम करती है (यदि आप टैग कुंजी जानते हैं)। आप मूल शोध और इस शोषण को स्वचालित करने के लिए उपकरण conditional-love में अधिक जानकारी प्राप्त कर सकते हैं।
एक बकेट की पुष्टि करना कि यह AWS खाते से संबंधित है
जैसा कि इस ब्लॉग पोस्ट में समझाया गया है, यदि आपके पास एक बकेट को सूचीबद्ध करने की अनुमति है तो यह संभव है कि आप उस खाते की ID की पुष्टि कर सकें जिससे बकेट संबंधित है, एक अनुरोध भेजकर जैसे:
curl -X GET "[bucketname].amazonaws.com/" \
-H "x-amz-expected-bucket-owner: [correct-account-id]"
<?xml version="1.0" encoding="UTF-8"?>
<ListBucketResult xmlns="http://s3.amazonaws.com/doc/2006-03-01/">...</ListBucketResult>
यदि त्रुटि "Access Denied" है, तो इसका मतलब है कि खाता आईडी गलत थी।
रूट खाता enumeration के रूप में उपयोग किए गए ईमेल
जैसा कि इस ब्लॉग पोस्ट में समझाया गया है, यह जांचना संभव है कि क्या कोई ईमेल पता किसी AWS खाते से संबंधित है S3 बकेट पर ACLs के माध्यम से ईमेल को अनुमति देने की कोशिश करके। यदि यह कोई त्रुटि उत्पन्न नहीं करता है, तो इसका मतलब है कि ईमेल किसी AWS खाते का रूट उपयोगकर्ता है:
s3_client.put_bucket_acl(
Bucket=bucket_name,
AccessControlPolicy={
'Grants': [
{
'Grantee': {
'EmailAddress': 'some@emailtotest.com',
'Type': 'AmazonCustomerByEmail',
},
'Permission': 'READ'
},
],
'Owner': {
'DisplayName': 'Whatever',
'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef'
}
}
)
संदर्भ
- https://www.youtube.com/watch?v=8ZXRw4Ry3mQ
- https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।