25K AWS S3 बाल्टी की खोज

AWS S3 बकेट की अनुमतियों की समस्याएं उतनी ही पुरानी हैं जितनी कि यह सेवा है। मुझे लगता है कि इस मुद्दे के बारे में 2 सबसे अधिक ज्ञात शोध स्काईघ द्वारा इंगित किए गए थे कि सभी S3 बाल्टियों में से 7% खुले हैं और रैपिड 7 ने संकेत दिया है कि 17% भी खुले हैं। आज हम 2018 में हैं और मैंने यह जांचने का निर्णय लिया है कि समस्या की वर्तमान स्थिति क्या है। इसके अतिरिक्त, मैं इस तरह के अनुसंधान करने की अपनी तकनीकों को प्रस्तुत करना चाहता हूं - अगर मैं किसी भी चतुर को याद करता हूं, तो कृपया मुझे टिप्पणियों में बताएं।

कुछ सिद्धांत के साथ शुरू करते हैं

निम्नलिखित URL के उपयोग से सभी AWS S3 बाल्टियाँ सुलभ हो सकती हैं:

https: // [bucket_name] .s3.amazonaws.com /
https: // [aws_endpoint] .amazonaws.com / [bucket_name] /

या AWS CLI का उपयोग कर:

$ aws s3 ls --region [Region_name] s3: // [bucket_name]

नहीं अक्सर लोग एक क्षेत्र पैरामीटर का उपयोग करने की आवश्यकता को इंगित करते हैं। हालाँकि, कुछ बाल्टी किसी क्षेत्र को निर्दिष्ट किए बिना काम नहीं करती हैं। जब यह काम करता है तो मैं एक पैटर्न नहीं देखता हूं और जब यह अच्छा नहीं होता है तो हमेशा इस पैरामीटर को जोड़ना है :)

इसलिए, आम तौर पर एक मान्य बकेट खोजने के लिए s3.amazonaws.comor [aws_endpoint] .amazonaws.com का एक उपडोमेन ढूंढने के बराबर होता है। नीचे मैं 4 तरीकों से जाने वाला हूं जो इस कार्य में सहायक हो सकते हैं।

Bruteforcing

प्रत्येक बकेट का नाम अद्वितीय होना चाहिए और इसमें कुछ अपवादों के साथ केवल 3 से 63 अल्फ़ान्यूमेरिक वर्ण हो सकते हैं (इसमें ‘-‘ या ‘हो सकते हैं। लेकिन इसे शुरू या समाप्त नहीं किया जा सकता है)। कहा जा रहा है कि, हमने सभी S3 बाल्टियों को खोजने के लिए पर्याप्त ज्ञान के साथ हथियार बनाए हैं, लेकिन चलो ईमानदार रहें - यह छोटे नामों के बजाय काम करेगा। फिर भी, लोग नामकरण में कुछ पैटर्न का उपयोग करते हैं, उदा। [company_name] -dev, या [company_name] .backups। एक बार जब आप किसी विशेष कंपनी की बाल्टी की खोज कर रहे होते हैं तो आप आसानी से LazyS3 या aws-s3-bruteforce जैसे उपकरणों का उपयोग करके इस तरह के प्रसिद्ध पैटर्न को सत्यापित करने की एक प्रक्रिया को स्वचालित कर सकते हैं। बता दें कि हमारी एक कंपनी है जिसका नाम Rzepsky है। एक साधारण आदेश: $ माणिक lazys3.rb rzepsky से पता चलता है कि एक rzepsky-dev बाल्टी:

लेकिन क्या होगा अगर आप बिना किसी विशिष्ट नाम के बिना संभव के रूप में कई बाल्टी कटाई करना चाहते हैं? इस पोस्ट को पढ़ते रहिये;)

वेबैक मशीन

क्या आपने कभी वेकबैक मशीन के बारे में सुना है? उद्धरण विकिपीडिया:

वेबैक मशीन वर्ल्ड वाइड वेब का एक डिजिटल आर्काइव है और इंटरनेट आर्काइव द्वारा बनाई गई इंटरनेट की अन्य जानकारी है।

इस डिजिटल संग्रह में कुछ संसाधन अमेज़न के बुनियादी ढांचे पर संग्रहीत हैं। यह कहा जा रहा है, यदि वेबैक मशीन ने S3 बाल्टी पर सिर्फ एक तस्वीर को अनुक्रमित किया है, तो हम इस जानकारी को पुनः प्राप्त कर सकते हैं और जांच सकते हैं कि क्या इस बाल्टी में कोई सार्वजनिक संसाधन हैं या नहीं। यहां तक ​​कि जब अनुक्रमित तस्वीर पहले से ही हटा दी जाती है (या इसे एक्सेस करने से इनकार किया जाता है) तब भी आपके पास बाल्टी का नाम होता है, जो अंदर दिलचस्प फाइलों को खोजने के लिए एक आशा देता है। वेबैक मशीन के एपीआई से पूछने के लिए, आप enum_wayback नामक एक मेटास्प्लोइट मॉड्यूल का उपयोग कर सकते हैं:

जैसा कि आप इस पोस्ट की शुरुआत से याद कर सकते हैं कि आप क्षेत्र विनिर्देश के साथ एक URL का उपयोग करके बाल्टी की सामग्री को भी संदर्भित कर सकते हैं। तो, और भी बेहतर परिणाम प्राप्त करने के लिए, हम एक साधारण बैश वन-लाइनर द्वारा हर संभव अमेज़न S3 के समापन बिंदु के सबडोमेन की जांच कर सकते हैं:

$ पढ़ा -r क्षेत्र; msfconsole -x "का उपयोग \ सहायक / स्कैनर / http / enum_wayback; सेट DOMAIN $ क्षेत्र?"
सेट OUTFILE $ Region.txt; Daud; बाहर निकलें "; किया गया 

बहुत बार वेबैक मशीन आपको सिर्फ एक बाल्टी में रखी हजारों तस्वीरों को वापस कर देती है। तो, आपको केवल वैध और अद्वितीय बकेट नामों को खींचने के लिए कुछ ऑपरेशन करने होंगे। कट और अकोक जैसे कार्यक्रम यहां महान मित्र हैं।

वेबैक मशीन ने मुझे 398,7 एमबी txt फ़ाइलों के रूप में 23498 संभावित बाल्टी दी। उन बाल्टियों में से 4863 सार्वजनिक रूप से खुली थीं।

तृतीय पक्ष को छोड़ना

एक अन्य तकनीक जिसे मैं शुरू करना चाहता हूं, वह है 3 पार्टियों की क्वेरी करना, जैसे Google, बिंग, वायरसटोटल आदि ऐसे कई उपकरण हैं जो बाहरी सेवाओं से रोचक जानकारी की कटाई की प्रक्रिया को स्वचालित कर सकते हैं। उनमें से एक सबलिस्ट 3r है:

फिर से, हमें प्रत्येक क्षेत्र के सबडोमेन की खोज करनी चाहिए और फिर केवल विशिष्ट बाल्टी नामों को बाहर निकालना चाहिए। एक त्वरित बैश वन-लाइनर:

$ पढ़ा -r क्षेत्र; python3 sublist3r.py -d $ region \ do करें
> $ क्षेत्र। किया 

परिणाम के रूप में देता है 756 जिसमें से ... केवल 1 बाल्टी संग्रहणीय था। प्रशासकों के लिए बीयर!

प्रमाणपत्र पारदर्शिता लॉग में खोज

अंतिम तकनीक जो मैं आपको प्रस्तुत करना चाहूंगा, प्रमाणपत्र पारदर्शिता लॉग देखकर बाल्टी नाम खोज रहा है। यदि आप प्रमाणपत्र पारदर्शिता से परिचित नहीं हैं, तो मैं आपको यह प्रस्तुति देखने की सलाह देता हूं। मूल रूप से, प्रत्येक जारी किए गए टीएलएस प्रमाणपत्र को लॉग किया जाता है और वे सभी लॉग सार्वजनिक रूप से सुलभ होते हैं। इस विचार का मुख्य लक्ष्य यह सत्यापित करना है कि कोई प्रमाण पत्र गलती से या दुर्भावनापूर्ण रूप से उपयोग नहीं किया गया है। हालाँकि, सार्वजनिक लॉग के विचार से सभी डोमेन का पता चलता है, जिसमें ... हाँ, S3 बाल्टी भी शामिल हैं। अच्छी खबर यह है कि पहले से ही उपलब्ध उपकरण है जो आपके लिए एक खोज कर रहा है - बाल्टी-धारा। इससे भी अच्छी खबर यह है कि यह उपकरण मिली हुई बाल्टी की अनुमति की पुष्टि भी कर रहा है। इसलिए हमें कोशिश करनी चाहिए:

$ python3 बाल्टी-stream.py --threads 100 --log

571134 संभावनाओं की जाँच के बाद बाल्टी-स्कैनर ने मुझे 398 वैध बाल्टी वापस दे दी। उनमें से 377 खुले थे।

बाल्टी की सामग्री का सत्यापन

ठीक है, हमें हजारों बाल्टी नाम मिले और आगे क्या? ठीक है, आप उदाहरण के लिए जाँच कर सकते हैं कि क्या उनमें से कोई भी बाल्टी जनता के लिए या किसी प्रामाणिक AWS उपयोगकर्ता (जो मूल रूप से सार्वजनिक रूप से समान है) के लिए उपयोग की अनुमति देता है। उस प्रयोजन के लिए आप मेरी स्क्रिप्ट बकेटसेंसर का उपयोग कर सकते हैं - यह बस सभी सुलभ फाइलों को सूचीबद्ध करता है और एक बाल्टी में WRITE अनुमतियों की पुष्टि भी करता है। हालाँकि, इस शोध के उद्देश्य से मैंने निम्नलिखित तरीके से एक बकेट_रीडर विधि को संशोधित किया:

def bucket_reader (bucket_name):
    क्षेत्र = get_region (bucket_name)
    यदि क्षेत्र == 'कोई नहीं':
        उत्तीर्ण करना
    अन्य:
        बकेट = get_bucket (बकेट_नाम)
        परिणाम = ""
        प्रयत्न, कोशिश:
            buck3.objects.all () में s3_object के लिए:
                अगर s3_object.key:
                    प्रिंट "{0} संग्रहणीय है" .format (bucket_name)
                    परिणाम = "{0} \ n" .format (bucket_name)
                    append_output (परिणाम)
                    टूटना

हालांकि, यह अपना काम करने का सबसे सुंदर तरीका नहीं है - अगर बाल्टी में सिर्फ एक फ़ाइल संग्रहणीय थी, तो मेरा संशोधित स्कैनर इस बाल्टी को संग्रहणीय के रूप में रिपोर्ट करता है।

जोखिम

सार्वजनिक रूप से सुलभ फ़ाइलों के बीच आप वास्तव में दिलचस्प पा सकते हैं। लेकिन संवेदनशील डेटा का लीक होना एकमात्र जोखिम नहीं है।

कुछ बाल्टी सार्वजनिक रूप से लेखन योग्य हैं। यह सुनिश्चित करने के लिए कि एक हमलावर मैलवेयर वितरण बिंदु के रूप में इस तरह की बाल्टी का उपयोग कर सकता है। यह और भी डरावना है अगर आप अपने कर्मचारियों के बीच एक वैध सॉफ़्टवेयर वितरित करने के लिए इस तरह की बाल्टी का उपयोग कर रहे हैं - बस ऐसे परिदृश्य की कल्पना करें: आप कंपनी की बाल्टी से एक सॉफ़्टवेयर स्थापित करने के लिए सभी नवागंतुकों का मार्गदर्शन कर रहे हैं और यह सॉफ़्टवेयर पहले से ही एक हमलावर द्वारा अधिलेखित है संक्रमित इंस्टॉलर। इस परिदृश्य की अन्य भिन्नता S3 शोधकर्ताओं को ट्रोल करेगी - उदा। एक आकर्षक नाम के साथ संक्रमित फ़ाइल अपलोड करके, जैसे "वेतन रिपोर्ट - 2017.pdf" (निश्चित रूप से सभी जिम्मेदार शोधकर्ता हमेशा अविश्वासित फ़ाइलों को सैंडबॉक्स वातावरण में डाउनलोड करते हैं, सही है?)

सार्वजनिक रूप से लिखने योग्य बाल्टियों के साथ एक और जोखिम यह है कि आप अपना सारा डेटा खो सकते हैं। भले ही आपके पास बाल्टी की वस्तुओं के लिए DELETE अनुमतियां नहीं हैं, लेकिन सिर्फ एक WRITE अनुमति के बावजूद आप अभी भी किसी भी फ़ाइल को अधिलेखित कर सकते हैं। कहा जा रहा है, अगर आप किसी भी फाइल को खाली फाइल से ओवरराइट करते हैं तो इसका मतलब है कि यह फाइल अब किसी के लिए उपलब्ध नहीं है। आइए इस उदाहरण को देखें:

एकमात्र तंत्र जो आपके डेटा को ऐसे परिदृश्य में सहेज सकता है, एक संस्करण को सक्षम कर रहा है। हालांकि, यह तंत्र महंगा हो सकता है (यह आपकी बाल्टी में प्रयुक्त स्थान के आकार को दोगुना कर देता है) और बहुत से लोग इसका उपयोग करने का निर्णय नहीं लेते हैं।

मैंने एक तर्क भी सुना है:

ओह, यह परीक्षण के उद्देश्य के लिए सिर्फ एक बाल्टी है।

ठीक है, यदि आपका "परीक्षण" बाल्टी अवैध सामग्री के लिए एक भंडारण बन जाता है, तो ... क्षमा करें दोस्त लेकिन यह आपके क्रेडिट कार्ड को इस खाते में भेज दिया गया है।

कोई उज्जवल भविष्य?

S3 बकेट अनुमतियों के साथ समस्या अभी भी मौजूद है और मैं निकट भविष्य में एक शानदार बदलाव की उम्मीद नहीं करता। IMHO लोग सार्वजनिक एक्सेस देते हैं, क्योंकि यह हमेशा काम करता है - जब S3 सेवा अन्य सेवाओं के साथ सहयोग करती है तो आपको अनुमतियों को निर्दिष्ट करने की चिंता नहीं करनी चाहिए। अन्य कारण अनुमतियों को कॉन्फ़िगर करने में एक साधारण गलती हो सकती है (जैसे कि एक बाल्टी पॉलिसी में गलत जगह पर "*" चरित्र डालना) या पूर्वनिर्धारित समूहों को नहीं समझना (जैसे कि कोई समूह "कोई भी प्रमाणित एडब्ल्यूएस खाता" अभी भी एडब्ल्यूएस के माध्यम से स्थापित किया जा सकता है CLI)।

एक अन्य समस्या यह है कि ऐसी समस्याओं की रिपोर्ट कैसे की जाए? बाल्टी पर कोई ईमेल पिन नहीं किया गया है, जिससे आप कभी सुनिश्चित नहीं हो सकते कि आपको किससे संपर्क करना चाहिए। बाल्टियों के नाम इंगित कर सकते हैं कि वे कंपनी एक्स से संबंधित हैं, लेकिन याद रखें कि कोई भी इसे शिथिल नाम दे सकता है। इसलिए ट्रोलर्स के लिए देखें!

सारांश

24652 स्कैन की गई बाल्टियों के लिए मैं 5241 बाल्टियों (21%) से फाइलें एकत्र करने और 1365 बाल्टियों (6%) में मनमानी फाइलें अपलोड करने में सक्षम था। परिणामों के आधार पर मैं बिना किसी संदेह के कह सकता हूं कि समस्या अभी भी मौजूद है। जबकि कुछ बाल्टी जानबूझकर खोली जाती हैं (उदा। कुछ चित्र, कंपनी ब्रोशर आदि) परोसते हैं, दोनों में से कोई भी सार्वजनिक रूप से लिखने योग्य नहीं होना चाहिए। मुझे पूरा यकीन है कि और भी अधिक बाल्टी खोजने के अन्य शांत तरीके हैं, इसलिए केवल उचित प्रतिवाद लगता है ... अपने बाल्टी के लिए सही अनुमतियाँ सेट करना

कृपया अपने AWS किंगडम को सुरक्षित करने के लिए मेरा सेवन-स्टेप गाइड भी देखें।