House of Force

सीखें और प्रैक्टिस करें AWS हैकिंग: HackTricks प्रशिक्षण AWS रेड टीम एक्सपर्ट (ARTE) सीखें और प्रैक्टिस करें GCP हैकिंग: HackTricks प्रशिक्षण GCP रेड टीम एक्सपर्ट (GRTE)

हैकट्रिक्स का समर्थन करें

मूलभूत जानकारी

कोड

लक्ष्य

  • इस हमले का लक्ष्य एक विशिष्ट पते पर एक चंक को आवंटित करने की क्षमता होती है।

आवश्यकताएँ

  • एक ओवरफ्लो जो शीर्ष चंक हेडर का आकार अधिलेखित करने की अनुमति देता है (उदा। -1)।

  • हीप आवंटन का आकार नियंत्रित करने की क्षमता होना

हमला

यदि एक हमलावर किसी पते P पर एक चंक आवंटित करना चाहता है ताकि यहाँ का कोई मान अधिलेखित किया जा सके। वह -1 के साथ शीर्ष चंक का आकार अधिलेखित करके शुरू करता है (शायद एक ओवरफ्लो के साथ)। इससे यह सुनिश्चित होता है कि malloc किसी भी आवंटन के लिए mmap का उपयोग नहीं करेगा क्योंकि शीर्ष चंक में हमेशा पर्याप्त स्थान होगा।

फिर, शीर्ष चंक के पते और लक्ष्य स्थान के बीच की दूरी की गणना करें ताकि आवंटन के लिए उस आकार के साथ malloc किया जाए जिससे शीर्ष चंक को उस स्थिति में ले जाने के लिए। यह अंतर/आकार आसानी से गणित किया जा सकता है:

// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/

इसलिए, target - old_top - 4*sizeof(long) का आकार आवंटित करना (4 longs क्योंकि शीर्ष चंक और नए चंक के मेटाडेटा के कारण) शीर्ष चंक को हमें ओवरराइट करना चाहिए। फिर, लक्ष्य पते पर एक चंक प्राप्त करने के लिए एक और मैलोक करें।

संदर्भ और अन्य उदाहरण

  • इस स्थिति का लक्ष्य एक ret2win है जहां हमें एक फ़ंक्शन का पता मॉडिफ़ाय करना है जिसे रिट2विन फ़ंक्शन द्वारा बुलाया जाएगा

  • बाइनरी में एक ओवरफ्लो है जिसे बदला जा सकता है शीर्ष चंक का आकार, जो -1 या p64(0xffffffffffffffff) में बदल दिया जाता है

  • फिर, ओवरराइट करने के लिए पॉइंटर का पता जहां ओवरराइट होना है, और वर्तमान स्थान से वहां शीर्ष चंक की अंतरिक्ष की गणना की जाती है, और malloc के साथ आवंटित की जाती है

  • अंत में एक नया चंक आवंटित किया जाता है जिसमें इस वांछित लक्ष्य को शामिल किया गया है जिसे रिट2विन फ़ंक्शन द्वारा ओवरराइट किया जाता है

  • अपना नाम दर्ज करें: में एक प्रारंभिक कमजोरी है जो हीप से एक पता लीक करने की अनुमति देती है

  • फिर Org: और Host: कार्यक्षमता में org name के लिए पूछा जाता है, जिसमें 64B की s पॉइंटर भरने की संभावना है, जो स्टैक में v2 के पते के बाद है, जिसके बाद निर्दिष्ट host name का पालन किया जाता है। फिर, strcpy का उस सामग्री की प्रतिलिपि एक 64B के आकार के टुकड़े में कॉपी करने जा रहा है, इससे शीर्ष चंक का आकार ओवरराइट किया जा सकता है जिसमें host name के भीतर डेटा डाला गया है।

  • अब जब विचारात्मक लेखन संभव है, तो atoi's GOT को printf के पते पर ओवरराइट किया गया था। इससे IO_2_1_stderr का पता लीक करना संभव था %24$p के साथ। और इस libc लीक के साथ atoi's GOT को फिर से system के पते से ओवरराइट करने और /bin/sh के रूप में पैरामीटर के रूप में इसे कॉल करने की संभावना थी

  • एक वैकल्पिक विधि इस अन्य लेख में प्रस्तावित की गई, free को puts के साथ ओवरराइट करने और फिर atoi@got का पता जोड़ने की अनुमति देने के लिए है, जिसे बाद में मुक्त किया जाएगा ताकि यह लीक हो और इस लीक के साथ फिर से atoi@got को system के साथ ओवरराइट करने और /bin/sh के साथ इसे कॉल करने की संभावना थी।

  • एक UAF है जो एक चंक को पुनः उपयोग करने की अनुमति देता है जो बिना पॉइंटर को साफ किए हुए मुक्त किया गया था। क्योंकि कुछ पठन विधियाँ हैं, इससे एक libc पता लीक करना संभव है जो गोट में मुफ्त कार्य के लिए एक पॉइंटर लिखने और फिर कॉल करने के लिए पठन विधि को कॉल करने की संभावना है।

  • फिर, फोर्स का घर उपयोग किया गया था (UAF का दुरुपयोग करके) बाएं अंतरिक्ष का आकार एक -1 के साथ ओवरराइट करने के लिए, एक चंक बड़ा पर्याप्त आवंटित करने के लिए मुक्त हुक तक पहुंचने के लिए, और फिर एक और चंक आवंटित किया जाता है जिसमें मुक्त हुक शामिल होगा। फिर, हुक में system का पता लिखें, एक चंक में "/bin/sh" लिखें और अंत में उस तुकड़े को उस स्ट्रिंग सामग्री के साथ मुक्त करें।

Last updated