9.2 KiB
Kuća od narandžaste boje
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 PRIJAVU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte Porodicu 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
- Pronađite primer na https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
- Tehnika eksploatacije je popravljena u ovom patch-u tako da ovo više ne radi (radi u verzijama pre 2.26)
- Isti primer sa više komentara na https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Cilj
- Zloupotreba funkcije
malloc_printerr
Zahtevi
- Prepisivanje veličine vrha bloka
- Curenje libc-a i hipa
Pozadina
Neophodne informacije iz komentara iz ovog primera:
Stvar je u tome da su u starijim verzijama libc-a, kada je pozvana funkcija malloc_printerr
, ona bi iterirala kroz listu _IO_FILE
struktura smeštenih u _IO_list_all
, i zapravo izvršila pokazivač instrukcije u toj strukturi.
Ovaj napad će falsifikovati lažnu _IO_FILE
strukturu koju ćemo upisati u _IO_list_all
, i izazvati pokretanje malloc_printerr
.
Zatim će izvršiti bilo koju adresu koju smo sačuvali u _IO_FILE
strukturama jump tabele, i dobićemo izvršenje koda
Napad
Napad počinje tako što uspe da dobije vrh bloka unutar neuređenog bin-a. To se postiže pozivom malloc
sa veličinom većom od trenutne veličine vrha bloka, ali manjom od mmp_.mmap_threshold
(podrazumevano je 128K), što bi inače pokrenulo alokaciju mmap
. Kada se veličina vrha bloka izmeni, važno je osigurati da je vrh bloka + njegova veličina poravnata sa stranicom i da je bit prev_inuse vrha bloka uvek postavljen.
Da biste dobili vrh bloka unutar neuređenog bin-a, alocirajte deo kako biste kreirali vrh bloka, promenite veličinu vrha bloka (sa prelivanjem u alociranom delu) tako da je vrh bloka + veličina poravnata sa stranicom sa postavljenim bitom prev_inuse. Zatim alocirajte deo veći od nove veličine vrha bloka. Imajte na umu da se free
nikada ne poziva da bi se vrh bloka stavio u neuređeni bin.
Stari vrh bloka je sada u neuređenom bin-u. Pretpostavljajući da možemo čitati podatke unutar njega (možda zbog ranjivosti koja je takođe uzrokovala prelivanje), moguće je procuriti libc adrese iz njega i dobiti adresu _IO_list_all.
Napad na neuređeni bin se izvodi zloupotrebom prelivanja kako bi se napisalo topChunk->bk->fwd = _IO_list_all - 0x10
. Kada se alocira novi deo, stari vrh bloka će biti podeljen, i pokazivač na neuređeni bin će biti upisan u _IO_list_all
.
Sledeći korak uključuje smanjenje veličine starog vrha bloka kako bi se uklopio u mali bin, posebno postavljanjem njegove veličine na 0x61. Ovo ima dva cilja:
- Umetanje u Mali Bin 4: Kada
malloc
skenira kroz neuređeni bin i vidi ovaj deo, pokušaće da ga ubaci u mali bin 4 zbog njegove male veličine. To će dovesti do toga da deo završi na početku liste malog bina 4, što je lokacija FD pokazivača dela_IO_list_all
jer smo napisali blisku adresu u_IO_list_all
putem napada na neuređeni bin. - Pokretanje Malloc Provere: Ova manipulacija veličinom dela će naterati
malloc
da izvrši interne provere. Kada proveri veličinu lažnog naprednog dela, koji će biti nula, izazvaće grešku i pozvatimalloc_printerr
.
Manipulacija malim binom će vam omogućiti kontrolu naprednog pokazivača dela. Preklapanje sa _IO_list_all se koristi za izradu lažne _IO_FILE strukture. Struktura je pažljivo oblikovana da uključi ključna polja poput _IO_write_base
i _IO_write_ptr
postavljena na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde je pokazivač instrukcije postavljen na adresu gde se može izvršiti proizvoljan kod (npr. funkcija system
).
Da sumiramo preostali deo tehnike:
- Smanjite Stari Vrh Bloka: Prilagodite veličinu starog vrha bloka na 0x61 kako biste ga uklopili u mali bin.
- Postavite Lažnu
_IO_FILE
Strukturu: Preklopite stari vrh bloka sa lažnom _IO_FILE strukturom i postavite polja na odgovarajući način da preuzmete kontrolu nad tokom izvršenja.
Sledeći korak uključuje izradu lažne _IO_FILE strukture koja se preklapa sa starim vrhom bloka koji se trenutno nalazi u neuređenom bin-u. Prvi bajtovi ove strukture pažljivo su oblikovani da uključe pokazivač na komandu (npr. "/bin/sh") koja će biti izvršena.
Ključna polja u lažnoj _IO_FILE strukturi, poput _IO_write_base
i _IO_write_ptr
, postavljaju se na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde je pokazivač instrukcije postavljen na adresu gde se može izvršiti proizvoljan kod. Tipično, to bi bila adresa funkcije system
ili neke druge funkcije koja može izvršiti shell komande.
Napad kulminira kada poziv malloc
pokrene izvršenje koda putem manipulisane _IO_FILE strukture. Ovo efikasno omogućava izvršenje proizvoljnog koda, što obično rezultira spawnovanjem shell-a ili izvršavanjem druge zlonamerne payload-a.
Rezime Napada:
- Postavite vrh bloka: Alocirajte deo i promenite veličinu vrha bloka.
- Prisilite vrh bloka u neuređeni bin: Alocirajte veći deo.
- Curenje libc adresa: Iskoristite ranjivost da čitate iz neuređenog bin-a.
- Izvršite napad na neuređeni bin: Upisujte u _IO_list_all korišćenjem prelivanja.
- Smanjite stari vrh bloka: Prilagodite njegovu veličinu da se uklopi u mali bin.
- Postavite lažnu _IO_FILE strukturu: Napravite lažnu strukturu fajla da preuzmete kontrolu nad tokom izvršenja.
- Pokrenite izvršenje koda: Alocirajte deo da izvršite napad i pokrenete proizvoljan kod.
Ovaj pristup iskorišćava mehanizme upravljanja hipom, curenje informacija libc-a i prelivanje hipa kako bi se postiglo izvršenje koda bez direktnog pozivanja free
. Pažljivim oblikovanjem lažne _IO_FILE strukture i postavljanjem je na pravo mesto, napad može preuzeti kontrolu nad tokom izvršenja tokom standardnih operacija alokacije memorije. Ovo omogućava izvršenje proizvoljnog koda, što potencijalno rezultira shell-om ili drugim zlonamernim aktivnostima.
Reference
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_orange/
- https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
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 vašu kompaniju reklamiranu na HackTricks-u ili preuzmete HackTricks u PDF formatu Proverite PLANOVE ZA PRETPLATU!
- Nabavite zvanični PEASS & HackTricks swag
- Otkrijte The PEASS Family, 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.