Heap Overflow
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)
Heap overflow एक stack overflow की तरह है लेकिन heap में। मूल रूप से इसका मतलब है कि heap में कुछ डेटा स्टोर करने के लिए कुछ स्थान आरक्षित किया गया था और स्टोर किया गया डेटा आरक्षित स्थान से बड़ा था।
Stack overflows में हम जानते हैं कि कुछ रजिस्टर जैसे कि इंस्ट्रक्शन पॉइंटर या स्टैक फ्रेम को स्टैक से पुनर्स्थापित किया जाएगा और इसे दुरुपयोग करना संभव हो सकता है। Heap overflows के मामले में, डिफ़ॉल्ट रूप से स्टोर की गई कोई संवेदनशील जानकारी नहीं होती जो overflow की जा सके। हालाँकि, यह संवेदनशील जानकारी या पॉइंटर्स हो सकती है, इसलिए इस भेद्यता की गंभीरता इस पर निर्भर करती है कि कौन सा डेटा ओवरराइट किया जा सकता है और एक हमलावर इसे कैसे दुरुपयोग कर सकता है।
Overflow offsets खोजने के लिए आप stack overflows में समान पैटर्न का उपयोग कर सकते हैं।
Stack overflows में उस समय स्टैक में मौजूद डेटा और व्यवस्था जब भेद्यता को सक्रिय किया जा सकता है, काफी विश्वसनीय होती है। इसका कारण यह है कि स्टैक रैखिक है, हमेशा टकराते मेमोरी में बढ़ता है, कार्यक्रम के चलने के विशिष्ट स्थानों पर स्टैक मेमोरी आमतौर पर समान प्रकार के डेटा को स्टोर करती है और इसमें प्रत्येक फ़ंक्शन द्वारा उपयोग किए जाने वाले स्टैक भाग के अंत में कुछ पॉइंटर्स के साथ कुछ विशिष्ट संरचना होती है।
हालांकि, heap overflow के मामले में, उपयोग की गई मेमोरी रैखिक नहीं होती है लेकिन आवंटित टुकड़े आमतौर पर मेमोरी के अलग-अलग स्थानों में होते हैं (एक के बगल में नहीं) क्योंकि आकार द्वारा आवंटन को अलग करने के लिए बिन और ज़ोन होते हैं और क्योंकि पिछली मुक्त मेमोरी का उपयोग किया जाता है नए टुकड़ों को आवंटित करने से पहले। यह जानना जटिल है कि कौन सा ऑब्जेक्ट उस ऑब्जेक्ट के साथ टकराने वाला है जो heap overflow के लिए संवेदनशील है। इसलिए, जब एक heap overflow पाया जाता है, तो यह आवश्यक है कि वांछित ऑब्जेक्ट को मेमोरी में अगले स्थान पर लाने का एक विश्वसनीय तरीका खोजा जाए जो ओवरफ्लो किया जा सकता है।
इसका एक तकनीक Heap Grooming है जिसका उपयोग उदाहरण के लिए इस पोस्ट में किया गया है। पोस्ट में यह समझाया गया है कि जब iOS कर्नेल में एक ज़ोन में मेमोरी खत्म हो जाती है, तो यह इसे एक कर्नेल पृष्ठ द्वारा बढ़ाता है, और यह पृष्ठ अपेक्षित आकार के टुकड़ों में विभाजित होता है जो क्रम में उपयोग किए जाएंगे (iOS संस्करण 9.2 तक, फिर ये टुकड़े इन हमलों के शोषण को कठिन बनाने के लिए यादृच्छिक तरीके से उपयोग किए जाते हैं)।
इसलिए, पिछले पोस्ट में जहां heap overflow हो रहा है, ओवरफ्लो किए गए ऑब्जेक्ट को एक पीड़ित ऑर्डर के साथ टकराने के लिए मजबूर करने के लिए, कई kallocs
को कई थ्रेड्स द्वारा मजबूर किया जाता है ताकि यह सुनिश्चित किया जा सके कि सभी मुक्त टुकड़े भरे हुए हैं और एक नया पृष्ठ बनाया गया है।
विशिष्ट आकार के ऑब्जेक्ट के साथ इस भरने को मजबूर करने के लिए, iOS mach पोर्ट से संबंधित आउट-ऑफ-लाइन आवंटन एक आदर्श उम्मीदवार है। संदेश के आकार को तैयार करके, kalloc
आवंटन के आकार को सटीक रूप से निर्दिष्ट करना संभव है और जब संबंधित mach पोर्ट नष्ट होता है, तो संबंधित आवंटन तुरंत kfree
पर वापस जारी किया जाएगा।
फिर, इनमें से कुछ प्लेसहोल्डर्स को मुक्त किया जा सकता है। kalloc.4096
फ्री लिस्ट तत्वों को अंतिम में पहले बाहर करने के क्रम में जारी करती है, जिसका मूल रूप से मतलब है कि यदि कुछ प्लेसहोल्डर्स को मुक्त किया जाता है और शोषण कई पीड़ित ऑब्जेक्ट्स को आवंटित करने की कोशिश करता है जबकि ओवरफ्लो के लिए संवेदनशील ऑब्जेक्ट को आवंटित करने की कोशिश करता है, तो यह संभावना है कि यह ऑब्जेक्ट एक पीड़ित ऑब्जेक्ट द्वारा अनुसरण किया जाएगा।
इस पृष्ठ में एक बुनियादी Heap overflow अनुकरण पाया जा सकता है जो दिखाता है कि अगले टुकड़े के पूर्व में उपयोग बिट और पूर्व आकार की स्थिति को ओवरराइट करके एक उपयोग किए गए टुकड़े को समेकित करना (इसे अनयूज्ड समझाना) और फिर से इसे आवंटित करना संभव है, जिससे यह डेटा ओवरराइट किया जा सके जो एक अलग पॉइंटर में भी उपयोग किया जा रहा है।
protostar heap 0 से एक और उदाहरण एक बहुत बुनियादी CTF का उदाहरण दिखाता है जहां एक heap overflow का दुरुपयोग करके विजेता फ़ंक्शन को कॉल किया जा सकता है ताकि फ्लैग प्राप्त किया जा सके।
protostar heap 1 उदाहरण में यह देखा जा सकता है कि एक बफर ओवरफ्लो का दुरुपयोग करके एक निकटतम टुकड़े में एक पता ओवरराइट करना संभव है जहां उपयोगकर्ता से मनमाना डेटा लिखा जाएगा।
पृष्ठ https://8ksec.io/arm64-reversing-and-exploitation-part-1-arm-instruction-set-simple-heap-overflow/ में आप एक heap overflow उदाहरण पा सकते हैं जहां एक कमांड जो निष्पादित होने वाली है, ओवरफ्लो किए गए टुकड़े से अगले टुकड़े में स्टोर की गई है। इसलिए, इसे एक आसान शोषण जैसे कि ओवरराइट करके निष्पादित कमांड को संशोधित करना संभव है:
हम एक Integer Overflow vulnerability का उपयोग करते हैं ताकि एक Heap Overflow प्राप्त कर सकें।
हम overflowed chunk के struct
के अंदर एक function के pointers को corrupt करते हैं ताकि system
जैसे function को सेट कर सकें और code execution प्राप्त कर सकें।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)