
وضع الكفاح من أجل الحرية: مجموعة أدوات اختراق مفتوحة المصدر
FFM هي أداة تسخير اختراق يمكنك استخدامها خلال مرحلة ما بعد الاستغلال في مشاركة فريق الاختراق الأحمر (Red Teaming). تم اشتقاق فكرة الأداة من محاضرة عام 2007 من @thegrugq.
تم تقديمها في SSTIC 2018 (فيديو) وشرائح العرض المصاحبة متاحة على هذا الرابط. إذا لم تكن على دراية بهذا النوع من الأدوات، يُنصح بشدة بإلقاء نظرة عليها لفهم الغرض من أداة التسخير (hacking harness). جميع التعليقات مضمنة في الشرائح.
هذا المشروع موزع بموجب شروط رخصة GPL v3.
التوثيق الأساسي موجود في هذا الملف README ووحدات الأوامر ضمن commands/.
روابط محاضرة SSTIC المذكورة أعلاه تظل أفضل خلفية عالية المستوى لكيفية استخدام الأداة.
مواد إضافية للشرح متوفرة على:
ice-wzl ساهم بأوامر وتوثيق وإعادة هيكلة خلال تاريخ المشروع.docker مع هذه الأداة.Dockerfile في هذا المستودع سيقلل بشكل كبير من الأخطاء المحتملة.Docker على نظامك المحلي.git clone https://github.com/JusticeRage/FFM.git
cd /FFM
docker build Docker_Install/ -t ffm:ffm
docker image list
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/ffm ffm fb6dd17e3b91 9 minutes ago 614 MB
docker.io/library/ubuntu 22.04 3b418d7b466a 2 weeks ago 80.3 MB
# لتشغيل الحاوية الجديدة والدخول إلى موجه /bin/bash كمستخدم جذر
docker run -it --entrypoint /bin/bash -u 0 fb6dd17e3b91
passwd لكل من root و neosu neo وستكون جاهزًا. git clone https://github.com/JusticeRage/FFM.git
cd /FFM
pip install -r requirements.txt
الهدف من أداة التسخير (hacking harness) هو العمل كمساعد يقوم بأتمتة المهام الشائعة خلال مرحلة ما بعد الاستغلال، وكذلك حماية المستخدم من الأخطاء التي قد يرتكبها.
إنها أدوات للقشرة (shell). قم بتشغيل ./ffm.py لتفعيلها، ويمكنك البدء في العمل فورًا. الأوامر موزعة عبر وحدات صغيرة ضمن commands/، مع commands/command_manager.py المسؤول عن اكتشافها وتسجيلها. المجموعات الرئيسية هي: التعداد (enumeration)، المساعدة (help)، التخفي (stealth)، النقل (transfer)، والتنفيذ (execution).
هناك أمران يجب أن تعرفهما:
!list لعرض جميع الأوامر التي توفرها الأداة.!list tags لرؤية العلامات المختلفة التي يمكن تصنيف الأوامر تحتها.!list tags
قائمة الأوامر المتاحة:
enumeration
execution
help
stealth
transfer
!list enumeration (أو أي علامة أخرى) لرؤية الأوامر التي تندرج تحت هذه الفئة.!list enumeration
قائمة الأوامر المتاحة:
!backup-hunter: يبحث عن ملفات النسخ الاحتياطي
!info: يعرض معلومات وحدة المعالجة المركزية (CPU)، والبنية (Architecture)، والذاكرة (Memory)، وإصدار النواة (Kernel Version) للجهاز الحالي.
!log: يفعّل أو يعطّل تسجيل مدخلات ومخرجات الأداة في ملف.
!mtime: يعرض الملفات التي تم تعديلها في آخر X دقيقة
!os: يعرض توزيعة نظام التشغيل للجهاز الحالي.
!db-hunter: يبحث عن ملفات .sqlite و .sqlite3 و .db
!sshkeys: يبحث عن مفاتيح SSH الخاصة والعامة على الجهاز الحالي.
!suid: يبحث عن الملفات الثنائية ذات بتات SUID و SGID على الجهاز الحالي.
--snip--
SHIFT+TAB لإتمام الأوامر على الجهاز المحلي. قد يكون هذا مفيدًا إذا كنت متصلاً عبر SSH بجهاز بعيد ولكنك تحتاج إلى الإشارة إلى ملف موجود على جهازك.توفر أداة التسخير هذه بعض الميزات الموضحة أدناه. أثناء شرحها، سيتم أيضًا تقديم فلسفة تصميم الأداة. ليس من المتوقع أن تناسبك جميع الأوامر المطبقة في FFM. لكل شخص طريقته الخاصة في القيام بالأشياء، ومن المحتمل أن يتطلب ضبط الأداة لاحتياجاتك الخاصة تعديل بعض الكود و/أو كتابة عدد قليل من الإضافات (plugins). تم بذل الكثير من الجهد لضمان أن تكون هذه مهمة سهلة.
!os أمر بسيط للغاية يقوم فقط بتشغيل cat /etc/*release* لعرض نظام التشغيل الذي يعمل عليه الجهاز الحالي. ربما يكون أكثر قيمة كدليل على أنه في سياق أداة التسخير، يمكنك تعريف اختصارات (aliases) تعمل عبر حدود الأجهزة. اتصل بـ SSH بأي جهاز واكتب !os وسيتم تنفيذ الأمر. أوامر التعداد موجودة في commands/enumeration_commands.py، وأوامر المساعدة في commands/help_commands.py، والأوامر المتعلقة بالتخفي موزعة عبر commands/stealth_commands.py و commands/notty_sudo.py و commands/log_control.py.!backup-hunter يبحث عن ملفات النسخ الاحتياطي!info يعرض معلومات وحدة المعالجة المركزية (CPU)، والبنية (Architecture)، والذاكرة (Memory)، وإصدار النواة (Kernel Version) للجهاز الحالي.!log يفعّل أو يعطّل تسجيل مدخلات ومخرجات الأداة في ملف. مطبق في commands/log_control.py.!download [ملف بعيد] [مسار محلي] يحصل على ملف من الجهاز البعيد وينسخه محليًا عبر الطرفية. هذا الأمر أكثر تعقيدًا بعض الشيء لأن التحقق من الأخطاء الأكثر دقة مطلوب، لكنه أمر آخر يمكنك قراءته بسهولة للبدء. موجود في commands/download_file.py. لاحظ أنه يتطلب xxd أو od على الجهاز البعيد ليعمل بشكل صحيح.!download-dir [دليل بعيد] [وجهة محلية] يقوم ببث أرشيف tar لدليل بعيد عبر الطرفية ويستخرجه محليًا دون لمس نظام الملفات البعيد. موجود في commands/download_directory.py. يتطلب tar و base64 على الجهاز البعيد، ويستخدم gzip أيضًا عندما يكون متاحًا.!upload [ملف محلي] [مسار بعيد] يعمل تمامًا مثل الأمر السابق، باستثناء أنه يتم وضع ملف محلي على الجهاز البعيد. موجود في commands/upload_file.py.!sh [سكريبت محلي] يقوم بتشغيل سكريبت شل من الجهاز المحلي في الذاكرة. موجود في commands/remote_script.py.!py [سكريبت محلي] يقوم بتنفيذ سكريبت Python محلي على الجهاز البعيد، ويفعل ذلك بالكامل في الذاكرة. موجود في commands/remote_script.py. اطّلع على مستودعي الآخر للحصول على سكريبتات قد ترغب في استخدامها. يستخدم هذا الأمر بناء جملة متعدد الأسطر مع <<، مما يعني أن القشرة الزائفة (pseudo-shells) التي لا تدعم ذلك (Weevely مثال جيد) ستكسر هذا الأمر بشكل كبير.!py3 [سكريبت محلي] يفعل نفس الشيء تمامًا للأنظمة التي تحتوي على Python3. يستخدم نفس الوحدة commands/remote_script.py.!elf [ملف محلي] يقوم بتشغيل ملف تنفيذي من الجهاز المحلي في الذاكرة باستخدام أي مترجم Python متوافق متاح على الجهاز البعيد. موجود في commands/remote_elf.py.!pty يقوم بإنشاء TTY، وهو شيء لا تريده في معظم الحالات لأنه يميل إلى ترك أدلة جنائية. ومع ذلك، فإن بعض الأوامر (sudo) أو ثغرات الاستغلال تتطلب TTY للتشغيل، لذلك يتم توفير هذا للراحة. يتم تمرير UNSET HISTFILE HISTFILESIZE HISTSIZE PROMPT_COMMAND إليه بمجرد إنشائه، بالإضافة إلى export TERM=xterm!sudo يستدعي sudo بدون TTY. موجود في commands/notty_sudo.py.يمكن تكوين الإضافات (plugins) بشكل أكبر عن طريق تحرير ffm.conf.
من الناحية النظرية، تُستخدم الأوامر (كما هو موضح أعلاه) لإنشاء بعض أوامر bash التي يتم إعادة توجيهها إلى القشرة. يمكنها إجراء عمليات أكثر تعقيدًا من خلال التقاط مخرجات القشرة وإنشاء تعليمات إضافية بناءً على ما يتم إرجاعه.
تختلف المعالجات قليلاً حيث يتم استخدامها بدلاً من ذلك لإعادة كتابة البيانات المتداولة بين المستخدم وعملية bash الأساسية. بينما قد يكون من الصحيح أن أي معالج يمكن إعادة كتابته كأمر، إلا أنه يبدو أكثر نظافة لفصل الاثنين. تعمل معالجات الإدخال (input processors) على أي شيء يكتبه المستخدم بمجرد الضغط على مفتاح ENTER، ويمكن لمعالجات الإخراج (output processors) تعديل أي شيء يتم إرجاعه بواسطة القشرة.
processors/ssh_command_line.py. كل ما يفعله هو إضافة خيار -T إلى أي أمر SSH يراه إذا كان مفقودًا. تأكد من الاطلاع على الكود البسيط الخاص به إذا كنت مهتمًا بكتابة معالج.processors/assert_torify.py، يحتوي على قائمة سوداء لأوامر الشبكات (ssh, nc) ويحظرها إذا لم تكن تبدو وكأنها موجهة عبر أداة مثل torify. تبذل الأداة قصارى جهدها لإزعاج المستخدم فقط إذا بدا أن الأمر يتم تشغيله على الجهاز المحلي. من الواضح أن هذا لا ينبغي أن يكون الحماية الوحيدة ضد تسريب عنوان IP المنزلي.processors/sample_output_processor.py هو معالج إخراج بسيط جدًا يقوم بتمييز أي ظهور لكلمة "password" باللون الأحمر. نظرًا لأنه عديم الفائدة تمامًا، فهو غير مفعل في الإطار ولكن لا يزال بإمكانك استخدامه كنقطة بداية إذا كنت ترغب في القيام بشيء أكثر تطورًا.CTRL+R لم يتم تنفيذه بعد وكلنا نفتقده بشدة.
الأكثر إشكالية هو حقيقة أن الإطار (framework) يتعطل من وقت لآخر. في 99% من الحالات، يحدث هذا عندما يفشل في اكتشاف أن الأمر الذي أطلقه قد انتهى من التشغيل. عادةً، هذا يعني أن موجه الأوامر (command prompt) للجهاز الذي قمت بتسجيل الدخول إليه لم يتم التعرف عليه على هذا النحو. في هذه الحالة، يمكنك محاولة تحسين التعبير النمطي (regular expression) الموجود في بداية ملف ffm.py، أو تسجيل الدخول إلى نفس الجهاز باستخدام ssh -T لأنه لن يكون هناك موجه إشكالي بعد ذلك.
بشكل افتراضي، سيتخلى FFM عن محاولة قراءة مخرجات الأمر بعد 5 دقائق (قد تنفذ بعض الإضافات مهلات زمنية مختلفة)؛ لذلك إذا تعطل الإطار، ستحتاج إلى الانتظار حتى ترى رسالة خطأ (على الرغم من أنه إذا كانت العملية الأساسية لا تزال قيد التشغيل، فقد لا تزال غير قادر على كتابة الأوامر).
أعتقد أنني غطيت كل شيء عن هذه الأداة. مرة أخرى، إنها مختلفة قليلاً عما أطلقه عادةً حيث سيحتاج معظم الناس على الأرجح إلى تعديلها قبل أن تكون ذات قيمة بالنسبة لهم.
لا تزال العديد من الإضافات (plugins) بحاجة إلى الكتابة، لذا تأكد من مشاركة أي تحسينات تجريها على FFM. لا تتردد في فتح مشكلات (issues) ليس فقط للأخطاء، ولكن أيضًا إذا كنت تحاول القيام بشيء ما ولا تستطيع معرفة كيفية القيام به؛ وبهذه الطريقة سأتمكن من تحسين التوثيق للجميع.
!mtime يعرض الملفات التي تم تعديلها في آخر X دقيقة. على سبيل المثال !mtime 5 سيجلب جميع الملفات على الجهاز المحلي (التي لديك صلاحية رؤيتها) التي تم تعديلها في آخر 5 دقائق.!db-hunter يبحث عن ملفات .sqlite و .sqlite3 و .db وملفات قواعد بيانات أخرى!sshkeys يبحث عن مفاتيح SSH الخاصة والعامة على الجهاز الحالي.!suid يبحث عن الملفات الثنائية ذات بتات SUID و SGID على الجهاز الحالي.!strange-dirs يتحقق من الجهاز بدءًا من المسار الذي يحدده المستخدم بحثًا عن أدلة غريبة على المضيف!sudo-version يتحقق من وجود إصدار ضعيف من sudo!vm يتحقق مما إذا كان الجهاز جهازًا افتراضيًا (Virtual Machine)