hacktricks/binary-exploitation/heap/unsorted-bin-attack.md

11 KiB

Ongeorden Bin Aanval

Leer AWS hak vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Basiese Inligting

Vir meer inligting oor wat 'n ongeorden bin is, kyk na hierdie bladsy:

{% content-ref url="bins-and-memory-allocations.md" %} bins-and-memory-allocations.md {% endcontent-ref %}

Ongeorden lys kan die adres na ongesorteerde brokke (av) in die bk-adres van die brokkie skryf. Daarom, as 'n aanvaller die adres van die bk-aanwyser in 'n brokkie binne die ongeorden bin kan verander, kan hy in staat wees om daardie adres in 'n willekeurige adres te skryf wat nuttig kan wees om 'n libc-adres te lek of om sekere verdediging te omseil.

Dus, hierdie aanval maak dit basies moontlik om 'n willekeurige adres met 'n groot nommer te oorskryf ( 'n adres wat 'n heap-adres of 'n libc-adres kan wees) soos 'n stapeladres wat gelekte kan word of 'n beperking soos die globale veranderlike global_max_fast om vinnige binne met groter groottes te skep (en oorgaan van 'n ongeorden bin aanval na 'n vinnige bin aanval).

{% hint style="success" %} Deur na die voorbeeld te kyk wat verskaf is in https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#principle en 0x4000 en 0x5000 in plaas van 0x400 en 0x500 as brokkie groottes te gebruik (om tcaches te vermy), is dit moontlik om te sien dat teenwoordig die fout malloc(): ongeorden dubbel gekoppelde lys gekorrupteer geaktiveer word.

Daarom vereis hierdie ongeorden bin aanval nou (onder andere kontroles) ook dat die dubbel gekoppelde lys reggestel moet word sodat dit omseil word victim->bck->fd == victim of nie victim->fd == av (arena). Dit beteken dat die adres waar ons wil skryf, die adres van die vals brokkie in sy fd-posisie moet hê en dat die vals brokkie fd na die arena moet wys. {% endhint %}

{% hint style="danger" %} Let daarop dat hierdie aanval die ongeorden bin (dus klein en groot ook) korruptheid. Dus kan ons nou slegs toewysings van die vinnige bin gebruik ( 'n meer komplekse program kan ander toewysings doen en vasloop), en om dit te aktiveer moet ons dieselfde grootte toewys of die program sal vasloop.

Let daarop dat die maak van global_max_fast kan help in hierdie geval deur te vertrou dat die vinnige bin in staat sal wees om al die ander toewysings te hanteer totdat die uitbuiting voltooi is. {% endhint %}

Die kode van guyinatuxedo verduidelik dit baie goed, alhoewel as jy die mallocs wysig om geheue groot genoeg toe te ken sodat dit nie in 'n tcache eindig nie, kan jy sien dat die voorheen genoemde fout voorkom wat hierdie tegniek voorkom: malloc(): ongeorden dubbel gekoppelde lys gekorrupteer

Ongeorden Bin Infoleak Aanval

Dit is eintlik 'n baie basiese konsep. Die brokkies in die ongeorden bin gaan dubbel aanwysers hê om die bin te skep. Die eerste brokkie in die ongeorden bin sal eintlik die FD en die BK skakels hê wat na 'n deel van die hoofarena (libc) wys.
Daarom, as jy 'n brokkie binne 'n ongeorden bin kan plaas en dit lees (gebruik na vry) of dit weer kan toewys sonder om ten minste 1 van die aanwysers te oorskryf om dit dan te lees, kan jy 'n libc inligtingslek hê.

'n Soortgelyke aanval wat in hierdie skryfstuk gebruik is, was om 'n 4 brokkie struktuur (A, B, C en D - D is slegs om konsolidasie met die boonste brokkie te voorkom) te misbruik sodat 'n nulbyte-oorvloei in B gebruik is om C aan te dui dat B ongebruik was. Ook, in B is die prev_size-data gewysig sodat die grootte in plaas daarvan om die grootte van B was A+B.
Toe is C vrygestel en gekonsolideer met A+B (maar B was nog in gebruik). 'n Nuwe brokkie van grootte A is toegewys en toe is die libc gelekte adresse in B geskryf vanwaar hulle gelekte is.

Verwysings & Ander voorbeelde

  • https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted_bin_attack/#hitcon-training-lab14-magic-heap
  • Die doel is om 'n globale veranderlike met 'n waarde groter as 4869 te oorskryf sodat dit moontlik is om die vlag te kry en PIE is nie geaktiveer nie.
  • Dit is moontlik om brokkies van willekeurige groottes te genereer en daar is 'n geheue oorvloei met die gewenste grootte.
  • Die aanval begin deur 3 brokkies te skep: brokkie0 om die oorvloei te misbruik, brokkie1 om oorvloei te hê en brokkie2 sodat die boonste brokkie nie konsolideer met die voriges nie.
  • Dan word brokkie1 vrygestel en brokkie0 word oorvloei sodat die bk-aanwyser van brokkie1 wys na: bk = magic - 0x10
  • Dan word brokkie3 toegewys met dieselfde grootte as brokkie1, wat die ongeorden bin aanval sal aktiveer en die waarde van die globale veranderlike sal wysig, wat dit moontlik maak om die vlag te kry.
  • https://guyinatuxedo.github.io/31-unsortedbin_attack/0ctf16_zerostorage/index.html
  • Die saamvoegfunksie is kwesbaar omdat as beide indekse wat oorgedra word dieselfde is, sal dit daarop herallokeer en dit dan vrymaak, maar 'n aanwyser na daardie vrygemaakte gebied teruggee wat gebruik kan word.
  • Daarom word 2 brokkies geskep: brokkie0 wat met homself saamgevoeg sal word en brokkie1 om konsolidering met die boonste brokkie te voorkom. Dan word die saamvoegfunksie met brokkie0 twee keer geroep wat 'n gebruik na vry sal veroorsaak.
  • Dan word die view-funksie geroep met indeks 2 (wat die indeks van die gebruik na vry brokkie is), wat 'n libc-adres sal lek.
  • Aangesien die binêre beskermings het om slegs groottes groter as global_max_fast toe te ken sodat geen vinnige bin gebruik word nie, gaan 'n ongeorden bin aanval gebruik word om die globale veranderlike global_max_fast te oorskryf.
  • Dan is dit moontlik om die wysigingsfunksie met indeks 2 (die gebruik na vry aanwyser) te roep en die bk-aanwyser te oorskryf om te wys na p64(global_max_fast-0x10). Dan, deur 'n nuwe brokkie te skep, sal die voorheen gekompromitteerde vry adres (0x20) gebruik word om die ongeorden bin aanval te aktiveer deur die global_max_fast te oorskryf met 'n baie groot waarde, wat nou toelaat om brokkies in vinnige binne te skep.
  • Nou word 'n vinnige bin aanval uitgevoer:
  • Eerstens word ontdek dat dit moontlik is om te werk met vinnige brokkies van grootte 200 op die **__free_hook-plek:
  • gef➤  p &__free_hook
    

$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook> gef➤ x/60gx 0x7ff1e9e607a8 - 0x59 0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200 0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000 0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000

  • As ons daarin kan slaag om 'n vinnige blok van grootte 0x200 op hierdie plek te kry, sal dit moontlik wees om 'n funksie-aanwyser te oorskryf wat uitgevoer sal word
  • Hiervoor word 'n nuwe blok van grootte 0xfc geskep en die saamgevoegde funksie word twee keer met daardie aanwyser geroep, op hierdie manier verkry ons 'n aanwyser na 'n vrygemaakte blok van grootte 0xfc*2 = 0x1f8 in die vinnige bin.
  • Dan word die wysigingsfunksie in hierdie blok geroep om die fd-adres van hierdie vinnige bin te wysig om te verwys na die vorige __free_hook-funksie.
  • Dan word 'n blok met grootte 0x1f8 geskep om uit die vinnige bin die vorige nuttelose blok te herwin sodat 'n ander blok met grootte 0x1f8 geskep kan word om 'n vinnige bin-blok in die __free_hook te kry wat oorskryf is met die adres van die system-funksie.
  • En uiteindelik word 'n blok wat die string /bin/sh\x00 bevat, vrygemaak deur die verwyderingsfunksie te roep, wat die __free_hook-funksie aktiveer wat na system met /bin/sh\x00 as parameter wys.
  • CTF https://guyinatuxedo.github.io/33-custom_misc_heap/csaw19_traveller/index.html
  • 'n Ander voorbeeld van die misbruik van 'n 1B-oorvloei om blokke in die ongesorteerde bin te konsolideer en 'n libc-infolek te kry en dan 'n vinnige bin-aanval uit te voer om die malloc-aanwyser met 'n een-gadget-adres te oorskryf
Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: