Huis van Oranje
Reading time: 7 minutes
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.
Basiese Inligting
Kode
- Vind 'n voorbeeld in https://github.com/shellphish/how2heap/blob/master/glibc_2.23/house_of_orange.c
- Die eksploitasiemetode is reggestel in hierdie patch so dit werk nie meer nie (werk in voorheen as 2.26)
- Dieselfde voorbeeld met meer kommentaar in https://guyinatuxedo.github.io/43-house_of_orange/house_orange_exp/index.html
Doel
- Misbruik
malloc_printerr
funksie
Vereistes
- Oorskry die boonste stuk grootte
- Libc en heap lek
Agtergrond
Sommige nodige agtergrond uit die kommentaar van hierdie voorbeeld:
Die ding is, in ouer weergawes van libc, wanneer die malloc_printerr
funksie aangeroep is, sou dit deur 'n lys van _IO_FILE
strukture wat in _IO_list_all
gestoor is, herhaal, en werklik 'n instruksie-aanwyser in daardie struktuur uitvoer.
Hierdie aanval sal 'n valse _IO_FILE
struktuur forgeer wat ons sal skryf na _IO_list_all
, en veroorsaak dat malloc_printerr
loop.
Dan sal dit uitvoer wat adres ons in die _IO_FILE
strukture se sprongtafel gestoor het, en ons sal kode-uitvoering kry.
Aanval
Die aanval begin deur daarin te slaag om die boonste stuk binne die ongesorteerde bin te kry. Dit word bereik deur malloc
aan te roep met 'n grootte groter as die huidige boonste stuk grootte maar kleiner as mmp_.mmap_threshold
(standaard is 128K), wat andersins mmap
toewysing sou aktiveer. Wanneer die boonste stuk grootte gewysig word, is dit belangrik om te verseker dat die boonste stuk + sy grootte bladsy-gebalanseerd is en dat die prev_inuse bit van die boonste stuk altyd ingestel is.
Om die boonste stuk binne die ongesorteerde bin te kry, allokeer 'n stuk om die boonste stuk te skep, verander die boonste stuk grootte (met 'n oorgang in die toegewezen stuk) sodat boonste stuk + grootte bladsy-gebalanseerd is met die prev_inuse bit ingestel. Allokeer dan 'n stuk groter as die nuwe boonste stuk grootte. Let daarop dat free
nooit aangeroep word om die boonste stuk in die ongesorteerde bin te kry.
Die ou boonste stuk is nou in die ongesorteerde bin. Aannemende dat ons data binne dit kan lees (miskien as gevolg van 'n kwesbaarheid wat ook die oorgang veroorsaak het), is dit moontlik om libc adresse daaruit te lek en die adres van _IO_list_all te kry.
'n Ongesorteerde bin aanval word uitgevoer deur die oorgang te misbruik om topChunk->bk->fwd = _IO_list_all - 0x10
te skryf. Wanneer 'n nuwe stuk toegeken word, sal die ou boonste stuk gesplit word, en 'n aanwyser na die ongesorteerde bin sal in _IO_list_all
geskryf word.
Die volgende stap behels die verkleining van die grootte van die ou boonste stuk om in 'n klein bin te pas, spesifiek om sy grootte op 0x61 in te stel. Dit dien twee doele:
- Invoeging in Klein Bin 4: Wanneer
malloc
deur die ongesorteerde bin skandeer en hierdie stuk sien, sal dit probeer om dit in klein bin 4 in te voeg weens sy klein grootte. Dit maak dat die stuk aan die kop van die klein bin 4 lys eindig, wat die ligging van die FD aanwyser van die stuk van_IO_list_all
is, aangesien ons 'n naby adres in_IO_list_all
geskryf het via die ongesorteerde bin aanval. - Aktivering van 'n Malloc Kontrole: Hierdie stuk grootte manipulasie sal veroorsaak dat
malloc
interne kontroles uitvoer. Wanneer dit die grootte van die valse vorentoe stuk kontroleer, wat nul sal wees, aktiveer dit 'n fout en roepmalloc_printerr
aan.
Die manipulasie van die klein bin sal jou in staat stel om die vorentoe aanwyser van die stuk te beheer. Die oorvleueling met _IO_list_all word gebruik om 'n valse _IO_FILE struktuur te forgeer. Die struktuur is sorgvuldig saamgestel om sleutelvelde soos _IO_write_base
en _IO_write_ptr
in te sluit wat op waardes ingestel is wat interne kontroles in libc slaag. Boonop word 'n sprongtafel binne die valse struktuur geskep, waar 'n instruksie-aanwyser op die adres ingestel word waar arbitrêre kode (bv. die system
funksie) uitgevoer kan word.
Om die oorblywende deel van die tegniek saam te vat:
- Verklein die Ou Boonste Stuk: Pas die grootte van die ou boonste stuk aan na 0x61 om dit in 'n klein bin te laat pas.
- Stel die Valse
_IO_FILE
Struktuur Op: Oorvleuel die ou boonste stuk met die valse _IO_FILE struktuur en stel velde toepaslik in om die uitvoeringsvloei te kap.
Die volgende stap behels die forge van 'n valse _IO_FILE struktuur wat oorvleuel met die ou boonste stuk wat tans in die ongesorteerde bin is. Die eerste bytes van hierdie struktuur word sorgvuldig saamgestel om 'n aanwyser na 'n opdrag (bv. "/bin/sh") in te sluit wat uitgevoer sal word.
Sleutelvelde in die valse _IO_FILE struktuur, soos _IO_write_base
en _IO_write_ptr
, word op waardes ingestel wat interne kontroles in libc slaag. Boonop word 'n sprongtafel binne die valse struktuur geskep, waar 'n instruksie-aanwyser op die adres ingestel word waar arbitrêre kode uitgevoer kan word. Gewoonlik sou dit die adres van die system
funksie of 'n ander funksie wees wat shell-opdragte kan uitvoer.
Die aanval kulmineer wanneer 'n oproep aan malloc
die uitvoering van die kode deur die gemanipuleerde _IO_FILE struktuur aktiveer. Dit stel effektief arbitrêre kode-uitvoering in staat, wat gewoonlik lei tot 'n shell wat geopen word of 'n ander kwaadwillige payload wat uitgevoer word.
Samevatting van die Aanval:
- Stel die boonste stuk op: Allokeer 'n stuk en wysig die boonste stuk grootte.
- Dwing die boonste stuk in die ongesorteerde bin: Allokeer 'n groter stuk.
- Lek libc adresse: Gebruik die kwesbaarheid om uit die ongesorteerde bin te lees.
- Voer die ongesorteerde bin aanval uit: Skryf na _IO_list_all met behulp van 'n oorgang.
- Verklein die ou boonste stuk: Pas sy grootte aan om in 'n klein bin te pas.
- Stel 'n valse _IO_FILE struktuur op: Forgeer 'n valse lêer struktuur om die uitvoeringsvloei te kap.
- Aktiveer kode-uitvoering: Allokeer 'n stuk om die aanval uit te voer en arbitrêre kode te laat loop.
Hierdie benadering misbruik heap bestuur meganismes, libc inligting lek, en heap oorgange om kode-uitvoering te bereik sonder om direk free
aan te roep. Deur die valse _IO_FILE struktuur sorgvuldig te vervaardig en dit op die regte plek te plaas, kan die aanval die uitvoeringsvloei kap tydens standaard geheue toewysingsoperasies. Dit stel die uitvoering van arbitrêre kode in staat, wat moontlik lei tot 'n shell of ander kwaadwillige aktiwiteite.
Verwysings
- 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
tip
Leer & oefen AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Leer & oefen GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Ondersteun HackTricks
- Kyk na die subskripsie planne!
- Sluit aan by die 💬 Discord groep of die telegram groep of volg ons op Twitter 🐦 @hacktricks_live.
- Deel hacking truuks deur PRs in te dien na die HackTricks en HackTricks Cloud github repos.