AWS - S3 Unauthenticated Enum

Support HackTricks

S3 Public Buckets

एक बकेट को "सार्वजनिक" माना जाता है यदि कोई भी उपयोगकर्ता बकेट की सामग्री को सूचीबद्ध कर सकता है, और "निजी" यदि बकेट की सामग्री को केवल कुछ उपयोगकर्ताओं द्वारा सूचीबद्ध या लिखा जा सकता है

कंपनियों के पास बकेट अनुमतियाँ गलत कॉन्फ़िगर की गई हो सकती हैं जो या तो सब कुछ या AWS में किसी भी खाते में प्रमाणित सभी को पहुँच देती हैं (तो किसी को भी)। ध्यान दें, कि ऐसी गलत कॉन्फ़िगरेशन के साथ भी कुछ क्रियाएँ नहीं की जा सकती हैं क्योंकि बकेट की अपनी पहुँच नियंत्रण सूचियाँ (ACLs) हो सकती हैं।

AWS-S3 गलत कॉन्फ़िगरेशन के बारे में यहाँ जानें: http://flaws.cloud और http://flaws2.cloud/

Finding AWS Buckets

जब एक वेबपृष्ठ AWS का उपयोग करके कुछ संसाधनों को स्टोर कर रहा हो, तो उन्हें खोजने के विभिन्न तरीके:

Enumeration & OSINT:

  • wappalyzer ब्राउज़र प्लगइन का उपयोग करना

  • बर्प का उपयोग करना (वेब को स्पाइडर करना) या पृष्ठ के माध्यम से मैन्युअल रूप से नेविगेट करके सभी संसाधनों को लोड किया जाएगा जो इतिहास में सहेजे जाएंगे।

  • संसाधनों के लिए जाँच करें जैसे डोमेन में:

http://s3.amazonaws.com/[bucket_name]/
http://[bucket_name].s3.amazonaws.com/
  • CNAMES के लिए जाँच करें क्योंकि resources.domain.com में CNAME bucket.s3.amazonaws.com हो सकता है

  • 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/

Brute-Force

आप बकेट्स को कंपनी से संबंधित नामों को ब्रूट-फोर्स करके खोज सकते हैं जिसे आप पेंटेस्ट कर रहे हैं:

# 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

Loot S3 Buckets

खुले S3 बकेट्स को देखते हुए, BucketLoot स्वचालित रूप से दिलचस्प जानकारी के लिए खोज कर सकता है

Find the Region

आप सभी समर्थित क्षेत्रों को AWS में https://docs.aws.amazon.com/general/latest/gr/s3.html पर पा सकते हैं।

By 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.

Check that the resolved domain have the word "website". आप स्थिर वेबसाइट तक पहुँच सकते हैं: flaws.cloud.s3-website-us-west-2.amazonaws.com या आप बकेट तक पहुँच सकते हैं: flaws.cloud.s3-us-west-2.amazonaws.com

By Trying

यदि आप एक बकेट तक पहुँचने की कोशिश करते हैं, लेकिन डोमेन नाम में आप एक और क्षेत्र निर्दिष्ट करते हैं (उदाहरण के लिए बकेट bucket.s3.amazonaws.com में है लेकिन आप bucket.s3-website-us-west-2.amazonaws.com तक पहुँचने की कोशिश करते हैं, तो आपको सही स्थान पर संकेतित किया जाएगा:

Enumerating the bucket

बकेट की खुली स्थिति का परीक्षण करने के लिए, एक उपयोगकर्ता बस अपने वेब ब्राउज़र में 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

Get Account ID from public Bucket

यह संभव है कि एक AWS खाता निर्धारित किया जाए S3:ResourceAccount नीति स्थिति कुंजी का लाभ उठाकर। यह स्थिति एक खाते में 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 गेटवे URLs, Lambda URLs, डेटा एक्सचेंज डेटा सेट और यहां तक कि टैग के मान प्राप्त करने के लिए भी काम करती है (यदि आप टैग कुंजी जानते हैं)। आप मूल शोध और इस शोषण को स्वचालित करने के लिए उपकरण 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'
}
}
)

References

HackTricks का समर्थन करें

Last updated