
مستودع لتعلّم مختلف تقنيات استغلال الكومة (Heap).
هذا المستودع مخصص لتعلّم تقنيات استغلال الكومة المختلفة.
نستخدم إصدارات Libc الخاصة بأوبونتو كمعيار ذهبي. تم التحقق من أن كل تقنية تعمل على إصدارات أوبونتو المقابلة.
يمكنك تشغيل apt source libc6 لتنزيل الكود المصدري لمكتبة Libc التي تستخدمها على نظام تشغيل قائم على دبيان. يمكنك أيضًا النقر على ▶️ لتصحيح التقنية في متصفحك باستخدام gdb.
جاءتنا الفكرة خلال اجتماع hack، وقمنا بتنفيذ التقنيات التالية:
| الملف | ▶️ | التقنية | إصدار Glibc | التصحيح | تحديات CTF المناسبة |
|---|
| first_fit.c | يوضّح سلوك glibc malloc في الملاءمة الأولى (first-fit). | ||||
| calc_tcache_idx.c | يوضّح حساب فهرس tcache في glibc. | ||||
| fastbin_dup.c | ▶️ | خداع malloc لإرجاع مؤشر كومة مخصّص مسبقًا عبر إساءة استخدام قائمة fastbin الحرة. | < 2.43 | التصحيح | |
| fastbin_dup_into_stack.c | ▶️ | خداع malloc لإرجاع مؤشر شبه عشوائي عبر إساءة استخدام قائمة fastbin الحرة. | < 2.43 | التصحيح | 9447-search-engine, 0ctf 2017-babyheap |
| fastbin_dup_consolidate.c | ▶️ | خداع malloc لإرجاع مؤشر كومة مخصّص مسبقًا بوضع مؤشر في كل من قائمة fastbin الحرة و chunk العلوي (top chunk). | < 2.43 | التصحيح | Hitcon 2016 SleepyHolder |
| unsafe_unlink.c | ▶️ | استغلال free على chunk تالف لتحقيق كتابة عشوائية (arbitrary write). | الأحدث | HITCON CTF 2014-stkof, Insomni'hack 2017-Wheel of Robots | |
| house_of_spirit.c | ▶️ | يُحرّر chunk fastbin مزيفًا لجعل malloc يُرجع مؤشرًا شبه عشوائي. | الأحدث | hack.lu CTF 2014-OREO | |
| poison_null_byte.c | ▶️ | استغلال تجاوز بايت فارغ واحد. | الأحدث | PlaidCTF 2015-plaiddb, BalsnCTF 2019-PlainNote | |
| house_of_lore.c | ▶️ | خداع malloc لإرجاع مؤشر شبه عشوائي عبر إساءة استخدام قائمة smallbin الحرة. | الأحدث | ||
| overlapping_chunks.c | ▶️ | استغلال الكتابة فوق حجم chunk مُحرَّر في قائمة unsorted bin لجعل تخصيص جديد يتداخل مع chunk موجود | < 2.29 | التصحيح | hack.lu CTF 2015-bookstore, Nuit du Hack 2016-night-deamonic-heap |
| overlapping_chunks_2.c | ▶️ | استغلال الكتابة فوق حجم chunk قيد الاستخدام لجعل تخصيص جديد يتداخل مع chunk موجود | < 2.29 | التصحيح | |
| mmap_overlapping_chunks.c | استغلال chunk mmap قيد الاستخدام لجعل تخصيص جديد يتداخل مع chunk mmap حالي | الأحدث | |||
| house_of_force.c | ▶️ | استغلال ترويسة Top Chunk (Wilderness) لجعل malloc يُرجع مؤشرًا شبه عشوائي | < 2.29 | التصحيح | Boston Key Party 2016-cookbook, BCTF 2016-bcloud |
| unsorted_bin_into_stack.c | ▶️ | استغلال الكتابة فوق chunk مُحرَّر في قائمة unsorted bin الحرة لإرجاع مؤشر شبه عشوائي. | < 2.29 | التصحيح | |
| unsorted_bin_attack.c | ▶️ | استغلال الكتابة فوق chunk مُحرَّر في قائمة unsorted bin الحرة لكتابة قيمة كبيرة إلى عنوان عشوائي | < 2.29 | التصحيح | 0ctf 2016-zerostorage |
| large_bin_attack.c | ▶️ | استغلال الكتابة فوق chunk مُحرَّر في قائمة large bin الحرة لكتابة قيمة كبيرة إلى عنوان عشوائي | < 2.42 | التصحيح | 0ctf 2018-heapstorm2 |
| house_of_einherjar.c | ▶️ | استغلال تجاوز بايت فارغ واحد لخداع malloc لإرجاع مؤشر مُتحكَّم فيه | الأحدث | Seccon 2016-tinypad | |
| house_of_water.c | استغلال UAF أو double free للسيطرة على بيانات t-cache الوصفية دون تسريب، وطريقة دون تسريب لربط libc في t-cache | الأحدث | 37c3 Potluck - Tamagoyaki | ||
| sysmalloc_int_free.c | يوضّح تحرير Top Chunk (Wilderness) شبه العشوائي الحجم باستخدام malloc (sysmalloc _int_free() ) | الأحدث | |||
| house_of_orange.c | ▶️ | استغلال Top Chunk (Wilderness) لتحقيق تنفيذ تعليمات برمجية عشوائي (arbitrary code execution) | < 2.26 | التصحيح | Hitcon 2016 houseoforange |
| house_of_tangerine.c | استغلال Top Chunk (Wilderness) لخداع malloc لإرجاع مؤشر عشوائي تمامًا عبر إساءة استخدام قائمة tcache الحرة | >= 2.26 | PicoCTF 2024- high frequency troubles | ||
| house_of_roman.c | ▶️ | تقنية دون تسريب لتحقيق تنفيذ تعليمات برمجية عن بُعد عبر fastbins مزيفة، وهجوم unsorted_bin، والكتابات فوق النسبية. | < 2.29 | التصحيح | |
| tcache_poisoning.c | ▶️ | خداع malloc لإرجاع مؤشر عشوائي تمامًا عبر إساءة استخدام قائمة tcache الحرة. (يتطلب تسريب كومة من الإصدار 2.32 فصاعدًا) | > 2.25 | التصحيح | |
| tcache_house_of_spirit.c | ▶️ | يُحرّر chunk مزيفًا لجعل malloc يُرجع مؤشرًا شبه عشوائي. | > 2.25 | ||
| house_of_botcake.c | ▶️ | تجاوز قيود double free في tcache. أعد tcache_dup عظيمًا مرة أخرى. | > 2.25 | ||
| tcache_stashing_unlink_attack.c | ▶️ | استغلال الكتابة فوق chunk مُحرَّر في قائمة small bin الحرة لخداع malloc لإرجاع مؤشر عشوائي وكتابة قيمة كبيرة إلى عنوان عشوائي بمساعدة calloc. | > 2.25 | Hitcon 2019 one punch man | |
| fastbin_reverse_into_tcache.c | ▶️ | استغلال الكتابة فوق chunk مُحرَّر في fastbin لكتابة قيمة كبيرة إلى عنوان عشوائي. | 2.26 - 2.42 | التصحيح | |
| house_of_mind_fastbin.c | ▶️ | استغلال الكتابة فوق بايت واحد مع معالجة arena لكتابة قيمة كبيرة (مؤشر كومة) إلى عنوان عشوائي | < 2.43 | التصحيح | |
| house_of_storm.c | ▶️ | استغلال use-after-free على chunk من large bin وunsorted bin معًا لإرجاع chunk عشوائي من malloc | < 2.29 | ||
| house_of_gods.c | ▶️ | تقنية لاختطاف arena الخاصة بسلسلة تعليمات برمجية (thread) خلال 8 عمليات تخصيص | < 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(obsolete) | خداع malloc لإرجاع مؤشر كومة مخصّص مسبقًا عبر إساءة استخدام قائمة tcache الحرة. | 2.26 - 2.28 | التصحيح | ||
| tcache_metadata_poisoning.c | خداع tcache لتوفير مؤشرات عشوائية عبر التلاعب ببنية بيانات tcache الوصفية | >= 2.26 | |||
| house_of_io.c | خداع malloc لإرجاع مؤشر إلى ذاكرة عشوائية عبر التلاعب ببنية إدارة tcache باستخدام UAF في chunk tcache مُحرَّر. | 2.31 - 2.33 | |||
| tcache_relative_write.c | كتابة قيمة عشرية عشوائية ومؤشر chunk في الكومة عبر كتابة خارج الحدود في بيانات 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`.
## الإعداد الكامل
ستواجه مشكلات في إصدار الرموز (انظر [هذا](https://github.com/shellphish/how2heap/issues/169)) إذا حاولت استخدام `LD_PRELOAD` مع libcs لثنائي مُجمَّع على جهازك المضيف.
لدينا طريقتان لتجاوز ذلك.
### الطريقة 1: الربط مع إصدار أقدم من libc
هذه الطريقة تُخبر الرابط (linker) بربط الثنائي الهدف بمكتبة libc الهدف.```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
H2H_USE_SYSTEM_LIBC=N make v2.23
سيربط هذا جميع الثنائيات بمكتبات libc المقابلة. والأفضل من ذلك أنه يأتي مع رموز تصحيح الأخطاء. الآن يمكنك اللعب مع أي إصدار من libc على جهازك المضيف. في هذا المثال، سيتم ترجمة جميع ثنائيات glibc-2.23 وربطها مع libc-2.23. يمكنك تغيير الرقم للعب مع إصدارات libc الأخرى.
يستخدم هذا أسلوبًا قائمًا على Docker لترجمة الثنائيات داخل حاوية ubuntu قديمة بحيث يمكن تشغيلها مع إصدار 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
افحص كومة glibc في gdb: https://github.com/scwuaptx/Pwngdb
## pwndbg
إضافة gdb تركّز على الاستغلال وتوفّر القدرة على عرض/التلاعب بكومة glibc: https://github.com/pwndbg/pwndbg
## gef
إضافة gdb ممتازة أخرى توفّر القدرة على فحص كومة glibc: https://github.com/hugsy/gef
## heap-viewer
افحص كومة glibc في IDA Pro: 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 fanzine، مجموعة من الموارد والأمثلة المتعلقة بهجمات البيانات الوصفية على ptmalloc (http://tukan.farm/2016/07/26/ptmalloc-fanzine/) <!-- 2016 -->
- مغامرات Glibc: القطعة المنسية (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 للتغلب على wilderness (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 -->
- استغلال الـ Wilderness (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- استغلالات malloc المتقدمة لدى Doug lea (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)، وفي دوال أخرى من هذه العائلة.