AWS - S3 Unauthenticated Enum

HackTricks को समर्थन दें

S3 Public Buckets

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

कंपनियों के पास buckets permissions गलत-संविधान हो सकते हैं जो या तो सब कुछ या किसी भी खाते में AWS में प्रमाणित सभी को पहुंच प्रदान करते हैं (इसलिए किसी को भी)। ध्यान दें, कि ऐसी गलत-संविधान के बावजूद कुछ क्रियाएं नहीं की जा सकती हैं क्योंकि buckets के पास अपनी स्वयं की access control lists (ACLs) हो सकती हैं।

AWS-S3 गलत-संविधान के बारे में यहाँ जानें: http://flaws.cloud और http://flaws2.cloud/

AWS Buckets ढूंढना

जब कोई वेबपेज कुछ संसाधनों को संग्रहीत करने के लिए AWS का उपयोग कर रहा है, तो उसे ढूंढने के विभिन्न तरीके:

Enumeration & OSINT:

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

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

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

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 की जाँच करें, एक वेब जिसमें पहले से खुले buckets खोजे गए हैं।

  • bucket name और bucket domain name को समान होना चाहिए।

  • 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 देता है।

  • यह जांचने के लिए कि यह एक bucket है, आप https://flaws.cloud.s3.amazonaws.com/ पर भी जा सकते हैं।

Brute-Force

आप कंपनी से संबंधित नामों को brute-forcing करके buckets पा सकते हैं जिसे आप pentesting कर रहे हैं:

# permutations बनाने के लिए एक wordlist उत्पन्न करें
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

# परीक्षण करने के लिए डोमेन और उपडोमेन पर आधारित एक wordlist उत्पन्न करें
## उन डोमेन और उपडोमेन को 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

# हमले के लिए डोमेन और उपडोमेन की सूची के आधार पर permutations बनाएं
goaltdns -l /tmp/words-hosts-s3.txt -w /tmp/words-s3.txt -o /tmp/final-words-s3.txt.temp
## पिछला उपकरण उपडोमेन के लिए permutations बनाने में विशेषज्ञ है, उस सूची को फ़िल्टर करें
### ". " के साथ समाप्त होने वाली पंक्तियों को हटाएं
cat /tmp/final-words-s3.txt.temp | grep -Ev "\.$" > /tmp/final-words-s3.txt.temp2
### TLD के बिना सूची बनाएं
cat /tmp/final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp/final-words-s3.txt.temp3
### बिंदुओं के बिना सूची बनाएं
cat /tmp/final-words-s3.txt.temp3 | tr -d "." > /tmp/final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### हाइफन के बिना सूची बनाएं
cat /tmp/final-words-s3.txt.temp3 | tr "." "-" > /tmp/final-words-s3.txt.temp5

## अंतिम 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

## s3scanner को कॉल करें
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Loot S3 Buckets

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

Region ढूंढें

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

DNS द्वारा

आप dig और nslookup के साथ एक bucket का region प्राप्त कर सकते हैं, खोजे गए 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.

Resolved domain में "website" शब्द है यह जांचें। आप static website को यहाँ जाकर access कर सकते हैं: flaws.cloud.s3-website-us-west-2.amazonaws.com या आप bucket को यहाँ visit करके access कर सकते हैं: flaws.cloud.s3-us-west-2.amazonaws.com

कोशिश करके

यदि आप एक bucket को access करने की कोशिश करते हैं, लेकिन domain name में आप दूसरी region specify करते हैं (उदाहरण के लिए bucket bucket.s3.amazonaws.com में है लेकिन आप bucket.s3-website-us-west-2.amazonaws.com को access करने की कोशिश करते हैं), तो आपको सही location की ओर निर्देशित किया जाएगा:

Bucket को Enumerate करना

Bucket की openness को test करने के लिए, एक user बस अपने web browser में URL enter कर सकता है। एक private bucket "Access Denied" के साथ respond करेगा। एक public bucket पहले 1,000 objects को list करेगा जो stored हैं।

सभी के लिए खुला:

Private:

आप इसे cli के साथ भी check कर सकते हैं:

#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>

Public URL template

https://{user_provided}.s3.amazonaws.com

Get Account ID from public Bucket

यह संभव है कि एक AWS खाता निर्धारित किया जा सके नए S3:ResourceAccount Policy Condition Key का लाभ उठाकर। यह स्थिति 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 खाते से संबंधित है

जैसा कि इस ब्लॉग पोस्ट में समझाया गया है, यदि आपके पास एक बकेट को सूचीबद्ध करने की अनुमतियाँ हैं तो यह संभव है कि एक accountID की पुष्टि की जा सके कि बकेट किस खाते से संबंधित है, एक अनुरोध भेजकर:

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" है, तो इसका मतलब है कि खाता ID गलत थी।

Root account enumeration के रूप में उपयोग किए गए Emails

जैसा कि इस ब्लॉग पोस्ट में समझाया गया है, यह जांचना संभव है कि कोई ईमेल पता किसी AWS खाते से संबंधित है या नहीं, एक S3 bucket पर ACLs के माध्यम से ईमेल अनुमतियाँ देने का प्रयास करके। यदि इससे कोई त्रुटि उत्पन्न नहीं होती है, तो इसका मतलब है कि ईमेल किसी AWS खाते का root user है:

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