
विभिन्न हीप शोषण तकनीकों को सीखने के लिए एक रिपॉजिटरी।
यह रिपॉजिटरी विभिन्न हीप एक्सप्लॉइटेशन तकनीकों को सीखने के लिए है।
हम Ubuntu की Libc रिलीज़ को स्वर्ण मानक के रूप में उपयोग करते हैं। प्रत्येक तकनीक को संबंधित Ubuntu रिलीज़ पर काम करने के लिए सत्यापित किया गया है।
आप Debian-आधारित ऑपरेटिंग सिस्टम पर उपयोग किए जा रहे Libc का सोर्स कोड डाउनलोड करने के लिए apt source libc6 चला सकते हैं। आप gdb का उपयोग करके तकनीक को अपने ब्राउज़र में डीबग करने के लिए ▶️ पर भी क्लिक कर सकते हैं।
यह विचार हमें एक हैक मीटिंग के दौरान आया था, और हमने निम्नलिखित तकनीकों को लागू किया है:
| फ़ाइल | ▶️ | तकनीक | Glibc-संस्करण | पैच | लागू CTF चुनौतियाँ |
|---|
| first_fit.c | glibc malloc के फर्स्ट-फिट व्यवहार का प्रदर्शन। | ||||
| calc_tcache_idx.c | glibc के tcache इंडेक्स गणना का प्रदर्शन। | ||||
| fastbin_dup.c | ▶️ | fastbin freelist का दुरुपयोग करके malloc को पहले से आवंटित हीप पॉइंटर लौटाने के लिए धोखा देना। | < 2.43 | पैच | |
| fastbin_dup_into_stack.c | ▶️ | fastbin freelist का दुरुपयोग करके malloc को लगभग-मनमाना पॉइंटर लौटाने के लिए धोखा देना। | < 2.43 | पैच | 9447-search-engine, 0ctf 2017-babyheap |
| fastbin_dup_consolidate.c | ▶️ | fastbin freelist और टॉप चंक दोनों पर पॉइंटर रखकर malloc को पहले से आवंटित हीप पॉइंटर लौटाने के लिए धोखा देना। | < 2.43 | पैच | Hitcon 2016 SleepyHolder |
| unsafe_unlink.c | ▶️ | दूषित चंक पर free का शोषण करके मनमाना लेखन प्राप्त करना। | नवीनतम | HITCON CTF 2014-stkof, Insomni'hack 2017-Wheel of Robots | |
| house_of_spirit.c | ▶️ | malloc से लगभग-मनमाना पॉइंटर लौटाने के लिए नकली fastbin चंक को free करता है। | नवीनतम | hack.lu CTF 2014-OREO | |
| poison_null_byte.c | ▶️ | एकल null बाइट ओवरफ़्लो का शोषण। | नवीनतम | PlaidCTF 2015-plaiddb, BalsnCTF 2019-PlainNote | |
| house_of_lore.c | ▶️ | smallbin freelist का दुरुपयोग करके malloc को लगभग-मनमाना पॉइंटर लौटाने के लिए धोखा देना। | नवीनतम | ||
| overlapping_chunks.c | ▶️ | unsorted bin में मुक्त चंक के आकार के ओवरराइट का शोषण करना ताकि नया आवंटन मौजूदा चंक के साथ ओवरलैप हो सके। | < 2.29 | पैच | hack.lu CTF 2015-bookstore, Nuit du Hack 2016-night-deamonic-heap |
| overlapping_chunks_2.c | ▶️ | उपयोग में चंक के आकार के ओवरराइट का शोषण करना ताकि नया आवंटन मौजूदा चंक के साथ ओवरलैप हो सके। | < 2.29 | पैच | |
| mmap_overlapping_chunks.c | उपयोग में mmap चंक का शोषण करना ताकि नया आवंटन वर्तमान mmap चंक के साथ ओवरलैप हो सके। | नवीनतम | |||
| house_of_force.c | ▶️ | malloc से लगभग-मनमाना पॉइंटर लौटाने के लिए टॉप चंक (Wilderness) हेडर का शोषण करना। | < 2.29 | पैच | Boston Key Party 2016-cookbook, BCTF 2016-bcloud |
| unsorted_bin_into_stack.c | ▶️ | लगभग-मनमाना पॉइंटर लौटाने के लिए unsorted bin freelist पर मुक्त चंक के ओवरराइट का शोषण करना। | < 2.29 | पैच | |
| unsorted_bin_attack.c | ▶️ | मनमाने पते पर बड़ा मान लिखने के लिए unsorted bin freelist पर मुक्त चंक के ओवरराइट का शोषण करना। | < 2.29 | पैच | 0ctf 2016-zerostorage |
| large_bin_attack.c | ▶️ | मनमाने पते पर बड़ा मान लिखने के लिए large bin freelist पर मुक्त चंक के ओवरराइट का शोषण करना। | < 2.42 | पैच | 0ctf 2018-heapstorm2 |
| house_of_einherjar.c | ▶️ | malloc को नियंत्रित पॉइंटर लौटाने के लिए धोखा देने हेतु एकल null बाइट ओवरफ़्लो का शोषण करना। | नवीनतम | Seccon 2016-tinypad | |
| house_of_water.c | t-cache मेटाडेटा पर लीक-रहित नियंत्रण पाने और t-cache में libc को लिंक करने का लीक-रहित तरीका प्राप्त करने के लिए UAF या double free का शोषण करना। | नवीनतम | 37c3 Potluck - Tamagoyaki | ||
| sysmalloc_int_free.c | malloc (sysmalloc _int_free()) का उपयोग करके लगभग मनमाने आकार के टॉप चंक (Wilderness) को free करने का प्रदर्शन। | नवीनतम | |||
| house_of_orange.c | ▶️ | मनमाना कोड निष्पादन प्राप्त करने के लिए टॉप चंक (Wilderness) का शोषण करना। | < 2.26 | पैच | Hitcon 2016 houseoforange |
| house_of_tangerine.c | tcache freelist का दुरुपयोग करके malloc को पूर्णतः मनमाना पॉइंटर लौटाने के लिए धोखा देने हेतु टॉप चंक (Wilderness) का शोषण करना। | >= 2.26 | PicoCTF 2024- high frequency troubles | ||
| house_of_roman.c | ▶️ | नकली fastbins, unsorted_bin attack और सापेक्ष ओवरराइट के माध्यम से रिमोट कोड निष्पादन प्राप्त करने की लीक-रहित तकनीक। | < 2.29 | पैच | |
| tcache_poisoning.c | ▶️ | tcache freelist का दुरुपयोग करके malloc को पूर्णतः मनमाना पॉइंटर लौटाने के लिए धोखा देना। (2.32 और उसके बाद हीप लीक की आवश्यकता है) | > 2.25 | पैच | |
| tcache_house_of_spirit.c | ▶️ | malloc से लगभग-मनमाना पॉइंटर प्राप्त करने के लिए नकली चंक को free करता है। | > 2.25 | ||
| house_of_botcake.c | ▶️ | tcache पर double free प्रतिबंध को बायपास करें। tcache_dup को फिर से शानदार बनाएं। | > 2.25 | ||
| tcache_stashing_unlink_attack.c | ▶️ | calloc की सहायता से malloc को मनमाना पॉइंटर लौटाने और मनमाने पते पर बड़ा मान लिखने के लिए small bin freelist पर मुक्त चंक के ओवरराइट का शोषण करना। | > 2.25 | Hitcon 2019 one punch man | |
| fastbin_reverse_into_tcache.c | ▶️ | मनमाने पते पर बड़ा मान लिखने के लिए fastbin में मुक्त चंक के ओवरराइट का शोषण करना। | 2.26 - 2.42 | पैच | |
| house_of_mind_fastbin.c | ▶️ | मनमाने पते पर बड़ा मान (हीप पॉइंटर) लिखने के लिए arena हैंडलिंग के साथ एकल बाइट ओवरराइट का शोषण करना। | < 2.43 | पैच | |
| house_of_storm.c | ▶️ | malloc से मनमाना चंक लौटाने के लिए large और unsorted bin चंक दोनों पर use-after-free का शोषण करना। | < 2.29 | ||
| house_of_gods.c | ▶️ | 8 आवंटनों के भीतर किसी थ्रेड के arena को हाईजैक करने की एक तकनीक। | < 2.27 | ||
| decrypt_safe_linking.c | ▶️ | लिंक्ड सूची में पॉइज़न किए गए मान को डिक्रिप्ट कर वास्तविक पॉइंटर प्राप्त करें। | >= 2.32 | ||
| safe_link_double_protect.c | किसी पॉइंटर को दो बार सुरक्षित करके PROTECT_PTR के लिए लीक-रहित बायपास, जो t-cache में मनमाना पॉइंटर लिंकिंग की अनुमति देता है। | >= 2.32 | 37c3 Potluck - Tamagoyaki | ||
| tcache_dup.c(अप्रचलित) | tcache freelist का दुरुपयोग करके malloc को पहले से आवंटित हीप पॉइंटर लौटाने के लिए धोखा देना। | 2.26 - 2.28 | पैच | ||
| tcache_metadata_poisoning.c | tcache मेटाडेटा struct में हेरफेर करके tcache को मनमाने पॉइंटर प्रदान करने के लिए धोखा देना। | >= 2.26 | |||
| house_of_io.c | एक free'd tcache चंक में UAF द्वारा tcache प्रबंधन struct में हेरफेर करके malloc को मनमानी मेमोरी का पॉइंटर लौटाने के लिए धोखा देना। | 2.31 - 2.33 | |||
| tcache_relative_write.c | आउट-ऑफ-बाउंड tcache मेटाडेटा लेखन द्वारा हीप में मनमाना दशमलव मान और चंक पॉइंटर लेखन। | 2.30-2.41 | पैच | ||
| tcache_metadata_hijacking | tcache मेटाडेटा में ओवरफ़्लो द्वारा मनमाना आवंटन। | >= 2.42 |
GnuLibc निरंतर विकास के अधीन है और उपरोक्त कई तकनीकों के कारण malloc/free तर्क में स्थिरता जाँचें जोड़ी गई हैं।
परिणामस्वरूप, ये जाँचें नियमित रूप से कुछ तकनीकों को तोड़ देती हैं और उन्हें बायपास करने के लिए (यदि संभव हो) समायोजन की आवश्यकता होती है।
हम इस समस्या का समाधान उसी तकनीक के कई संस्करण रखकर करते हैं, प्रत्येक Glibc-रिलीज़ के लिए जिसमें समायोजन की आवश्यकता थी।
संरचना glibc_<version>/technique.c है।
आपके पास एक अच्छा उदाहरण है?
उसे यहाँ जोड़ें!
पूरी तकनीक को एक ही .c फ़ाइल में इनलाइन करने का प्रयास करें -- इस तरह सीखना बहुत आसान है।
patchelf zstd wget (बेशक कंपाइलरों के लिए build-essential या समान, make, ... भी)/usr/bin/python आपकी python बाइनरी होना चाहिए या उसकी ओर इंगित करना चाहिए (जैसे /usr/bin/python3)```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
make clean base
./malloc_playgroundध्यान दें कि यह बाइनरी को आपके सिस्टम libc से लिंक करेगा। यदि आप अन्य libc संस्करणों के साथ प्रयोग करना चाहते हैं। कृपया `Complete Setup` देखें।
## पूर्ण सेटअप
यदि आप अपने होस्ट मशीन पर संकलित किसी बाइनरी में `LD_PRELOAD` libcs लोड करने का प्रयास करते हैं, तो आपको सिंबल वर्जनिंग समस्याओं का सामना करना पड़ेगा (देखें [यह](https://github.com/shellphish/how2heap/issues/169))।
इसे बायपास करने के दो तरीके हैं।
### विधि 1: पुराने libc के साथ लिंक करना
यह लिंकर को टार्गेट बाइनरी को टार्गेट libc के साथ लिंक करने के लिए कहता है।```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
H2H_USE_SYSTEM_LIBC=N make v2.23
यह सभी बाइनरी को संबंधित libcs के साथ लिंक करेगा। इससे बेहतर यह है कि इसमें डिबग प्रतीक (debug symbols) शामिल हैं। अब आप अपनी होस्ट मशीन पर किसी भी libc संस्करण के साथ प्रयोग कर सकते हैं। इस उदाहरण में, यह सभी glibc-2.23 बाइनरी को संकलित करेगा और उन्हें libc-2.23 के साथ लिंक करेगा। आप अन्य libc संस्करणों के साथ प्रयोग करने के लिए संख्या बदल सकते हैं।
यह एक पुराने ubuntu कंटेनर के अंदर बाइनरी संकलित करने के लिए Docker-आधारित दृष्टिकोण का उपयोग करता है, ताकि यह लक्षित libc संस्करण के साथ चलने योग्य हो।```shell git clone https://github.com/shellphish/how2heap cd how2heap
make base ./glibc_run.sh 2.30 ./malloc_playground -d -p
readelf -d -W malloc_playground | grep RUNPATH # or use checksec readelf -l -W malloc_playground | grep interpreter gdb -q -ex "start" ./malloc_playground
# हीप शोषण उपकरण
यहाँ कुछ हीप शोषण उपकरण उपलब्ध हैं।
## Malloc Playground
दिया गया `malloc_playground.c` फ़ाइल एक प्रोग्राम का स्रोत है जो उपयोगकर्ता को इंटरैक्टिव रूप से मेमोरी आवंटित करने और मुक्त करने के लिए कमांड देने का संकेत देता है।
## Pwngdb
gdb में glibc हीप की जाँच करें: https://github.com/scwuaptx/Pwngdb
## pwndbg
एक शोषण-केंद्रित gdb प्लगइन जो glibc हीप को देखने/छेड़छाड़ करने की क्षमता प्रदान करता है: https://github.com/pwndbg/pwndbg
## gef
एक और उत्कृष्ट gdb प्लगइन जो glibc हीप की जाँच करने की क्षमता प्रदान करता है: https://github.com/hugsy/gef
## heap-viewer
IDA Pro में glibc हीप की जाँच करें: https://github.com/danigargu/heap-viewer
## heaptrace
पतों को प्रतीकों से बदलकर हीप ऑपरेशन को विज़ुअलाइज़ करने में आपकी सहायता करता है: https://github.com/Arinerron/heaptrace
# अन्य संसाधन
कुछ अच्छे हीप शोषण संसाधन, मोटे तौर पर उनके प्रकाशन के उल्टे क्रम में, ये हैं:
## उपयोगी हीप शोषण ट्यूटोरियल
- GLIBC हीप शोषण तकनीकों का अवलोकन (https://0x434b.dev/overview-of-glibc-heap-exploitation-techniques/) <!-- 2022 -->
- गहन glibc ट्यूटोरियल (https://heap-exploitation.dhavalkapil.com/) - पुस्तक और एक्सप्लॉइट नमूने <!-- 2022 -->
- glibc-2.31 पर काम करने वाली हीप शोषण तकनीकें (https://github.com/StarCross-Tech/heap_exploit_2.31) <!-- 2020 -->
- लिनक्स यूज़रलैंड हीप का आसान परिचय (https://sensepost.com/blog/2017/painless-intro-to-the-linux-userland-heap/) <!-- 2017 -->
- ptmalloc फ़ैनज़ीन, ptmalloc पर मेटा-डेटा हमलों से संबंधित संसाधनों और उदाहरणों का एक सेट (http://tukan.farm/2016/07/26/ptmalloc-fanzine/) <!-- 2016 -->
- Glibc Adventures: The Forgotten Chunk (https://github.com/bash-c/slides/blob/master/pwn_heap/Glibc%20Adventures:%20The%20forgotten%20chunks.pdf) - उन्नत हीप शोषण <!-- 2015 -->
## ऐतिहासिक हीप शोषण (इतिहास)
- Pseudomonarchia jemallocum (http://www.phrack.org/issues/68/10.html) <!-- 2012 -->
- The House Of Lore: Reloaded (http://phrack.org/issues/67/8.html) <!-- 2010 -->
- Malloc Des-Maleficarum (http://phrack.org/issues/66/10.html) - कुछ malloc शोषण तकनीकें <!-- 2009 -->
- एक और free() शोषण तकनीक (http://phrack.org/issues/66/6.html) <!-- 2009 -->
- वाइल्डरनेस को पराजित करने के लिए set_head का उपयोग (http://phrack.org/issues/64/9.html) <!-- 2007 -->
- हीप को तोड़कर समझना (https://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf) - हीप कार्यान्वयन और कुछ एक्सप्लॉइट्स की व्याख्या करता है <!-- 2007 -->
- OS X हीप शोषण तकनीकें (http://phrack.org/issues/63/5.html) <!-- 2005 -->
- The Malloc Maleficarum (http://seclists.org/bugtraq/2005/Oct/118) <!-- 2005 -->
- वाइल्डरनेस का शोषण (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- Doug lea के उन्नत malloc एक्सप्लॉइट्स (http://phrack.org/issues/61/6.html) <!-- 2003 -->
# हार्डनिंग
glibc में कुछ "हार्डनिंग" उपाय निर्मित हैं, जैसे `export MALLOC_CHECK_=1` (कुछ जाँच सक्षम करता है), `export MALLOC_PERTURB_=1` (डेटा ओवरराइट हो जाता है), `export MALLOC_MMAP_THRESHOLD_=1` (हमेशा mmap() का उपयोग करें), ...
अधिक जानकारी: [mcheck()](http://www.gnu.org/software/libc/manual/html_node/Heap-Consistency-Checking.html), [mallopt()](http://www.gnu.org/software/libc/manual/html_node/Malloc-Tunable-Parameters.html).
कुछ ट्रेसिंग समर्थन भी है जैसे [mtrace()](http://manpages.ubuntu.com/mtrace), [malloc_stats()](http://manpages.ubuntu.com/malloc_stats), [malloc_info()](http://manpages.ubuntu.com/malloc_info), [memusage](http://manpages.ubuntu.com/memusage), और इस परिवार के अन्य फ़ंक्शनों में।