Ret2lib
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)
Ret2Libc का सार यह है कि यह एक कमजोर प्रोग्राम के निष्पादन प्रवाह को एक साझा पुस्तकालय (जैसे, system, execve, strcpy) के भीतर एक फ़ंक्शन की ओर पुनर्निर्देशित करता है, बजाय इसके कि हमलावर द्वारा प्रदान किए गए शेलकोड को स्टैक पर निष्पादित किया जाए। हमलावर एक पेलोड तैयार करता है जो स्टैक पर लौटने के पते को उस पुस्तकालय फ़ंक्शन की ओर इंगित करने के लिए संशोधित करता है, जबकि आवश्यक तर्कों को कॉलिंग कन्वेंशन के अनुसार सही ढंग से सेट करने की व्यवस्था भी करता है।
कॉल करने के लिए फ़ंक्शन का पता प्राप्त करें (जैसे system) और कॉल करने के लिए कमांड (जैसे /bin/sh)
पहले तर्क को कमांड स्ट्रिंग की ओर इंगित करने और फ़ंक्शन के लिए निष्पादन प्रवाह को पास करने के लिए एक ROP श्रृंखला उत्पन्न करें
मान लीजिए कि उपयोग की जाने वाली libc
वर्तमान मशीन से है, आप यह पता लगा सकते हैं कि यह मेमोरी में कहाँ लोड होगी:
यदि आप यह जांचना चाहते हैं कि क्या ASLR libc के पते को बदल रहा है, तो आप कर सकते हैं:
libc का ज्ञान होने पर system
फ़ंक्शन के लिए ऑफ़सेट ढूंढना भी संभव है:
libc का ज्ञान होने पर, /bin/sh
फ़ंक्शन के लिए ऑफ़सेट ढूंढना भी संभव है:
libc का ज्ञान होने पर, Peda या GEF का उपयोग करके system फ़ंक्शन, exit फ़ंक्शन और स्ट्रिंग /bin/sh
का पता लगाना भी संभव है:
यदि प्रक्रिया हर बार आपके साथ बात करते समय बच्चे बना रही है (नेटवर्क सर्वर) तो उस फ़ाइल को पढ़ने की कोशिश करें (संभवतः आपको रूट होना पड़ेगा)।
यहाँ आप सटीक रूप से देख सकते हैं कि libc प्रक्रिया के अंदर कहाँ लोड हो रहा है और प्रक्रिया के हर बच्चे के लिए कहाँ लोड होने वाला है।
इस मामले में यह 0xb75dc000 में लोड हो रहा है (यह libc का बेस पता होगा)
यह संभव है कि आप नहीं जानते कि बाइनरी कौन सा libc लोड कर रहा है (क्योंकि यह किसी सर्वर पर हो सकता है जहाँ आपके पास कोई पहुँच नहीं है)। उस मामले में आप कुछ पते लीक करने के लिए भेद्यता का दुरुपयोग कर सकते हैं और पता लगा सकते हैं कि कौन सी libc लाइब्रेरी का उपयोग किया जा रहा है:
Leaking libc address with ROPऔर आप इसके लिए एक pwntools टेम्पलेट यहाँ पा सकते हैं:
Leaking libc - templateपृष्ठ https://libc.blukat.me/ की जाँच करें और libc के अंदर फ़ंक्शनों के कुछ पते का उपयोग करके उपयोग की गई संस्करण का पता लगाएँ।
ये ब्रूट-फोर्सिंग हमले केवल 32 बिट सिस्टम के लिए उपयोगी हैं।
यदि एक्सप्लॉइट स्थानीय है, तो आप libc के बेस पते को ब्रूट-फोर्स करने की कोशिश कर सकते हैं (32 बिट सिस्टम के लिए उपयोगी):
यदि आप एक दूरस्थ सर्वर पर हमला कर रहे हैं, तो आप libc
फ़ंक्शन usleep
के पते को बूट-फोर्स करने की कोशिश कर सकते हैं, उदाहरण के लिए 10 को तर्क के रूप में पास करते हुए। यदि किसी बिंदु पर सर्वर प्रतिक्रिया देने में 10 सेकंड अतिरिक्त समय लेता है, तो आपने इस फ़ंक्शन का पता लगा लिया है।
एक शेल को केवल एक विशिष्ट पते पर कूदकर निष्पादित करें:
One Gadgetइस उदाहरण में ASLR बूट-फोर्स को कोड में एकीकृत किया गया है और कमजोर बाइनरी एक दूरस्थ सर्वर पर स्थित है:
उदाहरण देखें:
ROP - Return Oriented ProgramingARM64 के मामले में, ret निर्देश उस स्थान पर कूदता है जहाँ x30 रजिस्टर इंगित कर रहा है और न कि जहाँ स्टैक रजिस्टर इंगित कर रहा है। इसलिए यह थोड़ा अधिक जटिल है।
ARM64 में एक निर्देश वही करता है जो निर्देश करता है (निर्देशों के बीच में कूदना और उन्हें नए में बदलना संभव नहीं है)।
उदाहरण देखें:
Ret2lib + Printf leak - arm64यह प्रक्रिया से जानकारी लीक करने की अनुमति देता है printf
/puts
को कुछ विशिष्ट डेटा को तर्क के रूप में कॉल करके। उदाहरण के लिए, puts
के GOT में पते को puts
के निष्पादन में डालने से यादाश्त में puts
का पता लीक होगा।
इसका मूलतः मतलब है Ret2lib का दुरुपयोग करना ताकि इसे printf
फॉर्मेट स्ट्रिंग्स भेद्यता में बदल दिया जाए ret2lib
का उपयोग करके printf को उन मानों के साथ कॉल करना जो इसका दुरुपयोग करते हैं (बेतुका लगता है लेकिन संभव है):
Ret2lib, libc में एक फ़ंक्शन के पते को लीक करने के लिए, एक गैजेट का उपयोग करना
64 बिट, ASLR सक्षम लेकिन कोई PIE नहीं, पहला कदम एक ओवरफ्लो को भरना है जब तक कि कैनरी का बाइट 0x00 न हो जाए ताकि फिर puts को कॉल किया जा सके और इसे लीक किया जा सके। कैनरी के साथ एक ROP गैजेट बनाया जाता है जो puts को कॉल करता है ताकि GOT से puts का पता लीक किया जा सके और फिर system('/bin/sh')
को कॉल करने के लिए एक ROP गैजेट।
64 बिट, ASLR सक्षम, कोई कैनरी नहीं, मुख्य से एक बच्चे के फ़ंक्शन में स्टैक ओवरफ्लो। GOT से puts के पते को लीक करने के लिए puts को कॉल करने के लिए ROP गैजेट और फिर एक गैजेट को कॉल करें।
64 बिट, कोई pie नहीं, कोई कैनरी नहीं, कोई relro नहीं, nx। लिखने के फ़ंक्शन का उपयोग करके लिखने के पते (libc) को लीक करता है और एक गैजेट को कॉल करता है।
स्टैक से कैनरी को लीक करने के लिए एक फॉर्मेट स्ट्रिंग का उपयोग करता है और /bin/sh
के पते के साथ सिस्टम में कॉल करने के लिए एक बफर ओवरफ्लो।
32 बिट, कोई relro नहीं, कोई कैनरी नहीं, nx, pie। स्टैक से libc और heap के पते को लीक करने के लिए एक खराब इंडेक्सिंग का दुरुपयोग। system('/bin/sh')
को कॉल करने के लिए ret2lib का दुरुपयोग करें (heap का पता एक जांच को बायपास करने के लिए आवश्यक है)।
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE) GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)