استغلال الكومة التعليمي
هذا المستودع مخصص لتعلّم تقنيات استغلال الكومة المختلفة.
نستخدم إصدارات Libc الخاصة بأوبونتو كمعيار ذهبي. تم التحقق من أن كل تقنية تعمل على إصدارات أوبونتو المقابلة.
يمكنك تشغيل apt source libc6 لتنزيل الكود المصدري لمكتبة Libc التي تستخدمها على نظام تشغيل قائم على دبيان. يمكنك أيضًا النقر على ▶️ لتصحيح التقنية في متصفحك باستخدام gdb.
جاءتنا الفكرة خلال اجتماع hack، وقمنا بتنفيذ التقنيات التالية:
تخضع 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 الأخرى.
الطريقة 2: استخدام docker
يستخدم هذا أسلوبًا قائمًا على Docker لترجمة الثنائيات داخل حاوية ubuntu قديمة بحيث يمكن تشغيلها مع إصدار libc المستهدف.```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
the next command will prepare the target binary so it runs with
the expected libc version
make base
./glibc_run.sh 2.30 ./malloc_playground -d -p
now you can play with the binary with glibc-2.30
and even debug it with the correct symbols
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)، وفي دوال أخرى من هذه العائلة.