hacktricks/binary-exploitation/libc-heap/house-of-force.md

75 lines
6.6 KiB
Markdown
Raw Normal View History

# Kuća sile
<details>
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-u:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJEM**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodiču PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
</details>
## Osnovne informacije
### Kod
* Ova tehnika je zakrpljena ([**ovde**](https://sourceware.org/git/?p=glibc.git;a=commitdiff;h=30a17d8c95fbfb15c52d1115803b63aaa73a285c)) i proizvodi ovu grešku: `malloc(): corrupted top size`
* Možete probati [**kod odavde**](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html) da ga testirate ako želite.
### Cilj
* Cilj ovog napada je da se može alocirati blok na određenoj adresi.
### Zahtevi
* Prekoračenje koje omogućava prepisivanje veličine zaglavlja vršnog bloka (npr. -1).
* Biti u mogućnosti da se kontroliše veličina alociranja hipa
### Napad
Ako napadač želi da alocira blok na adresi P da bi prepisao vrednost ovde. Počinje tako što prepisuje veličinu vršnog bloka sa `-1` (možda prekoračenjem). Ovo osigurava da malloc neće koristiti mmap za bilo koju alokaciju jer će Vršni blok uvek imati dovoljno prostora.
Zatim, izračunajte udaljenost između adrese vršnog bloka i ciljnog prostora za alokaciju. Ovo je zato što će se malloc sa tom veličinom izvršiti kako bi se vršni blok premestio na tu poziciju. Na ovaj način se lako može izračunati razlika/veličina:
```c
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
```
Dakle, alokacija veličine `target - old_top - 4*sizeof(long)` (4 longa su zbog metapodataka vrhunskog bloka i novog bloka kada se alocira) će premestiti vrhunski blok na adresu koju želimo da prepisujemo.\
Zatim, uradite još jedan malloc da biste dobili blok koji sadrži na početku podatke za pisanje ciljne adrese.
### Reference i Drugi Primeri
* [https://github.com/shellphish/how2heap/tree/master](https://github.com/shellphish/how2heap/tree/master?tab=readme-ov-file)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/)
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_force)
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.27/house\_of\_force.c)
* [https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/house\_force\_exp/index.html)
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#hitcon-training-lab-11)
* Cilj ovog scenarija je ret2win gde treba izmeniti adresu funkcije koja će biti pozvana adresom funkcije ret2win
* Binarni fajl ima prelivanje koje se može zloupotrebiti za izmenu veličine vrhunskog bloka, koji je izmenjen na -1 ili p64(0xffffffffffffffff)
* Zatim se izračunava adresa mesta gde postoji pokazivač za prepisivanje, i razlika od trenutne pozicije vrhunskog bloka do tamo se alocira sa `malloc`
* Na kraju se alocira novi blok koji će sadržati ovu željenu metu unutar koje će biti prepisana funkcija ret2win
* [https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp](https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?\_x\_tr\_sl=es&\_x\_tr\_tl=en&\_x\_tr\_hl=en&\_x\_tr\_pto=wapp)
* U `Input your name:` postoji početna ranjivost koja omogućava otkrivanje adrese sa hipa
* Zatim u funkcionalnostima `Org:` i `Host:` moguće je popuniti 64B pokazivača kada se traži **org name**, koji na steku sledi adresu v2, koja se zatim prati navedenim **host name**. Kako će strcpy kopirati sadržaj s u blok veličine 64B, moguće je **prepisati veličinu vrhunskog bloka** podacima unetim unutar **host name**.
* Sada kada je moguće proizvoljno pisanje, GOT `atoi` je prepisan adresom printf-a. tada je moguće otkriti adresu `IO_2_1_stderr` _sa_ `%24$p`. I sa ovim curenjem libc-a bilo je moguće ponovo prepisati GOT `atoi` sa adresom `system` i pozvati je prosleđujući kao parametar `/bin/sh`
* Alternativna metoda [predložena u ovom drugom writeup-u](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_force/#2016-bctf-bcloud), je prepisati `free` sa `puts`, a zatim dodati adresu `atoi@got`, u pokazivač koji će kasnije biti oslobođen tako da se curenje i ovim curenjem ponovo prepisuje `atoi@got` sa `system` i poziva se sa `/bin/sh`.
* [https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html](https://guyinatuxedo.github.io/41-house\_of\_force/bkp16\_cookbook/index.html)
* Postoji UAF koji omogućava ponovnu upotrebu bloka koji je oslobođen bez brisanja pokazivača. Zbog nekih metoda čitanja, moguće je otkriti libc adresu upisivanjem pokazivača na funkciju free u GOT ovde, a zatim pozivanjem funkcije za čitanje.
* Zatim je korišćen House of force (zloupotreba UAF-a) da se prepisuje veličina preostalog prostora sa -1, alocira blok dovoljno velik da se dođe do free hook-a, a zatim alocira još jedan blok koji će sadržati free hook. Zatim, u hook-u upisati adresu `system`, upisati u blok `"/bin/sh"` i na kraju osloboditi blok sa tim sadržajem stringa.