WWW2Exec - atexit()
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
आजकल इसे शोषण करना बहुत अजीब है!
atexit()
एक फ़ंक्शन है जिसमें अन्य फ़ंक्शन पैरामीटर के रूप में पास किए जाते हैं। ये फ़ंक्शन तब निष्पादित होंगे जब exit()
या main का रिटर्न किया जाएगा।
यदि आप इन फ़ंक्शनों में से किसी के पते को एक शेलकोड की ओर संशोधित कर सकते हैं, तो आप प्रक्रिया पर नियंत्रण प्राप्त कर लेंगे, लेकिन यह वर्तमान में अधिक जटिल है।
वर्तमान में निष्पादित होने वाले फ़ंक्शनों के पते कई संरचनाओं के पीछे छिपे हुए हैं और अंततः जिस पते की ओर यह इंगित करते हैं, वे फ़ंक्शनों के पते नहीं हैं, बल्कि XOR और एक यादृच्छिक कुंजी के साथ विस्थापनों के साथ एन्क्रिप्टेड हैं। इसलिए वर्तमान में यह हमला वेक्टर कम से कम x86 और x64_86 पर बहुत उपयोगी नहीं है।
एन्क्रिप्शन फ़ंक्शन PTR_MANGLE
है। अन्य आर्किटेक्चर जैसे m68k, mips32, mips64, aarch64, arm, hppa... एन्क्रिप्शन फ़ंक्शन को क्रियान्वित नहीं करते क्योंकि यह वही लौटाता है जो इसे इनपुट के रूप में मिला। इसलिए ये आर्किटेक्चर इस वेक्टर द्वारा हमले के लिए संवेदनशील होंगे।
आप इस पर गहन व्याख्या https://m101.github.io/binholic/2017/05/20/notes-on-abusing-exit-handlers.html पर पा सकते हैं।
जैसा कि इस पोस्ट में समझाया गया है, यदि प्रोग्राम return
या exit()
का उपयोग करके समाप्त होता है, तो यह __run_exit_handlers()
को चलाएगा जो पंजीकृत डेस्ट्रक्टर्स को कॉल करेगा।
यदि प्रोग्राम _exit()
फ़ंक्शन के माध्यम से समाप्त होता है, तो यह exit
syscall को कॉल करेगा और निकासी हैंडलर निष्पादित नहीं होंगे। इसलिए, यह पुष्टि करने के लिए कि __run_exit_handlers()
निष्पादित होता है, आप उस पर एक ब्रेकपॉइंट सेट कर सकते हैं।
महत्वपूर्ण कोड है (source):
नोट करें कि map -> l_addr + fini_array -> d_un.d_ptr
का उपयोग स्थान की गणना करने के लिए किया जाता है कार्यक्रमों के कॉल के लिए।
कुछ विकल्प हैं:
map->l_addr
के मान को ओवरराइट करें ताकि यह एक नकली fini_array
की ओर इशारा करे जिसमें मनमाने कोड को निष्पादित करने के लिए निर्देश हों।
l_info[DT_FINI_ARRAY]
और l_info[DT_FINI_ARRAYSZ]
प्रविष्टियों को ओवरराइट करें (जो अधिक या कम मेमोरी में लगातार होते हैं), ताकि वे एक जाली Elf64_Dyn
संरचना की ओर इशारा करें जो फिर से array
को एक मेमोरी क्षेत्र की ओर इशारा करेगा जिसे हमलावर ने नियंत्रित किया।
इस तकनीक के मुख्य पोस्ट और इस लेख के अनुसार ld.so एक पॉइंटर को स्टैक पर छोड़ता है जो ld.so में बाइनरी link_map
की ओर इशारा करता है। एक मनमाने लेखन के साथ इसे ओवरराइट करना संभव है और इसे एक नकली fini_array
की ओर इशारा करने के लिए बनाना संभव है जिसे हमलावर द्वारा नियंत्रित किया गया है जिसमें एक एक गेजेट का पता हो, उदाहरण के लिए।
पिछले कोड के बाद आप कोड के साथ एक और दिलचस्प अनुभाग पा सकते हैं:
इस मामले में map->l_info[DT_FINI]
के मान को एक जाली ElfW(Dyn)
संरचना की ओर इंगित करना संभव होगा। यहां अधिक जानकारी प्राप्त करें.
__run_exit_handlers
मेंजैसा कि यहां समझाया गया है, यदि कोई प्रोग्राम return
या exit()
के माध्यम से बाहर निकलता है, तो यह __run_exit_handlers()
को निष्पादित करेगा जो किसी भी पंजीकृत डेस्ट्रक्टर फ़ंक्शन को कॉल करेगा।
_run_exit_handlers()
से कोड:
__call_tls_dtors()
का कोड:
प्रत्येक पंजीकृत फ़ंक्शन के लिए tls_dtor_list
, यह cur->func
से पॉइंटर को डिमैंगल करेगा और इसे तर्क cur->obj
के साथ कॉल करेगा।
इस GEF के फोर्क से tls
फ़ंक्शन का उपयोग करते हुए, यह देखना संभव है कि वास्तव में dtor_list
stack canary और PTR_MANGLE cookie के बहुत करीब है। इसलिए, इसके ओवरफ्लो के साथ cookie और stack canary को overwrite करना संभव होगा।
PTR_MANGLE cookie को ओवरराइट करते हुए, PTR_DEMANLE
फ़ंक्शन को 0x00 पर सेट करके bypass करना संभव होगा, जिसका अर्थ है कि वास्तविक पता प्राप्त करने के लिए उपयोग किया गया xor
केवल कॉन्फ़िगर किया गया पता है। फिर, dtor_list
पर लिखकर, कई फ़ंक्शंस को फ़ंक्शन पते और इसके तर्क के साथ चेन करना संभव है।
अंत में ध्यान दें कि संग्रहीत पॉइंटर केवल cookie के साथ xored नहीं होगा बल्कि 17 बिट्स भी घुमाया जाएगा:
इसलिए आपको एक नया पता जोड़ने से पहले इसे ध्यान में रखना चाहिए।
मूल पोस्ट में एक उदाहरण खोजें।
__run_exit_handlers
मेंयह तकनीक यहां समझाई गई है और फिर से इस पर निर्भर करती है कि प्रोग्राम return
या exit()
को कॉल करते समय समाप्त हो रहा है ताकि __run_exit_handlers()
को कॉल किया जा सके।
आइए इस फ़ंक्शन का अधिक कोड देखें:
The variable f
initial
संरचना की ओर इशारा करता है और f->flavor
के मान के आधार पर विभिन्न कार्यों को कॉल किया जाएगा।
मान के आधार पर, कॉल करने के लिए कार्य का पता एक अलग स्थान पर होगा, लेकिन यह हमेशा demangled होगा।
इसके अलावा, विकल्प ef_on
और ef_cxa
में एक argument को नियंत्रित करना भी संभव है।
आप initial
संरचना को GEF के साथ डिबगिंग सत्र में gef> p initial
के साथ जांच सकते हैं।
इसका दुरुपयोग करने के लिए, आपको या तो leak या PTR_MANGLE
cookie को मिटाना होगा और फिर system('/bin/sh')
के साथ initial
में एक cxa
प्रविष्टि को ओवरराइट करना होगा।
आप इसे तकनीक के बारे में मूल ब्लॉग पोस्ट में एक उदाहरण पा सकते हैं।
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)