House of Orange
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The exploitation technique was fixed in this patch so this is no longer working (working in earlier than 2.26)
Same example with more comments in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Abuse malloc_printerr
function
Overwrite the top chunk size
Libc and heap leaks
Some needed background from the comments from this example:
बात यह है कि, libc के पुराने संस्करणों में, जब malloc_printerr
फ़ंक्शन को कॉल किया जाता था, तो यह _IO_list_all
में संग्रहीत _IO_FILE
संरचनाओं की एक सूची के माध्यम से आवर्तन करता था, और वास्तव में उस संरचना में एक निर्देशांक प्वाइंटर को निष्पादित करता था।
यह हमला एक नकली _IO_FILE
संरचना बनाएगा जिसे हम _IO_list_all
में लिखेंगे, और malloc_printerr
को चलाने का कारण बनेगा।
फिर यह कोई भी पता निष्पादित करेगा जो हमने _IO_FILE
संरचनाओं की जंप तालिका में संग्रहीत किया है, और हमें कोड निष्पादन मिलेगा।
हमला अनसॉर्टेड बिन के अंदर टॉप चंक प्राप्त करने में सफल होने से शुरू होता है। यह malloc
को एक आकार के साथ कॉल करके प्राप्त किया जाता है जो वर्तमान टॉप चंक आकार से बड़ा है लेकिन mmp_.mmap_threshold
(डिफ़ॉल्ट 128K) से छोटा है, जो अन्यथा mmap
आवंटन को ट्रिगर करेगा। जब भी टॉप चंक आकार को संशोधित किया जाता है, यह सुनिश्चित करना महत्वपूर्ण है कि टॉप चंक + इसका आकार पृष्ठ-संरेखित हो और कि टॉप चंक का prev_inuse बिट हमेशा सेट हो।
अनसॉर्टेड बिन के अंदर टॉप चंक प्राप्त करने के लिए, एक चंक आवंटित करें ताकि टॉप चंक बनाया जा सके, टॉप चंक आकार को बदलें (आवंटित चंक में ओवरफ्लो के साथ) ताकि टॉप चंक + आकार पृष्ठ-संरेखित हो और prev_inuse बिट सेट हो। फिर एक चंक आवंटित करें जो नए टॉप चंक आकार से बड़ा हो। ध्यान दें कि free
को कभी भी अनसॉर्टेड बिन में टॉप चंक प्राप्त करने के लिए कॉल नहीं किया जाता है।
पुराना टॉप चंक अब अनसॉर्टेड बिन में है। मान लेते हैं कि हम इसके अंदर डेटा पढ़ सकते हैं (संभवतः एक भेद्यता के कारण जिसने ओवरफ्लो का कारण बना), तो इससे libc पते लीक करना और _IO_list_all का पता प्राप्त करना संभव है।
एक अनसॉर्टेड बिन हमला ओवरफ्लो का दुरुपयोग करके किया जाता है ताकि topChunk->bk->fwd = _IO_list_all - 0x10
लिखा जा सके। जब एक नया चंक आवंटित किया जाता है, तो पुराना टॉप चंक विभाजित होगा, और अनसॉर्टेड बिन में एक प्वाइंटर _IO_list_all
में लिखा जाएगा।
अगला कदम पुराने टॉप चंक के आकार को एक छोटे बिन में फिट करने के लिए कम करना है, विशेष रूप से इसके आकार को 0x61 पर सेट करना। इसका दो उद्देश्य हैं:
छोटे बिन 4 में सम्मिलन: जब malloc
अनसॉर्टेड बिन के माध्यम से स्कैन करता है और इस चंक को देखता है, तो यह इसके छोटे आकार के कारण इसे छोटे बिन 4 में सम्मिलित करने की कोशिश करेगा। इससे चंक छोटे बिन 4 सूची के सिर पर समाप्त हो जाएगा, जो _IO_list_all
के चंक के FD प्वाइंटर का स्थान है क्योंकि हमने अनसॉर्टेड बिन हमले के माध्यम से _IO_list_all
में एक निकट पता लिखा था।
Malloc जांच को ट्रिगर करना: इस चंक आकार में हेरफेर malloc
को आंतरिक जांच करने का कारण बनेगा। जब यह झूठे फॉरवर्ड चंक के आकार की जांच करता है, जो शून्य होगा, तो यह एक त्रुटि को ट्रिगर करता है और malloc_printerr
को कॉल करता है।
छोटे बिन का हेरफेर आपको चंक के फॉरवर्ड प्वाइंटर को नियंत्रित करने की अनुमति देगा। _IO_list_all के साथ ओवरलैप का उपयोग एक नकली _IO_FILE संरचना को बनाने के लिए किया जाता है। संरचना को सावधानीपूर्वक तैयार किया गया है ताकि इसमें _IO_write_base
और _IO_write_ptr
जैसे प्रमुख फ़ील्ड शामिल हों, जिन्हें libc में आंतरिक जांच पास करने के लिए सेट किया गया है। इसके अतिरिक्त, नकली संरचना के भीतर एक जंप टेबल बनाई जाती है, जहां एक निर्देशांक प्वाइंटर को उस पते पर सेट किया जाता है जहां मनमाना कोड (जैसे, system
फ़ंक्शन) निष्पादित किया जा सकता है।
तकनीक के शेष भाग का संक्षेप में वर्णन करें:
पुराने टॉप चंक को छोटा करें: छोटे बिन में फिट करने के लिए पुराने टॉप चंक के आकार को 0x61 पर समायोजित करें।
नकली _IO_FILE
संरचना सेट करें: पुराने टॉप चंक के साथ ओवरलैप करें और निष्पादन प्रवाह को हाईजैक करने के लिए फ़ील्ड को उचित रूप से सेट करें।
अगला कदम एक नकली _IO_FILE संरचना को बनाना है जो वर्तमान में अनसॉर्टेड बिन में पुराने टॉप चंक के साथ ओवरलैप करती है। इस संरचना के पहले बाइट्स को सावधानीपूर्वक तैयार किया गया है ताकि इसमें एक कमांड (जैसे, "/bin/sh") के लिए एक प्वाइंटर शामिल हो जो निष्पादित किया जाएगा।
नकली _IO_FILE संरचना में प्रमुख फ़ील्ड, जैसे _IO_write_base
और _IO_write_ptr
, को libc में आंतरिक जांच पास करने के लिए सेट किया गया है। इसके अतिरिक्त, नकली संरचना के भीतर एक जंप टेबल बनाई जाती है, जहां एक निर्देशांक प्वाइंटर को उस पते पर सेट किया जाता है जहां मनमाना कोड निष्पादित किया जा सकता है। आमतौर पर, यह system
फ़ंक्शन का पता होगा या कोई अन्य फ़ंक्शन जो शेल कमांड निष्पादित कर सकता है।
हमला तब समाप्त होता है जब malloc
को कॉल करने से हेरफेर की गई _IO_FILE संरचना के माध्यम से कोड का निष्पादन होता है। यह प्रभावी रूप से मनमाना कोड निष्पादन की अनुमति देता है, जो आमतौर पर एक शेल के उत्पन्न होने या अन्य दुर्भावनापूर्ण पेलोड के निष्पादन का परिणाम होता है।
हमले का सारांश:
टॉप चंक सेट करें: एक चंक आवंटित करें और टॉप चंक आकार को संशोधित करें।
टॉप चंक को अनसॉर्टेड बिन में मजबूर करें: एक बड़ा चंक आवंटित करें।
libc पते लीक करें: अनसॉर्टेड बिन से पढ़ने के लिए भेद्यता का उपयोग करें।
अनसॉर्टेड बिन हमला करें: ओवरफ्लो का उपयोग करके _IO_list_all में लिखें।
पुराने टॉप चंक को छोटा करें: इसे छोटे बिन में फिट करने के लिए इसके आकार को समायोजित करें।
नकली _IO_FILE संरचना सेट करें: नियंत्रण प्रवाह को हाईजैक करने के लिए एक नकली फ़ाइल संरचना बनाएं।
कोड निष्पादन को ट्रिगर करें: हमले को निष्पादित करने और मनमाना कोड चलाने के लिए एक चंक आवंटित करें।
यह दृष्टिकोण हीप प्रबंधन तंत्र, libc जानकारी लीक, और हीप ओवरफ्लो का लाभ उठाता है ताकि बिना सीधे free
को कॉल किए कोड निष्पादन प्राप्त किया जा सके। नकली _IO_FILE संरचना को सावधानीपूर्वक तैयार करके और इसे सही स्थान पर रखकर, हमला मानक मेमोरी आवंटन संचालन के दौरान नियंत्रण प्रवाह को हाईजैक कर सकता है। यह मनमाना कोड निष्पादन की अनुमति देता है, जो संभावित रूप से एक शेल या अन्य दुर्भावनापूर्ण गतिविधियों का परिणाम हो सकता है।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)