Ret2lib
मूल जानकारी
Ret2Libc का सार है किसी वंलरबल प्रोग्राम के निष्पादन फ्लो को एक साझा लाइब्रेरी के फ़ंक्शन (जैसे, system, execve, strcpy) में पुनर्निर्देशित करना है बजाय टैकर द्वारा प्रदान किए गए शेलकोड को स्टैक पर निष्पादित करने के लिए। हमलावार एक पेलोड बनाता है जो स्टैक पर वापसी पता संदेशित करता है जिसे वांटेड लाइब्रेरी फ़ंक्शन पर पॉइंट करता है, साथ ही कॉलिंग कन्वेंशन के अनुसार आवश्यक तरीके से किसी भी आवश्यक तर्कों को सही ढंग से सेट करने के लिए भी व्यवस्थित करता है।
उदाहरण कदम (सरलित)
कॉल करने के लिए फ़ंक्शन (जैसे, सिस्टम) और कॉल करने के लिए कमांड (जैसे, /bin/sh) का पता लगाएं
पहले तर्क को पास करने के लिए एक ROP श्रृंखला उत्पन्न करें जो कमांड स्ट्रिंग पर पॉइंट करने वाले पहले तर्क को पास करने के लिए और फ़ंक्शन पर निष्पादन फ्लो को पास करने के लिए है।
पतों का पता लगाना
मान लें कि उपयोग की गई
libc
वही है जो वर्तमान मशीन से होगा, तो आप यहां देख सकते हैं कि यह मेमोरी में कहां लोड होगा:
यदि आप जांचना चाहते हैं कि ASLR libc के पते को बदल रहा है तो आप यह कर सकते हैं:
जानते हुए उपयोग किए गए libc का पता लगाना संभव है,
system
फ़ंक्शन के लिए ऑफ़सेट ढूंढना भी संभव है:
जानते हुए जिस libc का उपयोग किया गया है, उससे
/bin/sh
स्ट्रिंग फ़ंक्शन के लिए ऑफसेट ढूंढना भी संभव है:
जीडीबी-पीडा / जीईएफ का उपयोग
लिबसी का पता लगाने के बाद, system फ़ंक्शन, exit फ़ंक्शन और स्ट्रिंग /bin/sh
का पता लगाने के लिए Peda या GEF का उपयोग भी संभव है:
/proc/<PID>/maps का उपयोग
यदि प्रक्रिया हर बार जब आप इसके साथ बात करते हैं बच्चे बना रही है (नेटवर्क सर्वर), तो उस फ़ाइल को पढ़ने का प्रयास करें (संभावित रूप से आपको रूट होने की आवश्यकता होगी)।
यहाँ आपको प्रक्रिया के अंदर सटीक रूप से कहाँ लोड हो रहा है libc और प्रत्येक प्रक्रिया के बच्चे के लिए कहाँ लोड होने वाला है यह पता चल सकता है।
इस मामले में यह 0xb75dc000 में लोड हो रहा है (यह libc का आधार पता होगा)
अज्ञात libc
संभावना है कि आपको पता नहीं हो कि बाइनरी किस libc को लोड कर रहा है (क्योंकि यह एक सर्वर में स्थित हो सकता है जिसमें आपका कोई पहुंच नहीं है)। उस मामले में आप विकल्प का दुरुपयोग कर सकते हैं कुछ पते चोरी करने और पता लगाने के लिए कि कौन सा libc पुस्तकालय उपयोग किया जा रहा है:
pageLeaking libc address with ROPऔर आप इसके लिए एक pwntools टेम्पलेट पा सकते हैं:
pageLeaking libc - template2 ऑफसेट्स के साथ libc को जानें
पृष्ठ https://libc.blukat.me/ की जाँच करें और libc के अंदर कुछ फ़ंक्शनों के पतों का उपयोग करके उपयोग किए जाने वाले संस्करण का पता लगाने के लिए।
32 बिट में ASLR को उमकारना
ये ब्रूट-फोर्सिंग हमले केवल 32 बिट सिस्टमों के लिए उपयोगी हैं।
यदि एक्सप्लॉइट स्थानीय है, तो आप libc का आधार पता लगाने के लिए ब्रूट-फोर्स कर सकते हैं (32 बिट सिस्टमों के लिए उपयोगी है):
अगर आप एक रिमोट सर्वर पर हमला कर रहे हैं, तो आप
libc
फ़ंक्शनusleep
का पता लगाने के लिए ब्रूट-फ़ोर्स कर सकते हैं, जिसमें आप 10 को एर्ग्यूमेंट के रूप में पास कर सकते हैं। यदि किसी समय सर्वर 10 सेकंड अतिरिक्त समय लेता है तो आपने इस फ़ंक्शन का पता लगा लिया है।
एक गैजेट
libc
में एक विशिष्ट पते पर जाकर शैली चलाएं:
x86 Ret2lib कोड उदाहरण
इस उदाहरण में ASLR ब्रूट-फ़ोर्स कोड में एकीकृत किया गया है और वंशावली बाइनरी एक रिमोट सर्वर में स्थित है:
x64 Ret2lib कोड उदाहरण
निम्नलिखित उदाहरण की जाँच करें:
pageROP - Return Oriented ProgramingARM64 Ret2lib उदाहरण
ARM64 के मामले में, ret इंस्ट्रक्शन x30 रजिस्ट्री के दिखाने की ओर जाता है और न कि स्टैक रजिस्ट्री के दिखाने की ओर। इसलिए यह थोड़ा अधिक जटिल है।
इसके अलावा, ARM64 में एक इंस्ट्रक्शन वही करता है जो इंस्ट्रक्शन करता है (इंस्ट्रक्शन के बीच में जाने और उन्हें नए बनाने का संभावना नहीं है)।
उदाहरण की जाँच करें:
pageRet2lib + Printf leak - arm64Ret-into-printf (या puts)
इसके द्वारा प्रक्रिया से जानकारी लीक करने की अनुमति देता है जिसमें कुछ विशिष्ट डेटा को एक तरह के तर्क के रूप में रखकर printf
/puts
को बुलाया जाता है। उदाहरण के लिए, puts
के पते को GOT में डालकर puts
के एक्सीक्यूशन से मेमोरी में puts
का पता लीक करेगा।
Ret2printf
यह मुख्य रूप से एक Ret2lib को printf
फॉर्मेट स्ट्रिंग व्यक्तिगता में बदलने का अभद्र उपयोग करना है, ret2lib
का उपयोग करके इसे एक्सप्लॉइट करने के लिए printf
को बुलाने के लिए मानों के साथ कॉल करने के लिए (यह बेकार लग सकता है लेकिन संभव है):
अन्य उदाहरण और संदर्भ
Ret2lib, एक फ़ंक्शन के पते में लीक देने के बाद, एक गैजेट का उपयोग करते हुए
64 बिट, ASLR सक्षम है लेकिन PIE नहीं, पहला कदम एक कैनारी के 0x00 बाइट तक ओवरफ्लो भरना है और फिर puts को कॉल करना है और इसे लीक करना है। कैनारी के साथ एक ROP गैजेट बनाया जाता है जिसे puts को बुलाने के लिए GOT से puts का पता लीक करने के लिए और एक ROP गैजेट को कॉल करने के लिए
system('/bin/sh')
64 बिट, ASLR सक्षम है, कोई कैनारी नहीं, मुख्य स्टैक ओवरफ्लो में एक बच्चे फ़ंक्शन से। puts को बुलाने के लिए ROP गैजेट को कॉल करने के लिए puts के पते को GOT से लीक करने के लिए और फिर एक वन गैजेट को कॉल करने के लिए।
64 बिट, कोई PIE नहीं, कोई कैनारी नहीं, कोई relro नहीं, nx। write फ़ंक्शन का उपयोग करके write (libc) का पता लीक करने के लिए और एक गैजेट को कॉल करने के लिए।
स्टैक से कैनारी को लीक करने के लिए एक फॉर्मेट स्ट्रिंग का उपयोग करना और सिस्टम में कॉल करने के लिए एक बफर ओवरफ्लो करना (यह GOT में है)
/bin/sh
के पते के साथ।32 बिट, कोई relro नहीं, कोई कैनारी नहीं, nx, pie। स्टैक से libc और हीप के पतों को लीक करने के लिए एक बुरा इंडेक्सिंग का दुरुपयोग करना।
system('/bin/sh')
को कॉल करने के लिए ret2lib को करने के लिए बफर ओवरफ्लो का दुरुपयोग करना है (हीप पता एक जांच को छलने के लिए आवश्यक है)।
Last updated