6.5 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 PRETPLATU!
- 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. Ovo je kako se razlika/veličina 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 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://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 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
- U
Input your name:
postoji početna ranjivost koja omogućava otkrivanje adrese sa hipa - Zatim u funkcionalnostima
Org:
iHost:
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 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 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.