House of Orange
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Tehnika eksploatacije je ispravljena u ovom zakrpi tako da ovo više ne funkcioniše (radi u verzijama pre 2.26)
Isti primer sa više komentara u https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Zloupotreba malloc_printerr
funkcije
Prepisivanje veličine gornjeg dela
Libc i heap leak-ovi
Neki potrebni podaci iz komentara iz ovog primera:
Stvar je u tome da, u starijim verzijama libc, kada je pozvana malloc_printerr
funkcija, ona bi iterirala kroz listu _IO_FILE
struktura smeštenih u _IO_list_all
, i zapravo izvršila pokazivač instrukcija u toj strukturi.
Ovaj napad će falsifikovati lažnu _IO_FILE
strukturu koju ćemo napisati u _IO_list_all
, i izazvati malloc_printerr
da se pokrene.
Zatim će izvršiti bilo koju adresu koju imamo smeštenu u _IO_FILE
tabeli skakanja, i dobićemo izvršenje koda.
Napad počinje tako što se uspeva dobiti gornji deo unutar nesortiranog bin-a. To se postiže pozivanjem malloc
sa veličinom većom od trenutne veličine gornjeg dela, ali manjom od mmp_.mmap_threshold
(podrazumevano je 128K), što bi inače pokrenulo mmap
alokaciju. Kada god se veličina gornjeg dela izmeni, važno je osigurati da je gornji deo + njegova veličina usklađen sa stranicom i da je prev_inuse bit gornjeg dela uvek postavljen.
Da biste dobili gornji deo unutar nesortiranog bin-a, alocirajte deo da biste stvorili gornji deo, promenite veličinu gornjeg dela (sa prelivanjem u alociranom delu) tako da gornji deo + veličina bude usklađen sa stranicom sa postavljenim prev_inuse bitom. Zatim alocirajte deo veći od nove veličine gornjeg dela. Imajte na umu da free
nikada nije pozvan da bi se gornji deo stavio u nesortirani bin.
Stari gornji deo je sada u nesortiranom bin-u. Pretpostavljajući da možemo čitati podatke unutar njega (moguće zbog ranjivosti koja je takođe izazvala prelivanje), moguće je da se leak-uje libc adrese iz njega i dobije adresa _IO_list_all.
Napad nesortiranog bin-a se vrši zloupotrebom prelivanja da bi se napisalo topChunk->bk->fwd = _IO_list_all - 0x10
. Kada se alocira novi deo, stari gornji deo će biti podeljen, a pokazivač na nesortirani bin će biti napisan u _IO_list_all
.
Sledeći korak uključuje smanjenje veličine starog gornjeg dela da bi stao u mali bin, konkretno postavljajući njegovu veličinu na 0x61. Ovo služi dvema svrhama:
Umetanje u Mali Bin 4: Kada malloc
skenira nesortirani bin i vidi ovaj deo, pokušaće da ga umetne u mali bin 4 zbog njegove male veličine. Ovo čini da deo završi na vrhu liste malog bin-a 4, što je lokacija FD pokazivača dela _IO_list_all
jer smo napisali blisku adresu u _IO_list_all
putem napada nesortiranog bin-a.
Pokretanje Malloc Provere: Ova manipulacija veličinom dela će izazvati malloc
da izvrši interne provere. Kada proveri veličinu lažnog naprednog dela, koja će biti nula, izaziva grešku i poziva malloc_printerr
.
Manipulacija malim bin-om će vam omogućiti da kontrolišete napredni pokazivač dela. Preklapanje sa _IO_list_all se koristi za falsifikovanje lažne _IO_FILE strukture. Struktura je pažljivo oblikovana da uključuje ključna polja kao što su _IO_write_base
i _IO_write_ptr
postavljena na vrednosti koje prolaze interne provere u libc. Pored toga, tabela skakanja se kreira unutar lažne strukture, gde je pokazivač instrukcija postavljen na adresu gde se može izvršiti proizvoljan kod (npr. funkcija system
).
Da rezimiramo preostali deo tehnike:
Smanjite Stari Gornji Deo: Prilagodite veličinu starog gornjeg dela na 0x61 da bi stao u mali bin.
Postavite Lažnu _IO_FILE
Strukturu: Preklopite stari gornji deo sa lažnom _IO_FILE strukturom i postavite polja odgovarajuće da preuzmete tok izvršenja.
Sledeći korak uključuje falsifikovanje lažne _IO_FILE strukture koja se preklapa sa starim gornjim delom koji se trenutno nalazi u nesortiranom bin-u. Prvi bajtovi ove strukture su pažljivo oblikovani da uključuju pokazivač na komandu (npr. "/bin/sh") koja će biti izvršena.
Ključna polja u lažnoj _IO_FILE strukturi, kao što su _IO_write_base
i _IO_write_ptr
, postavljena su na vrednosti koje prolaze interne provere u libc. Pored toga, tabela skakanja se kreira unutar lažne strukture, gde je pokazivač instrukcija postavljen na adresu gde se može izvršiti proizvoljan kod. Obično bi to bila adresa funkcije system
ili druge funkcije koja može izvršiti shell komande.
Napad kulminira kada poziv malloc
pokrene izvršenje koda kroz manipuliranu _IO_FILE strukturu. Ovo efikasno omogućava izvršenje proizvoljnog koda, obično rezultirajući pokretanjem shel-a ili izvršavanjem drugog zlonamernog tereta.
Sažetak Napada:
Postavite gornji deo: Alocirajte deo i izmenite veličinu gornjeg dela.
Primorajte gornji deo u nesortirani bin: Alocirajte veći deo.
Leak-ujte libc adrese: Iskoristite ranjivost da čitate iz nesortiranog bin-a.
Izvršite napad nesortiranog bin-a: Napišite u _IO_list_all koristeći prelivanje.
Smanjite stari gornji deo: Prilagodite njegovu veličinu da stane u mali bin.
Postavite lažnu _IO_FILE strukturu: Falsifikujte lažnu strukturu datoteke da preuzmete tok kontrole.
Pokrenite izvršenje koda: Alocirajte deo da izvršite napad i pokrenete proizvoljan kod.
Ovaj pristup koristi mehanizme upravljanja heap-om, leak-ove informacija iz libc, i prelivanja heap-a da bi postigao izvršenje koda bez direktnog pozivanja free
. Pažljivim oblikovanjem lažne _IO_FILE strukture i njenim postavljanjem na pravo mesto, napad može preuzeti tok kontrole tokom standardnih operacija alokacije memorije. Ovo omogućava izvršenje proizvoljnog koda, potencijalno rezultirajući shell-om ili drugim zlonamernim aktivnostima.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)