
MiniShare 1.4.1 में स्टैक-आधारित बफ़र ओवरफ़्लो जो एक HTTP PUT अनुरोध के माध्यम से पहुंच योग्य है।
MiniShare 1.4.1 में स्टैक-आधारित बफर ओवरफ़्लो, एक HTTP PUT अनुरोध के माध्यम से पहुँचा जा सकता है।
यह रिपॉजिटरी उस सामग्री का हिस्सा है जिसका उपयोग मैं मेमोरी करप्शन शोषण (एक्सप्लॉइटेशन) सिखाते समय करता हूँ (अपने नियमित काम के अलावा, मैं विभिन्न साइबर सुरक्षा पाठ्यक्रमों में भी पढ़ाता हूँ, जहाँ मैं रिवर्स इंजीनियरों की अगली पीढ़ी को प्रशिक्षित करने में मदद करता हूँ)।
CVE-2020-13768 एक ऐसा मामला है जिसका उपयोग मैं तब करता हूँ जब मैं यह दिखाना चाहता हूँ कि सरल नेटवर्क-मुख सर्वर मानक प्रोटोकॉल विधियों के माध्यम से क्लासिक स्टैक-आधारित बफर ओवरफ़्लो को कैसे उजागर कर सकते हैं। कमजोर एंडपॉइंट के लिए कोई प्रमाणीकरण आवश्यक नहीं है, ओवरफ़्लो एक सीधा EIP ओवरराइट है, और शोषण पथ साफ और अच्छी तरह से परिभाषित है। यह एक यथार्थवादी अप्रमाणित रिमोट परिदृश्य में पूर्ण शोषण पद्धति सीखने के लिए एक आदर्श मामला है।
एक शिक्षण अभ्यास के रूप में इस मामले को और भी दिलचस्प बनाता है कि एक ही मूल कारण, फिक्स्ड-साइज़ स्टैक बफर में अनसैनिटाइज़्ड इनपुट की प्रतिलिपि, एक ही बाइनरी के लिए कई CVE प्रविष्टियों में दिखाई देता है। CVE-2018-19861, CVE-2018-19862, और CVE-2019-17601 एक ही प्रकार की कमजोरी का वर्णन करते हैं, बस विभिन्न शोधकर्ताओं द्वारा विभिन्न HTTP विधियों या एंडपॉइंट के माध्यम से रिपोर्ट किया गया। यह छात्रों को केवल CVE संख्याओं के बजाय मूल कारणों को देखना सिखाता है।
यह कमजोरी MiniShare 1.4.1 को प्रभावित करती है, जो एक बंद हो चुका हल्का Windows HTTP सर्वर है जिसे सरल स्थानीय फ़ाइल साझाकरण के लिए डिज़ाइन किया गया था। यह सॉफ्टवेयर आधुनिक सुरक्षा प्रथाओं को ध्यान में रखे बिना लिखा गया था। शिक्षण के दृष्टिकोण से इस मामले को विशेष रूप से दिलचस्प बनाता है कि इसमें शामिल कारकों का संयोजन है:
यह संयोजन CVE-2020-13768 को एक यथार्थवादी अप्रमाणित परिदृश्य में नेटवर्क-आधारित बफर ओवरफ़्लो शोषण की मूल बातें सिखाने के लिए एक उत्कृष्ट मामला बनाता है।
MiniShare एक न्यूनतम Windows HTTP सर्वर है जो मूल रूप से LAN पर त्वरित स्थानीय फ़ाइल साझाकरण के लिए डिज़ाइन किया गया था। यह TCP पोर्ट 80 पर सुनता है और GET और PUT सहित HTTP विधियों के एक छोटे उपसमूह को संभालता है। PUT हैंडलर आने वाले अनुरोधों को संसाधित करता है और URI पथ को एक फिक्स्ड-साइज़ स्टैक बफर में कॉपी करता है, बिना इसकी लंबाई को मान्य किए।
मुख्य तकनीकी विवरण:
MiniShare आने वाले HTTP अनुरोधों को संसाधित करता है और विधि के आधार पर उन्हें उपयुक्त हैंडलर को भेजता है। PUT हैंडलर अनुरोध से URI पथ निकालता है और इसे बिना इसकी लंबाई जाँचे एक फिक्स्ड-साइज़ स्टैक बफर में कॉपी करता है।
कमजोर लॉजिक का एक सरलीकृत संस्करण इस प्रकार दिखता है:
char path_buffer[256];
strcpy(path_buffer, uri_path);
चूँकि गंतव्य बफर का एक निश्चित आकार है और इनपुट लंबाई मान्य नहीं है, PUT अनुरोध में पर्याप्त लंबा URI भेजने से प्रतिलिपि बफर के अंत से आगे लिखती है, अंततः सहेजे गए रिटर्न एड्रेस (EIP) तक पहुँचती है और उसे ओवरराइट करती है।
जब कमजोर फ़ंक्शन लौटता है, तो CPU स्टैक से हमलावर-नियंत्रित मान को EIP में लोड करता है और उस पर जाता है। यदि वह पता शेलकोड युक्त हमलावर-नियंत्रित डेटा को इंगित करता है, तो मनमाना कोड निष्पादन प्राप्त होता है।
HTTP PUT अनुरोध में एक अत्यधिक आकार का URI भेजकर क्रैश को दोहराया जा सकता है। कोई प्रमाणीकरण आवश्यक नहीं है। Python का उपयोग करते हुए उदाहरण:
import socket
HOST = '127.0.0.1'
PORT = 80
payload = b"A" * 3000
request = (
b"PUT /" + payload + b" HTTP/1.1\r\n"
b"Host: 127.0.0.1\r\n"
b"Connection: close\r\n"
b"\r\n"
)
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
s.send(request)
s.close()
जब डिबगर के तहत निष्पादित किया जाता है, तो क्रैश EIP को उपयोगकर्ता-नियंत्रित डेटा से ओवरराइट दिखाता है:
EIP = 41414141
यह पुष्टि करता है कि सहेजा गया रिटर्न एड्रेस ओवरफ़्लो से दूषित हो गया है।
इस रिपॉजिटरी का उद्देश्य केवल क्रैश प्रदर्शित करना नहीं है, बल्कि वास्तविक स्टैक-आधारित एक्सप्लॉइट विकसित करते समय उपयोग की जाने वाली पद्धति का पालन करते हुए, चरण दर चरण पूर्ण शोषण प्रक्रिया से गुजरना भी है।
मुख्य README को साफ रखने के लिए, विस्तृत शोषण नोट्स, स्क्रिप्ट और डिबगर चरण इस रिपॉजिटरी के भेद्यता 📂 फ़ोल्डर के अंदर रखे गए हैं।
वहाँ आपको इस CVE का शोषण करने के लिए उपयोग किए जाने वाले पूर्ण कार्यप्रवाह मिलेगा, जिसमें शामिल हैं: