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

74 lines
6.5 KiB
Markdown

# 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 PRETPLATU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodičnu 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 komad na određenoj adresi.
### Zahtevi
* Prekoračenje koje omogućava prepisivanje veličine zaglavlja vrha komada (npr. -1).
* Biti u mogućnosti da se kontroliše veličina alociranja hipa
### Napad
Ako napadač želi da alocira komad na adresi P da bi prepisao vrednost ovde. Počinje tako što prepisuje veličinu vrha komada sa `-1` (možda sa prekoračenjem). Ovo osigurava da malloc neće koristiti mmap za bilo koju alokaciju jer će Vrh komada uvek imati dovoljno prostora.
Zatim, izračunajte udaljenost između adrese vrha komada i ciljnog prostora za alokaciju. Ovo je zato što će se malloc sa tom veličinom izvršiti kako bi se premestio vrh komada na tu poziciju. Ovo je kako se razlika/veličina može lako izračunati:
```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, alociranjem veličine `target - old_top - 4*sizeof(long)` (4 long-a zbog metapodataka vrhunskog bloka i novog bloka kada je alociran) premestiće vrhunski blok na adresu koju želimo da prepisujemo.\
Zatim, uradite još jedan malloc da biste dobili blok na ciljanoj adresi.
### Reference & 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 prekoračenje koje se može zloupotrebiti za izmenu veličine vrhunskog bloka, koji je izmenjen na -1 ili p64(0xffffffffffffffff)
* Zatim se izračunava adresa gde postoji pokazivač koji treba prepisati, 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 adresa v2, koja se zatim prati navedenim **host name**. Kako će strcpy kopirati sadržaj s u blok veličine 64B, moguće je **prepisti veličinu vrhunskog bloka** sa podacima unetim u **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 pisanjem pokazivača na funkciju free u GOT-u ovde, a zatim pozivanjem funkcije za čitanje.
* Zatim je korišćen House of force (zloupotreba UAF-a) da se prepise 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 se upisuje adresa `system`, u blok se upisuje `"/bin/sh"` i na kraju se oslobađa blok sa tim sadržajem stringa.