Обучение эксплуатации кучи
Этот репозиторий предназначен для изучения различных техник эксплуатации кучи.
Мы используем релизы Libc от Ubuntu как эталон. Каждая техника проверена на соответствующих релизах Ubuntu.
Вы можете выполнить apt source libc6, чтобы загрузить исходный код используемой вами Libc в операционной системе на базе Debian. Также можно нажать ▶️, чтобы отладить технику в браузере с помощью gdb.
Идея возникла у нас на хакерской встрече, и мы реализовали следующие техники:
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`.
## Complete Setup
Вы столкнётесь с проблемами версионирования символов (см. [эту ссылку](https://github.com/shellphish/how2heap/issues/169)), если попытаетесь подгрузить через `LD_PRELOAD` библиотеки libc к бинарному файлу, скомпилированному на вашей хост-машине.
У нас есть два способа обойти эту проблему.
### Метод 1: связывание со старой версией libc
Этот способ указывает линкеру связать целевой бинарный файл с целевой 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 -->
- Безболезненное введение в пользовательскую кучу Linux (userland heap) (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 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 для обхода 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 -->
- Эксплуатация The Wilderness (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- Продвинутые эксплойты malloc от Doug lea (http://phrack.org/issues/61/6.html) <!-- 2003 -->
# Усиление защиты
В glibc встроено несколько мер «усиления защиты» (hardening), например `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), а также в других функциях этого семейства.