
क्लाउड क्रेडेंशियल्स से ब्रूट-फोर्स परीक्षण के माध्यम से विशेषाधिकार निर्धारित करें।
मेरे पास क्रेडेंशियल्स हैं, अब क्या?
CloudPrivs एक ऐसा उपकरण है जो Boto3 जैसे SDK की मौजूदा शक्ति का लाभ उठाकर सभी क्लाउड सेवाओं की विशेषाधिकारों का पता लगाने के लिए ब्रूट फ़ोर्स करता है, ताकि यह निर्धारित किया जा सके कि क्रेडेंशियल्स के एक निश्चित सेट के लिए कौन से विशेषाधिकार मौजूद हैं।
यह उपकरण पेंटेस्टर्स, रेड टीमर्स और अन्य सुरक्षा पेशेवरों के लिए उपयोगी है। क्लाउड सेवाएँ आमतौर पर यह निर्धारित करने का कोई तरीका नहीं देती हैं कि क्रेडेंशियल्स के एक सेट के पास कौन सी अनुमतियाँ हैं, और सेवाओं और संचालन की विशाल संख्या मैन्युअल रूप से पुष्टि करना एक कठिन कार्य बनाती है। इसका मतलब यह हो सकता है कि क्रेडेंशियल्स के एक सेट से विशेषाधिकार वृद्धि संभव हो सकती है, लेकिन कोई इसके बारे में कभी नहीं जान पाएगा क्योंकि वे बस यह नहीं जानते कि उन्हें मिले AWS क्रेडेंशियल्स Lambda निष्पादित कर सकते हैं।
वर्तमान में PyPi पर उपलब्ध नहीं है, लेकिन इस पर काम कर रहा हूँ
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
यह वर्चुअल वातावरण के बिना है और यदि आप कई पायथन प्रोग्राम चलाते हैं तो अनुशंसित नहीं है
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # activate.ps1 on windows
python -m pip install -e .
यदि उपलब्ध हो तो आप Pyenv+virtualenv का भी उपयोग कर सकते हैं:
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
pyenv virtualenv CloudPrivs
pyenv local CloudPrivs
python -m pip install -e .
cloudprivs [PROVIDER] [ARGS]
वर्तमान में एकमात्र उपलब्ध प्रदाता AWS है, लेकिन मैं GCP पर काम कर रहा हूँ। यदि आप मदद करना चाहते हैं तो #Customizing देखें।
Options:
-v, --verbose आउटपुट में असफल और त्रुटिपूर्ण परीक्षण दिखाएँ
-s, --services TEXT सभी उपलब्ध सेवाओं के बजाय केवल दी गई सेवाओं का परीक्षण करें
-p, --profile TEXT स्कैन करने के लिए AWS प्रोफ़ाइल का नाम, यदि निर्दिष्ट नहीं है तो ENV वेरिएबल का उपयोग किया जाएगा
-t, --custom-tests FILENAME कस्टम परीक्षण YAML फ़ाइल का स्थान। अधिक जानकारी के लिए दस्तावेज़ पढ़ें
-r, --regions TEXT क्षेत्रों से मिलान करने के लिए फ़िल्टर की सूची, जैसे "us", "eu-west", "ap-north-1"
--help यह संदेश दिखाएँ और बाहर निकलें।
--region और --service के लिए एकाधिक तर्क समर्थित हैं, हालाँकि उन्हें हर बार फ़्लैग के साथ प्रदान किया जाना चाहिए, जैसे cloudprivs aws -r us -r eu -s ec2 -s lambda। मुझे भी यह पसंद नहीं है, लेकिन यह Click की एक सीमा है जिसका समाधान मुझे अभी तक नहीं मिला है।
ध्यान दें कि
regionफ़्लैग आंशिक मिलान का समर्थन करता है, सबसे सामान्य तर्क सामान्य क्षेत्रों को कवर करने के लिए-r us -r euहैं
परिणाम क्षेत्र के अनुसार समूहित होकर प्रदर्शित होते हैं और प्रत्येक पंक्ति में एक परीक्षण मामला और परीक्षण का परिणाम होता है।
यदि उपकरण परीक्षण के दौरान अप्रत्याशित त्रुटियों का सामना करता है, तो वे घटित होने पर stderr पर उत्सर्जित होंगी, जिसका अर्थ है कि वे आउटपुट के प्रवाह को बाधित कर सकती हैं, यदि आप उन्हें नहीं देखना चाहते हैं तो आप stderr को पुनर्निर्देशित कर सकते हैं।
WeirdAAL जैसे अन्य उपकरणों के विपरीत जो प्रत्येक परीक्षण मामले को हाथ से लिखते हैं, CloudPrivs सीधे Boto3 SDK से क्वेरी करके सभी उपलब्ध सेवाओं और प्रत्येक सेवा के लिए सभी उपलब्ध क्षेत्रों की एक सूची गतिशील रूप से उत्पन्न करता है।
एक बार पूरी सूची उत्पन्न हो जाने के बाद, डिफ़ॉल्ट रूप से प्रत्येक फ़ंक्शन को बिना तर्कों के कॉल किया जाता है, हालाँकि प्रति संचालन में कस्टम तर्क जोड़ने का विकल्प समर्थित है (अधिक जानकारी के लिए #Customizing देखें)
नोट: कुछ AWS फ़ंक्शन कॉल करने पर लागत लग सकती है, मैंने केवल
get_,list_, औरdescribe_से शुरू होने वाले संचालन की अनुमति दी है ताकि आकस्मिक लागत को कम किया जा सके, जो मेरे अपने परीक्षण में सुरक्षित प्रतीत होता है, लेकिन कृपया सावधानी से उपयोग करें। यह enumerate-iam जैसे अन्य उपकरणों के लिए सुरक्षित प्रतीत होता है, मैं गारंटी नहीं देता कि सभी फ़ंक्शन (भले ही बिना तर्कों के) को कॉल करने पर आपको अनजाने में लागत नहीं लगेगी
CloudPrivs दो क्षेत्रों में आसान विस्तार/अनुकूलन का समर्थन करता है:
एक नया प्रदाता (जैसे GCP) लागू करना सरल है
CloudPrivs/providers फ़ोल्डर के अंतर्गत, अपने प्रदाता के लिए एक नया फ़ोल्डर बनाएं (जैसे 'gcp')CloudPrivs/providers/__init__.py फ़ाइल में, अपने प्रदाता को __all__ वेरिएबल में जोड़ें, यह फ़ोल्डर के नाम से मेल खाना चाहिएcli.py नामक एक फ़ाइल बनाएंcli रखें (संदर्भ के लिए AWS प्रदाता देखें)cloudprivs <provider> चलाने पर आपका CLI दिखना चाहिएAWS प्रदाता AWS फ़ंक्शन को कॉल करते समय तर्कों को इंजेक्ट करने का समर्थन करता है। यह सुविधा प्रदान की गई है क्योंकि अक्सर AWS फ़ंक्शन को कॉल करने के लिए तर्कों की आवश्यकता होती है और कुछ मामलों में ये तर्क निश्चित चर हो सकते हैं। इसका मतलब है कि यदि हम डमी चर प्रदान कर सकते हैं तो हम अपने परीक्षण कवरेज को बढ़ा सकते हैं। अन्य मामलों में हम तर्कों जैसे dryrun=true को इंजेक्ट कर सकते हैं ताकि कॉल तेज़ हो जाएं।
कस्टम परीक्षण cloudprivs/providers/aws/CustomTests.yaml पर एक YAML फ़ाइल में संग्रहीत हैं।
YAML की संरचना इस प्रकार है:
---
<service-name>:
- <function-name>:
args:
- <arg1>
- <arg2>
kwargs:
arg1: val1
arg2: val2
नोट: फ़ंक्शन नाम आंशिक मिलान के साथ काम करता है, इसका मतलब है कि आप 'describe_' जैसे फ़ंक्शन नाम का उपयोग कर सकते हैं और निर्दिष्ट तर्क उन सभी फ़ंक्शनों में इंजेक्ट किए जाएंगे जिनमें 'describe_' शामिल है। नियम 'पहले पाए गए' आधार पर मिलान किए जाते हैं, इसलिए यदि आप किसी सामान्य नियम को ओवरराइड करना चाहते हैं, तो अपने अधिक विशिष्ट नियम को सामान्य नियम के ऊपर रखें। उदाहरण:
ec2:
- describe_instances
args:
kwargs:
DryRun: True
NoPaginate: True
- describe_
args:
kwargs:
DryRun: True
नए नियमों को या तो मौजूदा CustomTests.yaml फ़ाइल को संशोधित करके या एक नई YAML फ़ाइल बनाकर और --custom-tests फ़्लैग के साथ निर्दिष्ट करके जोड़ा जा सकता है। नई फ़ाइल को मौजूदा परीक्षण फ़ाइल के साथ मर्ज किया जाएगा और किसी भी डुप्लिकेट मान को प्रदान की गई फ़ाइल को प्राथमिकता देते हुए ओवरराइड किया जाएगा।
AWS प्रदाता को अन्य उपकरणों में एकीकरण के लिए एक लाइब्रेरी के रूप में लिखा गया है। आप इसका उपयोग इस प्रकार कर सकते हैं:
import boto3
from cloudprivs.providers.aws import service
from concurrent.futures import ThreadPoolExecutor
session = boto3.Session('default')
with ThreadPoolExecutor(15) as executor:
iam = service.Service('iam', session, executor=executor)
scan_results = iam.scan() # executor में सूचीबद्ध सभी क्षेत्रों को कवर करेगा (डिफ़ॉल्ट रूप से सभी उपलब्ध क्षेत्र)
formatted_results iam.pretty_print_scan(scan_results)
print(formatted_results)
कोड में सब कुछ पूरी तरह से दस्तावेज़ीकृत है, इसे पार्स करना काफी आसान होना चाहिए।
यह उपकरण कार्यात्मक है, लेकिन पूर्ण से बहुत दूर है। मैं सक्रिय रूप से नई सुविधाओं पर काम कर रहा हूँ और योगदान के लिए खुला हूँ, इसलिए कृपया Issues/Feature Requests खोलने और PRs भेजने के लिए स्वतंत्र महसूस करें।
योजनाबद्ध सुविधाएँ