परियोजना का शीर्षक
CVE-2021-3156 sudo के लिए एक्सप्लॉइट जनरेटर
स्थापना
- निर्भरताएँ स्थापित करें ./install.sh
- एक्सप्लॉइट जनरेटर चलाएँ: ./run.sh
- यदि सिस्टम का sudo संस्करण असुरक्षित है, तो स्थापित संस्करण के लिए एक एक्सप्लॉइट उत्पन्न होता है
- एक्सप्लॉइट exploit.c और बाइनरी ./exploit में उत्पन्न होता है
आवश्यकताएँ
- gdb gcc make python3 python3-distro
- tcache के साथ glibc
- वर्तमान में Ubuntu, Debian ऑपरेटिंग सिस्टम।
परीक्षण किया गया
- Ubuntu 20.04.1
- Ubuntu 20.04.2
- Ubuntu 20.10
- Ubuntu 18.04.5
- Debian 10.7.0
लेखक
भेद्यता
- sudo main में parse_args फ़ंक्शन में मेटाकैरेक्टर एस्केप करता है
- बाद में, set_cmnd में, उन एस्केप कैरेक्टर को हटा दिया जाता है जो स्पेस के बाद नहीं आते
- sudo मानता है कि parse_args, set_cmnd की एक पूर्व शर्त है।
- समस्या यह है कि प्रत्येक पार्सर में स्थितियाँ अलग-अलग होती हैं। पहला निष्पादित होता है यदि मोड (MODE_RUN && MODE_SHELL) है। दूसरा निष्पादित होता है यदि मोड (MODE_RUN | MODE_EDIT | MODE_CHECK) और (MODE_SHELL|MODE_LOGIN_SHELL) है
- पहले पार्सर को निष्पादित न करने लेकिन दूसरे को चलाने का एक तरीका है: sudoedit -s
- set_cmnd तर्कों का आकार गणना करता है और उन्हें संयोजित करने के लिए हीप पर एक चंक बनाता है। फिर प्रत्येक तर्क को तब तक कॉपी करता है जब तक कि एक null बाइट न मिल जाए, और अगले पर जारी रहता है। यदि इनपुट तर्क '\' के साथ समाप्त होता है, तो set_cmnd एस्केप कैरेक्टर को छोड़ देता है, null बाइट कॉपी करता है लेकिन अगले तर्क को कॉपी करना जारी रखता है जैसे कि वही तर्क हो। इससे हीप पर बफर ओवरफ्लो होता है।
- इसलिए यदि अंतिम तर्क '\' के साथ समाप्त होता है, तो set_cmnd बफर को पहले पर्यावरण चर की सामग्री से ओवरफ्लो करता है। यदि यह पर्यावरण चर '\' में समाप्त होता है, तो यह अगले को कॉपी करना जारी रखेगा।
एक्सप्लॉइट जनरेटर
- विधि 2 का उपयोग किया गया है जैसा कि (https://packetstormsecurity.com/files/161160/Sudo-Heap-Based-Buffer-Overflow.html) में वर्णित है
- sudo ओवरफ्लो के बाद ग्रुप डेटाबेस पढ़ने के लिए glibc nsswitch का उपयोग करता है।
- nsswitch हीप पर nsswitch.conf के सभी डेटाबेस और सेवाओं के साथ एक service_table डेटा संरचना बनाता है।
- ग्रुप सेवाओं का प्रकार struct service_user होता है।
- संरचना में सेवा के नाम के साथ एक name फ़ील्ड होता है
- nsswitch /etc/nsswitch.conf के कॉन्फ़िगरेशन के अनुसार ग्रुप डेटाबेस की प्रत्येक सेवा के लिए गतिशील रूप से libnss_[service_name]_.so.2 लाइब्रेरी लोड करता है।
- library पॉइंटर को क्रैश से बचने के लिए NULL पर ओवरराइट करना होगा। इसके अलावा यह लाइब्रेरी को मेमोरी में पुनः लोड करने का कारण बनता है, इस बार शेलकोड के साथ एक स्थानीय लाइब्रेरी।
- हीप ग्रूमिंग या फेंग शुई तकनीक का उपयोग किया जाता है। हीप पर एक लेआउट बनाने के लिए परिवर्तनीय आकार के "स्थानीय" पर्यावरण चर बनाए जाते हैं जो set_cmnd द्वारा तर्कों की प्रतिलिपि बनाने वाले चंक को लक्ष्य के करीब लाने की अनुमति देता है, जो ग्रुप का service_user संरचना है।
- set_cmnd के malloc को निष्पादित करने से ठीक पहले, हीप के tcache को देखा जाता है कि कौन से पहले चंक पुनर्चक्रित होने वाले हैं और उनके आकार क्या हैं।
- nsswitch के डेटाबेस और सेवाओं को बनाने वाले चंक्स को क्रमबद्ध किया जाता है। उन्हें क्रमबद्ध तरीके से पार किया जाता है। लक्ष्य चंक और पिछले चंक का मेमोरी पता संग्रहीत किया जाता है।
- tcache बिन में उस श्रेणी के भीतर एक चंक खोजा जाता है।
- एक बार चंक की स्थिति और आकार ज्ञात होने पर, एक्सप्लॉइट उत्पन्न होता है।
- एक तर्क का उपयोग किया जाता है जो '\' और null बाइट में समाप्त होता है, जिसका सटीक आकार होता है ताकि वह चंक पुनर्चक्रित हो।
- उपयुक्त लेआउट बनाने के लिए आवश्यक 'स्थानीय' पर्यावरण चर बनाए जाते हैं।
- इन 'स्थानीय' चर से पहले, लक्ष्य संरचना तक पहुँचने के लिए आवश्यक आकार का एक पर्यावरण चर उत्पन्न किया जाता है।
- लक्ष्य संरचना को null बाइट्स से ओवरराइट किया जाता है, एस्केप कैरेक्टर '\' वाले स्ट्रिंग सरणियों का उपयोग करके, इससे set_cmnd में एक null बाइट लिखा जाता है।
- service_user के name को 'x/x' से ओवरराइट किया जाता है ताकि बाद में लाइब्रेरी 'libnss_x/x.so.2' लोड हो।
- लाइब्रेरी में एक कंस्ट्रक्टर बनाया जाता है जो शेलकोड निष्पादित करता है।
- चूँकि sudo suid बिट के साथ निष्पादित होता है, शेल रूट की है।
लाइसेंस
यह परियोजना GNU GPL लाइसेंस के अंतर्गत है।