House of Orange
Last updated
Last updated
Naučite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Naučite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)
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 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
Zloupotreba funkcije malloc_printerr
Prepisivanje veličine vršnog bloka
Curenje libc-a i hipa
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 pisati 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 počinje tako što se uspe da se dobije vršni blok unutar nesortirane kante. To se postiže pozivom malloc
sa veličinom većom od trenutne veličine vršnog bloka, ali manjom od mmp_.mmap_threshold
(podrazumevano je 128K), što bi inače pokrenulo alokaciju mmap
. Kada se modifikuje veličina vršnog bloka, važno je osigurati da je vršni blok + njegova veličina poravnata sa stranicom i da je bit prev_inuse vršnog bloka uvek postavljen.
Da biste dobili vršni blok unutar nesortirane kante, alocirajte deo kako biste kreirali vršni blok, promenite veličinu vršnog bloka (sa prelivanjem u alociranom delu) tako da je vršni blok + veličina poravnata sa stranicom sa postavljenim bitom prev_inuse. Zatim alocirajte deo veći od nove veličine vršnog bloka. Imajte na umu da se free
nikada ne poziva da bi se vršni blok stavio u nesortiranu kantu.
Stari vršni blok je sada u nesortiranoj kanti. 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 nesortiranu kantu se izvodi zloupotrebom prelivanja kako bi se napisalo topChunk->bk->fwd = _IO_list_all - 0x10
. Kada se alocira novi deo, stari vršni blok će biti podeljen, i pokazivač na nesortiranu kantu će biti napisan u _IO_list_all
.
Sledeći korak uključuje smanjenje veličine starog vršnog bloka kako bi se uklopio u malu kantu, posebno postavljanjem njegove veličine na 0x61. Ovo ima dva cilja:
Umetanje u malu kantu 4: Kada malloc
skenira kroz nesortiranu kantu i vidi ovaj deo, pokušaće da ga ubaci u malu kantu 4 zbog njegove male veličine. To dovodi do toga da deo završi na vrhu liste male kante 4, što je lokacija pokazivača FD dela _IO_list_all
jer smo napisali blisku adresu u _IO_list_all
putem napada na nesortiranu kantu.
Pokretanje provere Malloc: 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 pozvati malloc_printerr
.
Manipulacija malom kantom će vam omogućiti kontrolu naprednog pokazivača dela. Preklapanje sa _IO_list_all se koristi za falsifikovanje 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 se postavlja pokazivač instrukcije na adresu gde se može izvršiti proizvoljan kod (npr. funkcija system
).
Da sumiramo preostali deo tehnike:
Smanjite stari vršni blok: Prilagodite veličinu starog vršnog bloka na 0x61 kako biste ga uklopili u malu kantu.
Postavite lažnu _IO_FILE
strukturu: Preklopite stari vršni blok 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 falsifikovanje lažne _IO_FILE strukture koja se preklapa sa starim vršnim blokom koji se trenutno nalazi u nesortiranoj kanti. 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
, postavljena su na vrednosti koje prolaze interne provere u libc-u. Dodatno, unutar lažne strukture se kreira jump tabela, gde se postavlja pokazivač instrukcije 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 vršni blok: Alocirajte deo i modifikujte veličinu vršnog bloka.
Prisilite vršni blok u nesortiranu kantu: Alocirajte veći deo.
Curenje libc adresa: Iskoristite ranjivost da čitate iz nesortirane kante.
Izvršite napad na nesortiranu kantu: Napišite u _IO_list_all korišćenjem prelivanja.
Smanjite stari vršni blok: Prilagodite njegovu veličinu da se uklopi u malu kantu.
Postavite lažnu _IO_FILE strukturu: Falsifikujte lažnu strukturu datoteke da preuzmete kontrolu nad tokom izvršenja.
Pokrenite izvršenje koda: Alocirajte deo da izvršite napad i pokrenete proizvoljan kod.
Ovaj pristup eksploatiše 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.
Učite i vežbajte hakovanje AWS-a:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte hakovanje GCP-a: HackTricks Training GCP Red Team Expert (GRTE)