Basic Binary Exploitation Methodology

Reading time: 9 minutes

tip

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

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

ELF Basic Info

किसी भी चीज़ का शोषण करने से पहले, ELF बाइनरी की संरचना के एक भाग को समझना दिलचस्प है:

ELF Basic Information

Exploiting Tools

Exploiting Tools

Stack Overflow Methodology

इतनी सारी तकनीकों के साथ, यह अच्छा है कि जब प्रत्येक तकनीक उपयोगी होगी, तो एक योजना हो। ध्यान दें कि समान सुरक्षा विभिन्न तकनीकों को प्रभावित करेगी। आप प्रत्येक सुरक्षा अनुभाग में सुरक्षा को बायपास करने के तरीके पा सकते हैं, लेकिन इस पद्धति में नहीं।

Controlling the Flow

एक प्रोग्राम के प्रवाह को नियंत्रित करने के लिए विभिन्न तरीके हैं:

  • Stack Overflows स्टैक से रिटर्न पॉइंटर या EBP -> ESP -> EIP को ओवरराइट करना।
  • ओवरफ्लो उत्पन्न करने के लिए Integer Overflows का दुरुपयोग करना पड़ सकता है।
  • या Arbitrary Writes + Write What Where to Execution के माध्यम से।
  • Format strings: printf का दुरुपयोग करके मनमाने पते पर मनमानी सामग्री लिखना।
  • Array Indexing: कुछ ऐरे को नियंत्रित करने और एक मनमाना लिखने के लिए खराब डिज़ाइन की गई इंडेक्सिंग का दुरुपयोग करना।
  • ओवरफ्लो उत्पन्न करने के लिए Integer Overflows का दुरुपयोग करना पड़ सकता है।
  • bof to WWW via ROP: एक बफर ओवरफ्लो का दुरुपयोग करके एक ROP का निर्माण करना और WWW प्राप्त करना।

आप Write What Where to Execution तकनीकों को पा सकते हैं:

Write What Where 2 Exec

Eternal Loops

ध्यान में रखने वाली एक बात यह है कि आमतौर पर एक ही भेद्यता का शोषण सफल शोषण के लिए पर्याप्त नहीं हो सकता है, विशेष रूप से कुछ सुरक्षा को बायपास करने की आवश्यकता होती है। इसलिए, यह दिलचस्प है कि एकल भेद्यता को एक ही बाइनरी के निष्पादन में कई बार शोषण करने योग्य बनाने के लिए कुछ विकल्पों पर चर्चा करें:

  • main फ़ंक्शन का पता या उस पते को लिखें जहां भेद्यता हो रही है।
  • एक उचित ROP श्रृंखला को नियंत्रित करके, आप उस श्रृंखला में सभी क्रियाएँ करने में सक्षम हो सकते हैं।
  • exit GOT में पते पर लिखें (या किसी अन्य फ़ंक्शन का उपयोग बाइनरी द्वारा समाप्त होने से पहले) पता वापस जाने के लिए भेद्यता
  • जैसा कि .fini_array** में समझाया गया है,** यहां 2 फ़ंक्शन स्टोर करें, एक बार फिर vuln को कॉल करने के लिए और दूसरा __libc_csu_fini को कॉल करने के लिए जो फिर से .fini_array से फ़ंक्शन को कॉल करेगा।

Exploitation Goals

Goal: Call an Existing function

  • ret2win: कोड में एक फ़ंक्शन है जिसे आपको कॉल करना है (शायद कुछ विशिष्ट पैरामीटर के साथ) ताकि फ्लैग प्राप्त किया जा सके।
  • एक सामान्य bof बिना PIE और canary आपको बस स्टैक में स्टोर किए गए रिटर्न पते में पता लिखने की आवश्यकता है।
  • PIE के साथ एक bof में, आपको इसे बायपास करने की आवश्यकता होगी।
  • canary के साथ एक bof में, आपको इसे बायपास करने की आवश्यकता होगी।
  • यदि आपको ret2win फ़ंक्शन को सही ढंग से कॉल करने के लिए कई पैरामीटर सेट करने की आवश्यकता है, तो आप उपयोग कर सकते हैं:
  • यदि पर्याप्त गैजेट हैं तो ROP श्रृंखला सभी पैरामीटर तैयार करने के लिए।
  • SROP (यदि आप इस syscall को कॉल कर सकते हैं) बहुत सारे रजिस्टर को नियंत्रित करने के लिए।
  • ret2csu और ret2vdso से गैजेट्स कई रजिस्टर को नियंत्रित करने के लिए।
  • Write What Where के माध्यम से आप अन्य भेद्यताओं (bof नहीं) का दुरुपयोग कर सकते हैं ताकि win फ़ंक्शन को कॉल किया जा सके।
  • Pointers Redirecting: यदि स्टैक में किसी फ़ंक्शन के लिए पॉइंटर्स हैं जिसे कॉल किया जाने वाला है या किसी स्ट्रिंग के लिए जो किसी दिलचस्प फ़ंक्शन (system या printf) द्वारा उपयोग की जाने वाली है, तो उस पते को ओवरराइट करना संभव है।
  • ASLR या PIE पते को प्रभावित कर सकते हैं।
  • Uninitialized variables: आप कभी नहीं जानते।

Goal: RCE

Via shellcode, if nx disabled or mixing shellcode with ROP:

  • (Stack) Shellcode: यह स्टैक में एक शेलकोड स्टोर करने के लिए उपयोगी है, रिटर्न पॉइंटर को ओवरराइट करने से पहले या बाद में और फिर इसे निष्पादित करने के लिए कूदना:
  • किसी भी मामले में, यदि कोई canary** है,** एक सामान्य bof में आपको इसे बायपास (leak) करने की आवश्यकता होगी।
  • बिना ASLR और nx के, स्टैक के पते पर कूदना संभव है क्योंकि यह कभी नहीं बदलेगा।
  • साथ में ASLR आपको ret2esp/ret2reg जैसी तकनीकों की आवश्यकता होगी।
  • साथ में nx, आपको कुछ ROP का उपयोग करना होगा memprotect को कॉल करने के लिए और कुछ पृष्ठ rwx बनाने के लिए, ताकि फिर वहां शेलकोड स्टोर किया जा सके (उदाहरण के लिए पढ़ें) और फिर वहां कूदें।
  • यह शेलकोड को ROP श्रृंखला के साथ मिलाएगा।

Via syscalls

  • Ret2syscall: मनमाने कमांड चलाने के लिए execve को कॉल करने के लिए उपयोगी। आपको विशिष्ट syscall को पैरामीटर के साथ कॉल करने के लिए गैजेट्स खोजने में सक्षम होना चाहिए
  • यदि ASLR या PIE सक्षम हैं, तो आपको ROP गैजेट्स का उपयोग करने के लिए उन्हें हराना होगा।
  • SROP ret2execve तैयार करने के लिए उपयोगी हो सकता है।
  • ret2csu और ret2vdso से गैजेट्स कई रजिस्टर को नियंत्रित करने के लिए।

Via libc

  • Ret2lib: एक लाइब्रेरी (आमतौर पर libc) से एक फ़ंक्शन को कॉल करने के लिए उपयोगी जैसे system कुछ तैयार किए गए तर्कों के साथ (जैसे '/bin/sh')। आपको बाइनरी को लाइब्रेरी को लोड करने की आवश्यकता है जिसमें आप कॉल करना चाहते हैं (आमतौर पर libc)।
  • यदि स्थैतिक रूप से संकलित और कोई PIE नहीं है, तो system और /bin/sh का पता नहीं बदलेगा, इसलिए आप उन्हें स्थैतिक रूप से उपयोग कर सकते हैं।
  • बिना ASLR और लोड की गई libc संस्करण को जानने के लिए, system और /bin/sh का पता नहीं बदलेगा, इसलिए आप उन्हें स्थैतिक रूप से उपयोग कर सकते हैं।
  • ASLR लेकिन कोई PIE, libc को जानने और बाइनरी का उपयोग करते हुए system फ़ंक्शन के लिए, GOT में system के पते पर ret करना संभव है, जिसमें '/bin/sh' का पता पैरामीटर में है (आपको इसे समझना होगा)।
  • ASLR लेकिन कोई PIE नहीं, libc को जानने और बाइनरी का उपयोग नहीं करते हुए system:
  • ret2dlresolve का उपयोग करें ताकि system का पता हल किया जा सके और इसे कॉल किया जा सके।
  • ASLR को बायपास करें और मेमोरी में system और '/bin/sh' का पता निकालें।
  • साथ में ASLR और PIE और libc को न जानते हुए: आपको:
  • PIE को बायपास करना होगा।
  • उपयोग की गई libc संस्करण खोजें (कुछ फ़ंक्शन पते लीक करें)।
  • आगे बढ़ने के लिए ASLR के साथ पिछले परिदृश्यों की जांच करें

Via EBP/RBP

  • Stack Pivoting / EBP2Ret / EBP Chaining: स्टैक में स्टोर किए गए EBP के माध्यम से RET को नियंत्रित करने के लिए ESP को नियंत्रित करें।
  • off-by-one स्टैक ओवरफ्लो के लिए उपयोगी।
  • EIP को नियंत्रित करने के लिए एक वैकल्पिक तरीके के रूप में उपयोगी जबकि EIP का दुरुपयोग करके मेमोरी में पेलोड का निर्माण करना और फिर EBP के माध्यम से उस पर कूदना।

Misc

  • Pointers Redirecting: यदि स्टैक में किसी फ़ंक्शन के लिए पॉइंटर्स हैं जिसे कॉल किया जाने वाला है या किसी स्ट्रिंग के लिए जो किसी दिलचस्प फ़ंक्शन (system या printf) द्वारा उपयोग की जाने वाली है, तो उस पते को ओवरराइट करना संभव है।
  • ASLR या PIE पते को प्रभावित कर सकते हैं।
  • Uninitialized variables: आप कभी नहीं जानते।

tip

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

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