
تحديد الصلاحيات من بيانات اعتماد السحابة عبر اختبار القوة العمياء.
لدي بيانات الاعتماد، ماذا الآن؟
CloudPrivs هي أداة تستخدم القوة الحالية لمجموعات تطوير البرمجيات (SDKs) مثل Boto3 لاختبار صلاحيات جميع الخدمات السحابية بطريقة القوة العمياء (brute force) لتحديد الصلاحيات المتاحة لمجموعة معينة من بيانات الاعتماد.
هذه الأداة مفيدة لمختبري الاختراق، وأعضاء فرق الاختبار الأحمر، وغيرهم من محترفي الأمن. عادةً لا توفر الخدمات السحابية طريقة لتحديد الأذونات التي تمتلكها مجموعة معينة من بيانات الاعتماد، كما أن العدد الهائل من الخدمات والعمليات يجعل من الصعب التأكيد يدويًا. قد يعني هذا أن تصعيد الصلاحيات قد يكون ممكنًا من مجموعة من بيانات الاعتماد، لكن قد لا يعرف أحد ذلك أبدًا لأنه ببساطة لا يعلم أن بيانات اعتماد AWS التي وجدها يمكنها تنفيذ Lambda.
غير متوفر حاليًا على PyPi لكنني أعمل على ذلك
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m pip install -e .
هذا بدون بيئة افتراضية ولا يُنصح به إذا كنت تشغل العديد من برامج Python.
git clone https://github.com/AbstractClass/CloudPrivs
cd CloudPrivs
python -m venv venv/
./venv/bin/activate # activate.ps1 على ويندوز
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 [المزود] [الوسائط]
المزود الوحيد المتاح حاليًا هو AWS، لكنني أعمل على GCP. إذا كنت ترغب في المساعدة، انظر #التخصيص.
Options:
-v, --verbose إظهار الاختبارات الفاشلة والإشكالات في المخرجات
-s, --services TEXT اختبار الخدمات المحددة فقط بدلاً من جميع الخدمات المتاحة
-p, --profile TEXT اسم ملف تعريف AWS للمسح الضوئي، إذا لم يُحدد ستُستخدم متغيرات البيئة
-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 لتوليد قائمة ديناميكية بجميع الخدمات المتاحة وجميع المناطق المتاحة لكل خدمة.
بمجرد إنشاء القائمة الكاملة، تُستدعى كل دالة بدون وسائط افتراضيًا، مع دعم إضافة وسائط مخصصة لكل عملية (مزيد من المعلومات في #التخصيص).
تحذير: بعض دوال 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 لجعل الاستدعاءات أسرع.
يتم تخزين الاختبارات المخصصة في ملف YAML في cloudprivs/providers/aws/CustomTests.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).
الميزات المخطط لها