
مبني على CVE-2018-10933
CVE-2018-10933 هي ثغرة اكتُشفت في إصدارات مختارة من libSSH، ويمكن أن تسمح بالوصول غير المقيد إلى الجهاز. تنشأ الثغرة من المعالجة غير السليمة لترويسات الحزم أثناء عملية المصادقة، حيث يمكن أن يسمح إرسال حزمة مصممة بعناية تحتوي على البايت MSG_USERAUTH_SUCCESS لأي شخص بتجاوز المصادقة. ثم يحصل بعدها على وصول كامل إلى الجهاز.
وبناءً على ذلك، يتمثل أساس هذا التحدي في مطالبة المتنافسين باستكشاف صورة docker المقدمة، واكتشاف هذه الثغرة، واستغلالها للوصول إلى الجهاز، ثم العثور على المفتاح المخفي في رابط رمزي (symlink) على الجهاز.
Someone got into my machine via port 22...
It looks like they didnt even know my credentials.
Anyways, they made a file with an odd name, but it's gone now,
I wonder if there's still some trace of the filename -
it might be something symbolic of the attacker...
Can you figure out how they got in and help me find the filename?
فيما يلي شرح تفصيلي للحل المقصود:
لاحظ، من وصف التحدي، أن المهاجم حصل على الوصول عبر المنفذ 22، وهو منفذ يُحجز عادةً لـ SSH. لاحظ أيضاً أن المهاجم لم يستخدم بيانات اعتماد للحصول على الوصول.
من هذا، إذا بحثت عن ثغرات سابقة تتعلق بالوصول إلى جهاز عبر SSH دون بيانات اعتماد، فمن المرجح جداً أن تكون المشكلة هي البايت MSG_USERAUTH_SUCCESS. بدلاً من ذلك، من خلال بدء اتصال بالمنفذ 22، يمكنك تحديد إصدار libSSH الذي يعمل، ثم البحث عن استغلالات شائعة لهذا الإصدار.
قد تلاحظ أيضاً من الوصف أن اسم الملف الذي تسعى للعثور عليه (العلم) موجود فقط كهدف لرابط رمزي.
وبمعرفة أنه يمكن الحصول على الوصول عبر استغلال هذه الثغرة، يمكنك كتابة برنامج نصي خاص بك، أو نسخ برنامج نصي مثال يمكنه تشغيل هذا الاستغلال، وتنفيذ أمر على الجهاز المستهدف. لقد قمت بتكييف برنامج نصي للاستغلال من أجل هذا الحل، وأسميته libsshauthbypass.py.
لتشغيل هذا البرنامج النصي والحصول على العلم من الجهاز، في حالة الصورة التجريبية، يمكنك تشغيل أمر مشابه لما يلي:
./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
مما ينتج عنه مخرجات مشابهة لما يلي
sspringer-fedora-CVE: ./libsshauthbypass.py --host localhost -p 1337 -c 'find / -type l -exec stat {} + | grep "File:" | sed -E "s/.*\-> (.*)$/\1/g" | grep "definitelyarealCTF"'
INFO:paramiko.transport:Connected (version 2.0, client libssh_0.8.1)
definitelyarealCTF{totally_a_REAL_flag}
لاستخدام نسخة من هذا التحدي في مسابقة CTF خاصة بك، يُنصح بشدة بتعديل Dockerfile لاستخدام مسار مختلف عن المسار الافتراضي المقدم، وتغيير العلم في flag.txt (مع مراعاة أن يبقى في سطر واحد)، ثم إعادة بناء الصورة. لاحظ أنه قد يكون من الضروري استضافة حاوية جديدة لكل محاولة اتصال لمنع أي شخص من تشغيل أمر تدميري يؤثر على جميع المتنافسين.
لإعادة بناء صورة docker بعلم جديد (واختبارها)
flag.txt بالعلم الجديد./build_run <image name>[:<version number] <port number>./libsshauthbypass.py أو البرنامج النصي الخاص بك للاتصال بالحاوية مع الحمولة الصحيحة والأمر الذي ترغب في تشغيلهexit من الصدفة التي يوفرها برنامج build_run النصي، سيتم إيقاف الحاوية وحذفها، لكن الصورة ستبقى وستُوسم باسم <image name>إثبات المفهوم: https://youtu.be/ELrOBm02ANg
شرح التحدي: https://youtu.be/Ii121piSZR0