mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-25 14:10:41 +00:00
Translated ['binary-exploitation/heap/fast-bin-attack.md', 'binary-explo
This commit is contained in:
parent
96755d05fe
commit
9e1db41feb
3 changed files with 73 additions and 48 deletions
|
@ -6,7 +6,7 @@
|
|||
|
||||
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 PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -22,9 +22,9 @@ Za više informacija o tome šta je brza binarna provera posetite ovu stranicu:
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Zbog toga što je brza binarna jednostruko povezana, postoji mnogo manje zaštita nego u drugim binarnim proverama i samo **modifikovanje adrese u oslobođenom brzom binu** isečka je dovoljno da biste mogli **dodeliti kasnije isečak na bilo kojoj memorijskoj adresi**.
|
||||
Zbog toga što je brza binarna jednostruko povezana, postoji mnogo manje zaštite nego u drugim binarnim proverama i samo **modifikovanje adrese u oslobođenom brzom binu** isecku je dovoljno da biste mogli **dodeliti kasnije isečak na bilo kojoj memorijskoj adresi**.
|
||||
|
||||
Kao sažetak:
|
||||
Kao rezime:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```c
|
||||
|
@ -134,22 +134,26 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
|
|||
}
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Ako je moguće prebrisati vrednost globalne promenljive **`global_max_fast`** velikim brojem, to omogućava generisanje fast binova većih veličina, potencijalno omogućavajući izvođenje napada fast binom u scenarijima gde to ranije nije bilo moguće.
|
||||
Ako je moguće prebrisati vrednost globalne promenljive **`global_max_fast`** velikim brojem, to omogućava generisanje brzih binova većih veličina, potencijalno omogućavajući izvođenje brzih bin napada u scenarijima gde to prethodno nije bilo moguće.
|
||||
{% endhint %}
|
||||
|
||||
## Primeri
|
||||
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
|
||||
* Moguće je alocirati delove, osloboditi ih, pročitati njihov sadržaj i popuniti ih (sa ranjivošću prelivanja).
|
||||
* **Konsolidacija dela za infoleak**: Tehnika se uglavnom sastoji u zloupotrebi prelivanja kako bi se napravila lažna prev_size tako da se jedan prethodni deo stavi unutar većeg dela, tako da prilikom alociranja većeg dela koji sadrži još jedan deo, moguće je ispisati njegove podatke i procuriti adresu do libc-a (main_arena+88).
|
||||
* **Prepisivanje malloc kuke**: Za ovo, i zloupotrebljavajući prethodnu situaciju preklapanja, bilo je moguće imati 2 dela koja su pokazivala na istu memoriju. Stoga, oslobađajući ih oboje (oslobađajući još jedan deo između da bi se izbegle zaštite), bilo je moguće imati isti deo u fast binu 2 puta. Zatim, bilo je moguće ponovo ga alocirati, prepisati adresu sledećeg dela da pokazuje malo pre malloc_hook-a (tako da pokazuje na celobrojnu vrednost koju malloc smatra slobodnom veličinom - još jedan zaobilazak), ponovo ga alocirati, a zatim alocirati još jedan deo koji će primiti adresu do malloc kuka.\
|
||||
* **Konsolidacija dela radi curenja informacija**: Tehnika se uglavnom zloupotrebljava prelivanjem kako bi se napravila lažna prev\_size vrednost tako da se jedan prethodni deo stavi unutar većeg dela, pa kada se alocira veći deo koji sadrži još jedan deo, moguće je ispisati njegove podatke i procuriti adresu do libc-a (main\_arena+88).
|
||||
* **Prepisivanje malloc kuke**: Za ovo, i zloupotrebljavajući prethodnu situaciju preklapanja, bilo je moguće imati 2 dela koja su pokazivala na istu memoriju. Stoga, oslobađajući ih oboje (oslobađajući još jedan deo između da bi se izbegle zaštite), bilo je moguće imati isti deo u brzom binu 2 puta. Zatim, bilo je moguće ponovo ga alocirati, prepisati adresu sledećeg dela da pokazuje malo pre malloc\_hook-a (tako da pokazuje na ceo broj koji malloc smatra slobodnom veličinom - još jedan zaobilazak), alocirati ga ponovo, a zatim alocirati još jedan deo koji će primiti adresu do malloc kuka.\
|
||||
Na kraju je **jedan alat** napisan tamo.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
|
||||
* Postoji prelivanje hipa i korisnik nakon oslobađanja i dvostruko oslobađanje jer kada se deo oslobodi moguće je ponovo koristiti i ponovo osloboditi pokazivače.
|
||||
* **Libc info leak**: Jednostavno oslobodite neke delove i dobićete pokazivač do dela glavne arene. Kako možete ponovo koristiti oslobađene pokazivače, samo pročitajte ovu adresu.
|
||||
* **Napad fast binom**: Svi pokazivači na alokacije čuvaju se unutar niza, tako da možemo osloboditi par fast bin delova i u poslednjem prepisati adresu da pokazuje malo pre ovog niza pokazivača. Zatim, alocirajte par delova iste veličine i prvo ćemo dobiti legitimni deo, a zatim lažni deo koji sadrži niz pokazivača. Sada možemo prepisati ove pokazivače alokacije da pokazuju na adresu got `free` da bi pokazivali na sistem, a zatim napisati deo 1 `"/bin/sh"` da bi zatim `free(chunk1)` koji će izvršiti `system("/bin/sh")`.
|
||||
* Možete pronaći napad fast binom zloupotrebljen kroz napad nesortiranim binom.
|
||||
* Napomena 
|
||||
* Postoji prelivanje hipa i korisnik nakon oslobađanja i duplo oslobađanje jer kada se deo oslobodi moguće je ponovo koristiti i ponovo osloboditi pokazivače
|
||||
* **Libc curenje informacija**: Samo oslobodite neke delove i dobićete pokazivač do dela glavne arene lokacije. Kako možete ponovo koristiti oslobođene pokazivače, samo pročitajte ovu adresu.
|
||||
* **Napad brzog bina**: Svi pokazivači na alokacije čuvaju se unutar niza, pa možemo osloboditi par brzih bin delova i u poslednjem prepisati adresu da pokazuje malo pre ovog niza pokazivača. Zatim, alocirajte par delova iste veličine i prvo ćemo dobiti legitimni deo, a zatim lažni deo koji sadrži niz pokazivača. Sada možemo prepisati ove pokazivače alokacije da pokazuju na adresu `free` da pokazuju na sistem, a zatim napisati deo 1 `"/bin/sh"` da zatim `oslobodite(deo1)` što će izvršiti `system("/bin/sh")`.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* Još jedan primer zloupotrebe prelivanja od 1B za konsolidaciju delova u nesortiranom binu i dobijanje libc curenja informacija, a zatim izvođenje napada brzog bina za prepisivanje malloc kuke sa adresom jednog alata
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html)
|
||||
* Nakon curenja informacija zloupotrebom nesortiranog bina sa UAF-om da bi procurila adresa libc-a i adresa PIE-a, eksploatacija ovog CTF-a koristila je napad brzog bina da alocira deo na mestu gde su se nalazili pokazivači ka kontrolisanim delovima tako da je bilo moguće prepisati određene pokazivače da bi se napisao jedan alat u GOT-u
|
||||
* Možete pronaći napad brzog bina zloupotrebljen kroz napad nesortiranog bina:
|
||||
* Imajte na umu da je uobičajeno pre izvođenja napada brzog bina zloupotrebiti listu neželjenih da bi procurile libc/heap adrese (kada je potrebno).
|
||||
|
||||
{% content-ref url="unsorted-bin-attack.md" %}
|
||||
[unsorted-bin-attack.md](unsorted-bin-attack.md)
|
||||
|
@ -161,10 +165,10 @@ Na kraju je **jedan alat** napisan tamo.
|
|||
|
||||
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 PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -89,19 +89,19 @@ return 0;
|
|||
```
|
||||
</details>
|
||||
|
||||
* Napad ne radi ako se koriste tcaches (nakon 2.26)
|
||||
* Napad ne funkcioniše ako se koriste tcaches (nakon 2.26)
|
||||
|
||||
### Cilj
|
||||
|
||||
Ovaj napad omogućava **promenu pokazivača na blok tako da pokazuje na 3 adrese pre sebe**. Ako nova lokacija (okolina gde je pokazivač bio smešten) sadrži zanimljive stvari, poput drugih kontrolisanih alokacija / steka..., moguće je čitati/pisati preko njih kako bi se prouzrokovala veća šteta.
|
||||
|
||||
* Ako je ovaj pokazivač bio smešten u steku, jer sada pokazuje 3 adrese pre sebe i korisnik potencijalno može čitati i menjati ga, biće moguće procuriti osetljive informacije iz steka ili čak izmeniti povratnu adresu (možda) bez dodirivanja kanara
|
||||
* U CTF primerima, ovaj pokazivač se nalazi u nizu pokazivača na druge alokacije, stoga, praveći ga da pokazuje 3 adrese pre i mogući su čitanje i pisanje, moguće je naterati druge pokazivače da pokazuju na druge adrese.\
|
||||
* Ako je ovaj pokazivač bio smešten u steku, jer sada pokazuje 3 adrese pre sebe i korisnik potencijalno može da ga čita i menja, biće moguće procuriti osetljive informacije iz steka ili čak izmeniti povratnu adresu (možda) bez dodirivanja kanara
|
||||
* U CTF primerima, ovaj pokazivač se nalazi u nizu pokazivača na druge alokacije, stoga, čineći ga da pokazuje 3 adrese pre i mogući za čitanje i pisanje, moguće je naterati druge pokazivače da pokazuju na druge adrese.\
|
||||
Pošto korisnik potencijalno može čitati/pisati i druge alokacije, može procuriti informacije ili prepisati nove adrese na proizvoljnim lokacijama (kao u GOT).
|
||||
|
||||
### Zahtevi
|
||||
|
||||
* Određena kontrola nad memorijom (npr. stek) kako bi se kreirali par blokova dajući vrednosti nekim od atributa.
|
||||
* Određena kontrola nad memorijom (npr. stekom) kako bi se kreirali par blokova dajući vrednosti nekim od atributa.
|
||||
* Procurenje steka kako bi se postavili pokazivači lažnog bloka.
|
||||
|
||||
### Napad
|
||||
|
@ -109,8 +109,8 @@ Pošto korisnik potencijalno može čitati/pisati i druge alokacije, može procu
|
|||
* Postoje par blokova (blok1 i blok2)
|
||||
* Napadač kontroliše sadržaj bloka1 i zaglavlja bloka2.
|
||||
* U bloku1 napadač kreira strukturu lažnog bloka:
|
||||
* Da bi zaobišao zaštitu, osigurava da je polje `size` ispravno kako bi izbegao grešku: `corrupted size vs. prev_size while consolidating`
|
||||
* i polja `fd` i `bk` lažnog bloka pokazuju na mesto gde je pokazivač bloka1 smešten sa ofsetima -3 i -2 redom tako da `fake_chunk->fd->bk` i `fake_chunk->bk->fd` pokazuju na poziciju u memoriji (steku) gde se zaista nalazi adresa bloka1:
|
||||
* Da bi zaobišao zaštitu, osigurava da je polje `size` ispravno postavljeno kako bi se izbegla greška: `corrupted size vs. prev_size while consolidating`
|
||||
* i polja `fd` i `bk` lažnog bloka pokazuju na mesto gde je smešten pokazivač bloka1 sa ofsetima -3 i -2, tako da `fake_chunk->fd->bk` i `fake_chunk->bk->fd` pokazuju na poziciju u memoriji (steku) gde se zaista nalazi adresa bloka1:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1245).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
||||
|
@ -118,9 +118,9 @@ Pošto korisnik potencijalno može čitati/pisati i druge alokacije, može procu
|
|||
* Kada se drugi blok oslobodi, tada se dešava odvajanje ovog lažnog bloka:
|
||||
* `fake_chunk->fd->bk` = `fake_chunk->bk`
|
||||
* `fake_chunk->bk->fd` = `fake_chunk->fd`
|
||||
* Prethodno je napravljeno da `fake_chunk->fd->bk` i `fake_chunk->fd->bk` pokazuju na isto mesto (lokacija u steku gde je smešten `blok1`, tako da je to bila validna povezana lista). Pošto **oboje pokazuju na istu lokaciju**, samo poslednje (`fake_chunk->bk->fd = fake_chunk->fd`) će imati **efekat**.
|
||||
* Prethodno je napravljeno da `fake_chunk->fd->bk` i `fake_chunk->fd->bk` pokazuju na isto mesto (lokacija u steku gde je smešten `blok1`), tako da je to bila validna povezana lista. Pošto **oboje pokazuju na istu lokaciju**, samo poslednje (`fake_chunk->bk->fd = fake_chunk->fd`) će imati **efekat**.
|
||||
* Ovo će **prepistati pokazivač na blok1 u steku na adresu (ili bajtove) smeštene 3 adrese pre u steku**.
|
||||
* Stoga, ako napadač može kontrolisati sadržaj bloka1 ponovo, biće u mogućnosti da **piše unutar steka** i potencijalno prepisuje povratnu adresu preskačući kanaricu i menja vrednosti i pokazivače lokalnih promenljivih. Čak ponovo menjajući adresu bloka1 smeštenu u steku na drugu lokaciju gde ako napadač može ponovo kontrolisati sadržaj bloka1, biće u mogućnosti da piše bilo gde.
|
||||
* Stoga, ako napadač može da kontroliše sadržaj bloka1 ponovo, biće u mogućnosti da **piše unutar steka** i potencijalno prepisuje povratnu adresu preskačući kanar i menja vrednosti i pokazivače lokalnih promenljivih. Čak i ponovno menjanje adrese bloka1 smeštene u steku na drugu lokaciju gde ako napadač ponovo može da kontroliše sadržaj bloka1, biće u mogućnosti da piše bilo gde.
|
||||
* Imajte na umu da je ovo bilo moguće jer su **adrese smeštene u steku**. Rizik i eksploatacija mogu zavisiti o **gde su adrese lažnog bloka smeštene**.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (1246).png" alt=""><figcaption><p><a href="https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit">https://heap-exploitation.dhavalkapil.com/attacks/unlink_exploit</a></p></figcaption></figure>
|
||||
|
@ -130,6 +130,22 @@ Pošto korisnik potencijalno može čitati/pisati i druge alokacije, može procu
|
|||
* [https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit](https://heap-exploitation.dhavalkapil.com/attacks/unlink\_exploit)
|
||||
* Iako bi bilo čudno pronaći unlink napad čak i u CTF-u, ovde imate neke writeup-ove gde je ovaj napad korišćen:
|
||||
* Primer CTF-a: [https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html](https://guyinatuxedo.github.io/30-unlink/hitcon14\_stkof/index.html)
|
||||
* U ovom primeru, umesto steka postoji niz malloc adresa. Unlink napad se izvodi kako bi se mogao alocirati blok ovde, stoga je moguće kontrolisati pokazivače niza malloc adresa. Zatim, postoji još jedna funkcionalnost koja omogućava modifikaciju sadržaja blokova na ovim adresama, što omogućava da se pokazuju adrese u GOT, modifikuju adrese funkcija da bi se dobile procurke i RCE.
|
||||
* U ovom primeru, umesto steka postoji niz malloc adresa. Unlink napad se izvodi kako bi se mogao alocirati blok ovde, stoga je moguće kontrolisati pokazivače niza malloc adresa. Zatim, postoji još jedna funkcionalnost koja omogućava modifikaciju sadržaja blokova na ovim adresama, što omogućava usmeravanje adresa ka GOT-u, modifikaciju adresa funkcija za dobijanje procurivanja libc-a i RCE.
|
||||
* Još jedan primer CTF-a: [https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html](https://guyinatuxedo.github.io/30-unlink/zctf16\_note2/index.html)
|
||||
* Baš kao i u prethodnom primeru, postoji niz adresa alokacija. Moguće je izvesti unlink napad kako bi se adresa prve alokacije usmerila na nekoliko pozicija pre početka niza i zatim prepisati ovu alokaciju na novu poziciju. Stoga, moguće je prepisati pokazivače drugih alokacija da pokazuju na GOT atoi, ispisati ga da bi se dobio libc procur, a zatim prepisati atoi GOT sa adresom do jednog gedžeta.
|
||||
* Baš kao i u prethodnom primeru, postoji niz adresa alokacija. Moguće je izvesti unlink napad kako bi se adresa prve alokacije usmerila na nekoliko pozicija pre početka niza i zatim prepisati ovu alokaciju na novu poziciju. Stoga je moguće prepisati pokazivače drugih alokacija da pokazuju na GOT atoi, ispisati ga da se dobije procurivanje libc-a, a zatim prepisati atoi GOT sa adresom do jednog gedžeta.
|
||||
* CTF primer sa prilagođenim malloc i free funkcijama koje zloupotrebljavaju ranjivost veoma sličnu unlink napadu: [https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw17\_minesweeper/index.html)
|
||||
* Postoji prelivanje koje omogućava kontrolu FD i BK pokazivača prilagođenog malloc-a koji će biti (prilagođeno) oslobođen. Osim toga, heap ima exec bit, tako da je moguće procuriti adresu heap-a i usmeriti funkciju iz GOT-a ka heap bloku sa shellkodom za izvršavanje.
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
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 PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -22,43 +22,46 @@ Za više informacija o tome šta je nesortirana binarna hrpa pogledajte ovu stra
|
|||
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Nesortirane liste mogu upisati adresu u `unsorted_chunks (av)` u adresu `bk` dela bloka. Dakle, ako napadač može **izmeniti adresu pokazivača bk** u bloku unutar nesortirane hrpe, mogao bi **upisati tu adresu na proizvoljnu adresu** što bi moglo biti korisno za otkrivanje libc adresa ili zaobići neku odbranu.
|
||||
Nesortirane liste mogu da upišu adresu u `unsorted_chunks (av)` u adresu `bk` bloka. Dakle, ako napadač može **izmeniti adresu pokazivača bk** u bloku unutar nesortirane binarne hrpe, mogao bi **upisati tu adresu na proizvoljnu adresu** što bi moglo biti korisno za otkrivanje libc adresa ili zaobići neku odbranu.
|
||||
|
||||
Dakle, u osnovi, ovaj napad omogućava da se **prepiše neka proizvoljna adresa velikim brojem** (adresa koja može biti adresa hrpe ili libc adresa) poput neke adrese steka koja može biti otkrivena ili nekog ograničenja poput globalne promenljive **`global_max_fast`** kako bi se omogućilo kreiranje brzih binova sa većim veličinama (i preći sa napada na nesortiranu binu na napad na brzi bin).
|
||||
Dakle, u osnovi, ovaj napad omogućava da se **prepise proizvoljna adresa velikim brojem** (adresa koja može biti adresa hrpe ili libc adresa) poput neke adrese steka koja može biti otkrivena ili neko ograničenje poput globalne promenljive **`global_max_fast`** kako bi se omogućilo kreiranje brzih bin binova većih veličina (i preći sa napada na nesortiranu binarnu hrpu na napad na brzi bin).
|
||||
|
||||
{% hint style="success" %}
|
||||
Pogledajte primer koji je dat na [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) i koristeći 0x4000 i 0x5000 umesto 0x400 i 0x500 kao veličine blokova (kako bi se izbegli tcache-ovi) moguće je videti da se **danas** aktivira greška **`malloc(): unsorted double linked list corrupted`**.
|
||||
|
||||
Stoga, ovaj napad na nesortiranu binu sada (pored ostalih provera) takođe zahteva mogućnost popravljanja duplirane liste tako da se zaobiđe `victim->bck->fd == victim` ili ne `victim->fd == av (arena)`. Što znači da adresa na koju želimo da pišemo mora imati adresu lažnog bloka na svojoj poziciji `fd` i da lažni blok `fd` pokazuje na arenu.
|
||||
Stoga, ovaj napad na nesortiranu binarnu hrpu sada (pored ostalih provera) takođe zahteva mogućnost popravljanja duplirane liste tako da se zaobiđe `victim->bck->fd == victim` ili ne `victim->fd == av (arena)`. Što znači da adresa na koju želimo da pišemo mora imati adresu lažnog bloka na svojoj poziciji `fd` i da lažni blok `fd` pokazuje na arenu.
|
||||
{% endhint %}
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da ovaj napad korumpira nesortiranu binu (takođe male i velike). Tako da sada možemo **koristiti alokacije iz brzih binova** (neki složeniji program može vršiti druge alokacije i rušiti se), i da bismo aktivirali ovo moramo **alocirati istu veličinu ili će program pasti**.
|
||||
Imajte na umu da ovaj napad korumpira nesortiranu binarnu hrpu (takođe i male i velike). Zato sada možemo **koristiti alokacije iz brzih binova** (neki složeniji program može vršiti druge alokacije i rušiti se), i da bismo to pokrenuli moramo **dodeliti istu veličinu ili će program pasti**.
|
||||
|
||||
Imajte na umu da bi pravljenje **`global_max_fast`** moglo pomoći u ovom slučaju verujući da će brzi bin biti u mogućnosti da se brine o svim ostalim alokacijama dok se eksploatacija ne završi.
|
||||
{% endhint %}
|
||||
|
||||
Kod sa [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) objašnjava to veoma dobro, iako ako modifikujete alokacije da alociraju memoriju dovoljno veliku da ne završe u tcache-u, možete videti da se pomenuta greška pojavljuje sprečavajući ovu tehniku: **`malloc(): unsorted double linked list corrupted`**
|
||||
Kod sa [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) objašnjava to veoma dobro, iako ako izmenite alokacije da alociraju memoriju dovoljno veliku da ne završe u tcache-u, možete videti da se pomenuta greška pojavljuje sprečavajući ovu tehniku: **`malloc(): unsorted double linked list corrupted`**
|
||||
|
||||
## Napad na nesortiranu binu za curenje informacija
|
||||
## Napad na nesortiranu binarnu hrpu za otkrivanje informacija
|
||||
|
||||
Ovo je zapravo veoma osnovan koncept. Blokovi u nesortiranoj bini će imati pokazivače dvostruke pokazivače za kreiranje bine. Prvi blok u nesortiranoj bini će zapravo imati **FD** i **BK** linkove **koji pokazuju na deo glavne arene (libc)**.\
|
||||
Stoga, ako možete **ubaciti blok unutar nesortirane bine i pročitati ga** (korišćenje nakon oslobađanja) ili **ponovo ga alocirati bez prepisivanja bar 1 od pokazivača** da biste ga zatim **pročitali**, možete imati **curenje libc informacija**.
|
||||
Ovo je zapravo veoma osnovan koncept. Blokovi u nesortiranoj binarnoj hrpi će imati pokazivače dvostruke pokazivače za kreiranje binova. Prvi blok u nesortiranoj binarnoj hrpi će zapravo imati **FD** i **BK** linkove **koji pokazuju na deo glavne arene (libc)**.\
|
||||
Stoga, ako možete **ubaciti blok unutar nesortirane binarne hrpe i pročitati ga** (korišćenje nakon oslobađanja) ili **ponovo ga alocirati bez prepisivanja bar 1 od pokazivača** da biste ga zatim **pročitali**, možete imati **libc info otkrivanje**.
|
||||
|
||||
Sličan [**napad korišćen u ovom opisu**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw18\_alienVSsamurai/index.html), bio je da se zloupotrebi struktura od 4 bloka (A, B, C i D - D je samo da spreči konsolidaciju sa vršnim blokom) tako da je prelivanje nula bajta u B korišćeno da C pokaže da B nije korišćen. Takođe, u B je modifikovan podatak `prev_size` tako da veličina umesto veličine B bude A+B.\
|
||||
Zatim je C oslobođen, i konsolidovan sa A+B (ali je B još uvek bio u upotrebi). Novi blok veličine A je alociran i zatim su adrese libc-a koje su procurile upisane u B odakle su procurile.
|
||||
|
||||
## Reference i drugi primeri
|
||||
|
||||
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
|
||||
* Cilj je prepisati globalnu promenljivu sa vrednošću većom od 4869 kako bi se mogla dobiti zastava, a PIE nije omogućen.
|
||||
* Cilj je prepisati globalnu promenljivu sa vrednošću većom od 4869 kako bi bilo moguće dobiti zastavu i PIE nije omogućen.
|
||||
* Moguće je generisati blokove proizvoljnih veličina i postoji prelivanje hrpe sa željenom veličinom.
|
||||
* Napad počinje kreiranjem 3 bloka: blok0 za zloupotrebu preliva, blok1 za prelivanje i blok2 kako vrh bloka ne bi konsolidovao prethodne.
|
||||
* Zatim, blok1 se oslobađa i blok0 se preliva tako da pokazivač bk bloka1 pokazuje na: `bk = magic - 0x10`
|
||||
* Zatim, blok3 se alocira iste veličine kao blok1, što će pokrenuti napad na nesortiranu binu i izmeniti vrednost globalne promenljive, omogućavajući dobijanje zastave.
|
||||
* Napad počinje kreiranjem 3 bloka: blok0 za zloupotrebu preliva, blok1 za prelivanje i blok2 kako vršni blok ne bi konsolidovao prethodne.
|
||||
* Zatim, blok1 je oslobođen i blok0 je preliven tako da pokazivač bk bloka1 pokazuje na: `bk = magic - 0x10`
|
||||
* Zatim je alociran blok3 iste veličine kao blok1, što će pokrenuti napad na nesortiranu binarnu hrpu i izmeniti vrednost globalne promenljive, omogućavajući dobijanje zastave.
|
||||
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
|
||||
* Funkcija spajanja je ranjiva jer ako su oba prosleđena indeksa isti, ponovo će alocirati na njemu, a zatim ga osloboditi ali će vratiti pokazivač na tu oslobođenu regiju koja može biti korišćena.
|
||||
* Stoga, **kreiraju se 2 bloka**: **blok0** koji će biti spojen sa samim sobom i blok1 kako se ne bi konsolidovao sa vrhom bloka. Zatim se **funkcija spajanja poziva sa blokom0** dva puta što će izazvati korišćenje nakon oslobađanja.
|
||||
* Zatim se **`view`** funkcija poziva sa indeksom 2 (koji je indeks bloka korišćenja nakon oslobađanja), što će **procureti libc adresu**.
|
||||
* Pošto binarni fajl ima zaštitu da alocira samo veličine veće od **`global_max_fast`** tako da nema korišćenja fastbin-a, napad na nesortiranu binu će biti korišćen za prepisivanje globalne promenljive `global_max_fast`.
|
||||
* Zatim je moguće pozvati funkciju edit sa indeksom 2 (pokazivač korišćenja nakon oslobađanja) i prepisati pokazivač `bk` da pokazuje na `p64(global_max_fast-0x10)`. Zatim, kreiranje novog bloka će koristiti prethodno kompromitovanu adresu oslobođenog bloka (0x20) će **pokrenuti napad na nesortiranu binu** prepisivanjem `global_max_fast` sa veoma velikom vrednošću, omogućavajući sada kreiranje blokova u brzim binovima.
|
||||
* Stoga, **kreirana su 2 bloka**: **blok0** koji će biti spojen sa samim sobom i blok1 da spreči konsolidaciju sa vršnim blokom. Zatim je **pozvana funkcija spajanja sa blokom0** dva puta što će izazvati korišćenje nakon oslobađanja.
|
||||
* Zatim je pozvana funkcija **`view`** sa indeksom 2 (koji je indeks bloka korišćen nakon oslobađanja), što će **procureti libc adresu**.
|
||||
* Pošto binarni fajl ima zaštitu da alocira samo veličine veće od **`global_max_fast`** tako da nema korišćenja fastbin-a, napad na nesortiranu binarnu hrpu će biti korišćen da se prepise globalna promenljiva `global_max_fast`.
|
||||
* Zatim je moguće pozvati funkciju za izmenu sa indeksom 2 (pokazivač korišćen nakon oslobađanja) i prepisati pokazivač `bk` da pokazuje na `p64(global_max_fast-0x10)`. Zatim, kreiranje novog bloka će koristiti prethodno kompromitovanu adresu oslobođenog mesta (0x20) će **pokrenuti napad na nesortiranu binarnu hrpu** prepisivanjem `global_max_fast` sa veoma velikom vrednošću, omogućavajući sada kreiranje blokova u brzim binovima.
|
||||
* Sada se vrši **napad na brze binove**:
|
||||
* Prvo je otkriveno da je moguće raditi sa brzim **blokovima veličine 200** na lokaciji **`__free_hook`**:
|
||||
* <pre class="language-c"><code class="lang-c">gef➤ p &__free_hook
|
||||
|
@ -69,11 +72,13 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
|||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
</code></pre>
|
||||
* Ako uspemo da dobijemo brzi blok veličine 0x200 na ovoj lokaciji, biće moguće prebrisati pokazivač funkcije koji će biti izvršen
|
||||
* Za ovo, kreira se novi blok veličine `0xfc` i poziva se spojena funkcija sa tim pokazivačem dva puta, na taj način dobijamo pokazivač na oslobođeni blok veličine `0xfc*2 = 0x1f8` u brzom binu.
|
||||
* Zatim se poziva funkcija za uređivanje u ovom bloku kako bi se izmenila adresa **`fd`** ovog brzog bina da pokazuje na prethodnu funkciju **`__free_hook`**.
|
||||
* Zatim se kreira blok veličine `0x1f8` kako bi se iz brzog bina povukao prethodni beskorisni blok, tako da se kreira još jedan blok veličine `0x1f8` kako bi se dobio brzi blok u **`__free_hook`** koji je prebrisan adresom funkcije **`system`**.
|
||||
* Na kraju se oslobođava blok koji sadrži string `/bin/sh\x00` pozivom funkcije za brisanje, pokrećući funkciju **`__free_hook`** koja pokazuje na sistem sa `/bin/sh\x00` kao parametrom.
|
||||
* Ako uspemo da dobijemo brzi blok veličine 0x200 na ovoj lokaciji, biće moguće prepisati pokazivač funkcije koja će biti izvršena
|
||||
* Za to, novi blok veličine `0xfc` je kreiran i spojena funkcija je pozvana sa tim pokazivačem dva puta, na taj način dobijamo pokazivač na oslobođeni blok veličine `0xfc*2 = 0x1f8` u brzom bloku.
|
||||
* Zatim je pozvana funkcija za uređivanje u ovom bloku da modifikuje **`fd`** adresu ovog brzog bloka da pokazuje na prethodnu **`__free_hook`** funkciju.
|
||||
* Zatim je kreiran blok veličine `0x1f8` da bi se iz brzog bloka povukao prethodni beskorisni blok tako da je kreiran još jedan blok veličine `0x1f8` da bi se dobio brzi blok u **`__free_hook`** koji je prepisan adresom funkcije **`system`**.
|
||||
* I na kraju je oslobođen blok koji sadrži string `/bin/sh\x00` pozivom funkcije brisanja, pokrećući **`__free_hook`** funkciju koja pokazuje na sistem sa `/bin/sh\x00` kao parametrom.
|
||||
* **CTF** [**https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html**](https://guyinatuxedo.github.io/33-custom\_misc\_heap/csaw19\_traveller/index.html)
|
||||
* Još jedan primer zloupotrebe prelivanja od 1B da se konsoliduju blokovi u nesortiranom bloku i dobije informacija o libc curenju, a zatim izvrši brzi blok napad da se prepise malloc kuka sa adresom jednog alata za hakovanje
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -81,9 +86,9 @@ gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
|||
|
||||
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 PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
|
Loading…
Reference in a new issue