
CVE-2022-37969 का ट्यूटोरियल जिसमें कर्नेल शोषण की पद्धति पर ध्यान केंद्रित किया गया है, न कि CVE के आंतरिक कारणों पर
यह Windows शोषण से संबंधित सामान्य पहलुओं को स्पष्ट करने के लिए बनाया गया था। यह CVE-2022-37969 पर लागू बुनियादी अवधारणाओं की व्याख्या करता है। अंतिम परिणाम एक कार्यशील PoC है। यह CVE के हर पहलू को स्पष्ट नहीं करता है, लेकिन पुन: प्रयोज्य कोड के टुकड़े प्रदान करता है और ऐसे तंत्रों की व्याख्या करता है जो कई सामान्य शोषणों में पाए जा सकते हैं।
लक्षित उपयोगकर्ता एक शुरुआती रिवर्स इंजीनियर, शोषण डेवलपर होगा जो कार्यशील प्रूफ ऑफ कॉन्सेप्ट स्रोत कोड की तलाश में है ताकि बुनियादी Windows आंतरिक को परीक्षण और समझ सके। यह आगे सीखने के लिए एक संदर्भ बिंदु प्रदान करता है।
आवश्यकताएँ: बुनियादी कर्नेल डिबगिंग, बुनियादी रिवर्स इंजीनियरिंग, बुनियादी Windows आंतरिक, c/c++ प्रोग्रामिंग कौशल
एक प्रोग्राम कोड का एक टुकड़ा है जो मशीन पर चल रहा है। आम तौर पर एक प्रोग्राम डेटा (इनपुट) प्राप्त करता है, इनपुट का उपयोग करके गणना करता है और डेटा (आउटपुट) उत्पन्न करता है। अधिकांश प्रोग्राम मनुष्यों द्वारा लिखे जाते हैं, और इस प्रकार उनमें बग होते हैं। एक बग कुछ स्रोत कोड द्वारा उत्पन्न होता है जो सही ढंग से नहीं लिखा गया था (प्रोग्रामर इनपुट के साथ कुछ करना चाहता था, परिणामस्वरूप कोड इच्छित परिणाम से भिन्न था)। अधिकांश बग उत्पाद लॉन्च करने से पहले ठीक कर दिए जाते हैं, लेकिन कुछ रह जाते हैं। ऐसा इसलिए होता है क्योंकि विभिन्न प्रकार के बग होते हैं, कुछ को दूसरों की तुलना में पहचानना कठिन होता है।
Windows एक कंप्यूटर प्रोग्राम है, इसे मनुष्यों द्वारा लिखा गया था, और इस प्रकार इसमें बग हैं। यह महत्वपूर्ण क्यों है? क्योंकि Windows सिस्टम ऐसे प्रोग्राम चला सकते हैं जो संवेदनशील डेटा जैसे बैंक खाते, स्वास्थ्य सेवा डेटाबेस, और अन्य को संचालित करते हैं। कुछ बग का उपयोग अवैध रूप से प्रतिबंधित डेटा तक पहुँच प्राप्त करने के लिए किया जा सकता है (यह एक शोषण के लिए एक अच्छा उपयोग मामला है)
बग कई प्रकार के होते हैं, कुछ उपयोगी होते हैं कुछ नहीं। आम तौर पर बग प्रोग्राम में इनपुट के कारण उत्पन्न होते हैं जो गलत लिखे गए कोड की पंक्तियों के साथ मिलकर एक दोषपूर्ण आउटपुट या प्रोग्राम का व्यवहार उत्पन्न करते हैं। उस इनपुट को ढूँढना सुरक्षा विशेषज्ञ (या हैकर) का काम है। अगला कदम परिणामी दोषपूर्ण आउटपुट/व्यवहार का मूल्यांकन करना और प्रश्न का उत्तर देना है "क्या इसका उपयोग उपयोगी तरीके से किया जा सकता है?" यहीं पर बग को विभिन्न श्रेणियों में वर्गीकृत किया जाता है। उदाहरण के लिए एक बग ऐसा व्यवहार उत्पन्न कर सकता है जो कुछ डेटा संरचनाओं को दूषित करता है और लक्ष्य कंप्यूटर को पुनरारंभ करने का कारण बनता है। इसकी उपयोगिता सीमित है। एक बग के कारण इनपुट एक मेमोरी क्षेत्र में लिखा जा सकता है जो प्रतिबंधित फ़ाइलों तक पहुँच अनुमतियों को नियंत्रित करता है। इस प्रकार का बग अधिक उपयोगी है।
तो सभी संभावित बगों के सेट से हैकर उस उपसमूह की खोज करता है जो उसके उद्देश्य के लिए सबसे उपयोगी है। सामान्य शब्दों में समस्या यह है "क्या मैं लक्ष्य प्रोग्राम को एक विशेष रूप से तैयार किया गया इनपुट दे सकता हूँ ताकि मैं सिस्टम को तोड़े बिना अपने एक्सेस के स्तर को बढ़ा सकूँ और लाभ उठा सकूँ?"
इस गैर-तकनीकी परिचय के बाद ट्यूटोरियल का दायरा तैयार किया जा सकता है: क्या हम एक Windows प्रोग्राम ढूँढ सकते हैं जो दोषपूर्ण इनपुट स्वीकार करता है और गलत डेवलपर कोड के परिणामस्वरूप अवैध रूप से हमारी अनुमतियों को सामान्य उपयोगकर्ता से प्रशासक तक बढ़ा सकता है?
लक्ष्य प्रोग्राम: Windows CLFS (सामान्य लॉग फ़ाइल सिस्टम ड्राइवर)
शोषण का नाम: CVE-2022-37969
प्रकार: स्थानीय विशेषाधिकार उन्नयन
असुरक्षित ISO डाउनलोड: यहाँ से डाउनलोड करें
Windows पता स्थान मोटे तौर पर उपयोगकर्ता-स्थान (सामान्य प्रोग्राम चलाने) और कर्नेल-स्थान (स्वयं ऑपरेटिंग सिस्टम और हार्डवेयर घटक सॉफ़्टवेयर-->ड्राइवर चलाने) में विभाजित है। एक सामान्य उपयोगकर्ता को कर्नेल स्थान तक नहीं पहुँचना चाहिए, लेकिन ऐसे तंत्र हैं जिनके द्वारा सामान्य-उपयोगकर्ता-प्रोग्राम कर्नेल कोड (सिस्टम कॉल, ड्राइवर प्रक्रियाओं) के कुछ भागों तक पहुँच सकते हैं। हमें पहुँच की आवश्यकता क्यों है? OS डिज़ाइनरों द्वारा प्रदान किए गए सुरक्षित और नियंत्रित तरीके से OS के साथ संवाद करने के लिए।
कुछ ड्राइवर उपयोगकर्ता द्वारा प्रदान किए गए डेटा इनपुट का उपयोग कर्नेल-स्थान-डेटा-संरचनाओं पर संचालन करने के लिए करते हैं। यदि इनपुट एक बग उत्पन्न करता है, तो कर्नेल दूषित हो सकता है। एक मामला सामान्य लॉग फ़ाइल सिस्टम ड्राइवर है। कुछ विशेष इनपुट का उपयोग करके हम ड्राइवर को कर्नेल-डेटा-संरचनाओं को बदलने के लिए मजबूर कर सकते हैं जो उपयोगकर्ता के लिए विशेषाधिकार पहुँच स्तर रखते हैं और सामान्य उपयोगकर्ता को प्रशासक से अधिलेखित कर सकते हैं।
प्रशासक के लिए विशेषाधिकार बढ़ाने के लिए क्या संशोधित करने की आवश्यकता है?
हम अंतिम लक्ष्य को ध्यान में रखते हुए शुरू करते हैं। Windows सिस्टम पर चलने वाली प्रत्येक प्रक्रिया के लिए _EPROCESS नामक एक कर्नेल डेटा संरचना के अंदर जानकारी संग्रहीत करता है। _Eprocess का उदाहरण
एक महत्वपूर्ण फ़ील्ड struct _EX_FAST_REF Token है। यह एक और डेटा संरचना है जो आगे उस संबंधित प्रक्रिया के विशेषाधिकार स्तर को संदर्भित करने वाले डेटा की ओर इंगित करती है। निम्नलिखित चित्र में सिस्टम प्रक्रिया में एक सिस्टम टोकन है और एक्सप्लोरर प्रक्रिया में एक सामान्य उपयोगकर्ता टोकन है।

इसलिए Explorer.exe के विशेषाधिकार को बढ़ाने के लिए हमें सिस्टम के _EPROCESS-->Token से मान को कॉपी करके Explorer के _EPROCESS-->Token में डालना होगा। हम सिस्टम टोकन को अपने स्वयं के प्रोग्राम के टोकन में कॉपी करके और उन्नत प्रक्रिया से एक कमांड प्रॉम्प्ट लॉन्च करके (चाइल्ड प्रक्रियाएँ पिता प्रक्रिया का टोकन प्राप्त करती हैं) कुछ ऐसा ही पूरा करेंगे।
इन क्रियाओं को पूरा करने के लिए हमें निम्नलिखित तंत्रों की आवश्यकता है:
परिचय: वर्षों में Windows की प्रकृति: जैसे-जैसे नई कमज़ोरियों की खोज हुई, Windows को उन्हें कम करने के लिए पैचिंग की आवश्यकता थी। साथ ही नई तकनीक के उद्भव के साथ, प्रतिस्पर्धी बने रहने के लिए Windows को अपडेट की आवश्यकता थी। एक महत्वपूर्ण आवश्यकता पुराने संस्करणों के साथ पिछड़ी संगतता थी। और कभी-कभी सुरक्षा अस्पष्टता के माध्यम से प्राप्त की जाती थी। डेटा संरचनाएँ, फ़ंक्शन परिभाषाएँ मैनुअल से हटा दी गईं, लेकिन कार्यक्षमता अभी भी बनी रही। रिवर्स इंजीनियरिंग द्वारा, शोधकर्ता उन कार्यक्षमताओं का विभिन्न उद्देश्यों के लिए उपयोग करने में सक्षम थे।
_EPROCESS का कर्नेल पता खोजने के लिए हम एक अप्रलेखित फ़ंक्शन का उपयोग करेंगे: NtQuerySystemInformation (पैरामीटर के लिए लिंक देखें)। SystemInformationClass पैरामीटर का उपयोग करके हम निर्दिष्ट कर सकते हैं कि हम किस प्रकार की जानकारी प्राप्त करना चाहते हैं। हम SystemExtendedHandleInformation मान (#define SystemExtendedHandleInformation 0x40) निर्दिष्ट करके सामान्य प्रक्रिया जानकारी प्राप्त करेंगे।
NtQuerySystemInformation का उपयोग करने में एक चेतावनी यह है कि हम पहले से नहीं जानते कि लौटाए गए डेटा की लंबाई क्या है, लेकिन NtQuerySystemInformation में एक तंत्र है जो मदद करता है। यदि इसे आवश्यक डेटा के लिए गलत आकार की सरणी के साथ कॉल किया जाता है, तो यह ERROR लौटाता है और सही डेटा आकार जो अनुरोध किया जाना चाहिए था। इसका उपयोग निम्नलिखित तरीके से प्रक्रिया जानकारी को सही ढंग से पढ़ने के लिए किया जा सकता है:
NtQuerySystemInformation को डमी SystemInformationLength पैरामीटर के साथ कॉल करेंReturnLength पैरामीटर मान को पढ़ेंSystemInformationLength मान के साथ NtQuerySystemInformation को फिर से कॉल करेंलौटाई गई डेटा संरचना PSYSTEM_HANDLE_INFORMATION_EX प्रकार की है। यह एक अप्रलेखित डेटा संरचना है। (लिंक देखें) जो एक SYSTEM_HANDLE_TABLE_ENTRY_INFO_EX डेटा संरचना की ओर ले जाती है, जो Object फ़ील्ड में संबंधित प्रक्रिया के _Eprocess डेटा संरचना का कर्नेल पता रखती है।