6.6 KiB
Kuća sile
Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!
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!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodičnu PEASS, našu kolekciju ekskluzivnih NFT-ova
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite svoje hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Kod
- Ova tehnika je zakrpljena (ovde) i proizvodi ovu grešku:
malloc(): corrupted top size
- Možete probati kod odavde 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. Na ovaj način razlika/veličina se može lako izračunati:
// 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 cilj - stari_vrh - 4*sizeof(long)
(4 long-a su zbog metapodataka vrhunskog bloka i novog bloka kada se alocira) premestiće 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 & Drugi Primeri
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/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://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
- 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
- U
Unesite svoje ime:
postoji početna ranjivost koja omogućava otkrivanje adrese sa hipa - Zatim u funkcionalnosti
Org:
iHost:
moguće je popuniti 64B pokazivača kada se traži org ime, koji na steku sledi adresu v2, koja se zatim prati navedenim host imenom. Kako će strcpy kopirati sadržaj s u blok veličine 64B, moguće je prepisanje veličine vrhunskog bloka podacima unutar host imena. - Sada kada je moguće proizvoljno pisanje, GOT
atoi
je prepisan adresom printf-a. moguće je otkriti adresuIO_2_1_stderr
sa%24$p
. I sa ovim curenjem libc-a bilo je moguće ponovo prepisati GOTatoi
sa adresomsystem
i pozvati je prosleđujući kao parametar/bin/sh
- Alternativna metoda predložena u ovom drugom writeup-u, je prepisati
free
saputs
, a zatim dodati adresuatoi@got
, u pokazivač koji će kasnije biti oslobođen tako da se curenje i ovim curenjem ponovo prepisujeatoi@got
sasystem
i poziva se sa/bin/sh
. - 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 adresu libc-a pisanjem pokazivača na funkciju free u GOT-u ovde, a zatim pozivanjem funkcije za čitanje.
- Zatim je korišćen House of force (zloupotrebljavajući UAF) 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 napišite adresu
system
, napišite u bloku"/bin/sh"
i na kraju oslobodite blok sa tim sadržajem stringa.