Explotación Educativa del Heap
Este repositorio es para aprender diversas técnicas de explotación del heap.
Usamos los lanzamientos de Libc de Ubuntu como el estándar de oro. Cada técnica está verificada para funcionar en las correspondientes versiones de Ubuntu.
Puedes ejecutar apt source libc6 para descargar el código fuente de la Libc que estás usando en un sistema operativo basado en Debian. También puedes hacer clic en ▶️ para depurar la técnica en tu navegador usando gdb.
Se nos ocurrió la idea durante una reunión de hackers, y hemos implementado las siguientes técnicas:
GnuLibc está en constante desarrollo y varias de las técnicas anteriores han dado lugar a comprobaciones de consistencia introducidas en la lógica de malloc/free.
En consecuencia, estas comprobaciones rompen regularmente algunas de las técnicas y requieren ajustes para evitarlas (si es posible).
Abordamos este problema manteniendo múltiples versiones de la misma técnica para cada lanzamiento de Glibc que requirió un ajuste.
La estructura es glibc_<version>/technique.c.
¿Tienes un buen ejemplo?
¡Añádelo aquí!
Intenta incluir toda la técnica en un único .c -- es mucho más fácil de aprender así.
Para Empezar
Configuración Rápida
- asegúrate de tener instalados los siguientes paquetes/herramientas:
patchelf zstd wget (por supuesto también build-essential o similar para compiladores, make, ...)
- además,
/usr/bin/python debe ser/apuntar a tu binario de python (p. ej. /usr/bin/python3)```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
make clean base
./malloc_playground
Ten en cuenta que esto enlazará los binarios con tu libc del sistema. Si quieres experimentar con otras versiones de libc. Consulta `Complete Setup`.
## Complete Setup
Encontrarás problemas de versionado de símbolos (consulta [esto](https://github.com/shellphish/how2heap/issues/169)) si intentas hacer `LD_PRELOAD` de libcs a un binario compilado en tu máquina anfitriona.
Tenemos dos formas de evitarlo.
### Método 1: enlazar contra una libc más antigua
Este le dice al enlazador que enlace el binario objetivo con la libc objetivo.```shell
git clone https://github.com/shellphish/how2heap
cd how2heap
H2H_USE_SYSTEM_LIBC=N make v2.23
Esto enlazará todos los binarios con las libcs correspondientes. Lo mejor es que viene con símbolos de depuración. Ahora puedes jugar con cualquier versión de libc en tu máquina host.
En este ejemplo, compilará todos los binarios de glibc-2.23 y los enlazará con libc-2.23. Puedes cambiar el número para jugar con otras versiones de libc.
Método 2: usar docker
Esto utiliza un enfoque basado en Docker para compilar binarios dentro de un contenedor ubuntu antiguo, de modo que sea ejecutable con la versión de libc objetivo.```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
# Herramientas de explotación del heap
Hay algunas herramientas de explotación del heap disponibles.
## Malloc Playground
El archivo `malloc_playground.c` proporcionado es el código fuente de un programa que solicita al usuario comandos para asignar y liberar memoria de forma interactiva.
## Pwngdb
Examina el heap de glibc en gdb: https://github.com/scwuaptx/Pwngdb
## pwndbg
Un plugin de gdb centrado en explotación que permite ver/alterar el heap de glibc: https://github.com/pwndbg/pwndbg
## gef
Otro excelente plugin de gdb que permite examinar el heap de glibc: https://github.com/hugsy/gef
## heap-viewer
Examina el heap de glibc en IDA Pro: https://github.com/danigargu/heap-viewer
## heaptrace
Te ayuda a visualizar las operaciones del heap reemplazando las direcciones con símbolos: https://github.com/Arinerron/heaptrace
# Otros recursos
Algunos buenos recursos sobre explotación del heap, aproximadamente en orden inverso a su publicación, son:
## Tutoriales útiles de explotación del heap
- Descripción general de las técnicas de explotación del heap de GLIBC (https://0x434b.dev/overview-of-glibc-heap-exploitation-techniques/) <!-- 2022 -->
- Tutorial en profundidad de glibc (https://heap-exploitation.dhavalkapil.com/) - libro y ejemplos de exploits <!-- 2022 -->
- Técnicas de explotación del heap que funcionan en glibc-2.31 (https://github.com/StarCross-Tech/heap_exploit_2.31) <!-- 2020 -->
- Introducción sencilla al heap del espacio de usuario de Linux (https://sensepost.com/blog/2017/painless-intro-to-the-linux-userland-heap/) <!-- 2017 -->
- ptmalloc fanzine, un conjunto de recursos y ejemplos relacionados con ataques a metadatos en ptmalloc (http://tukan.farm/2016/07/26/ptmalloc-fanzine/) <!-- 2016 -->
- Aventuras con glibc: el chunk olvidado (https://github.com/bash-c/slides/blob/master/pwn_heap/Glibc%20Adventures:%20The%20forgotten%20chunks.pdf) - explotación avanzada del heap <!-- 2015 -->
## Explotación histórica del heap (La historia)
- 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) - algunas técnicas de explotación de malloc <!-- 2009 -->
- Otra técnica más de explotación de free() (http://phrack.org/issues/66/6.html) <!-- 2009 -->
- El uso de set_head para derrotar a la wilderness (http://phrack.org/issues/64/9.html) <!-- 2007 -->
- Entender el heap rompiéndolo (https://www.blackhat.com/presentations/bh-usa-07/Ferguson/Whitepaper/bh-usa-07-ferguson-WP.pdf) - explica la implementación del heap y un par de exploits <!-- 2007 -->
- Técnicas de explotación del heap en OS X (http://phrack.org/issues/63/5.html) <!-- 2005 -->
- The Malloc Maleficarum (http://seclists.org/bugtraq/2005/Oct/118) <!-- 2005 -->
- Explotando la wilderness (http://seclists.org/vuln-dev/2004/Feb/25) <!-- 2004 -->
- Exploits avanzados de malloc de Doug Lea (http://phrack.org/issues/61/6.html) <!-- 2003 -->
# Endurecimiento
Hay un par de medidas de "endurecimiento" integradas en glibc, como `export MALLOC_CHECK_=1` (habilita algunas comprobaciones), `export MALLOC_PERTURB_=1` (los datos se sobrescriben), `export MALLOC_MMAP_THRESHOLD_=1` (siempre se usa mmap()), ...
Más información: [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).
También hay soporte de trazado como [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), y en otras funciones de esta familia.