hacktricks/binary-exploitation/libc-heap/tcache-bin-attack.md

7.3 KiB

Napad na Tcache Bin

{% hint style="success" %} Naučite i vežbajte hakovanje AWS-a:HackTricks Obuka AWS Crveni Tim Stručnjak (ARTE)
Naučite i vežbajte hakovanje GCP-a: HackTricks Obuka GCP Crveni Tim Stručnjak (GRTE)

Podržite HackTricks
{% endhint %}

Osnovne informacije

Za više informacija o tome šta je Tcache bin, pogledajte ovu stranicu:

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

Prvo, napomenimo da je Tcache uveden u Glibc verziji 2.26.

Napad na Tcache (poznat i kao Tcache trovanje) predložen na stranici guyinatuxido vrlo je sličan napadu na brze binove gde je cilj prepisati pokazivač na sledeći blok u binu unutar oslobođenog bloka na proizvoljnu adresu kako bi kasnije bilo moguće dodeliti tu određenu adresu i potencijalno prepisati pokazivače.

Međutim, danas, ako pokrenete pomenuti kod, dobićete grešku: malloc(): unaligned tcache chunk detected. Dakle, potrebno je napisati kao adresu u novom pokazivaču poravnanu adresu (ili dovoljno puta izvršiti binarni fajl kako bi napisana adresa zapravo bila poravnata).

Napadi na Tcache indekse

Obično je moguće na početku hipa pronaći blok koji sadrži broj blokova po indeksu unutar tcache-a i adresu glavnog bloka svakog indeksa tcache-a. Ako iz nekog razloga bude moguće izmeniti ove informacije, bilo bi moguće naterati glavni blok nekog indeksa da pokazuje na željenu adresu (poput __malloc_hook) kako bi se zatim dodelio blok veličine indeksa i prepisali sadržaji __malloc_hook u ovom slučaju.

Primeri

  • CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
  • Libc info leak: Moguće je popuniti tcache-ove, dodati blok u nesortiranu listu, isprazniti tcache i ponovo dodeliti blok iz nesortirane liste samo prepisujući prvih 8B, ostavljajući drugu adresu libc-a iz bloka netaknutom tako da je možemo pročitati.
  • Napad na Tcache: Binarni fajl je ranjiv na prelivanje hipa od 1B. Ovo će biti zloupotrebljeno kako bi se promenio veličinski zaglavlje dodeljenog bloka čineći ga većim. Zatim, ovaj blok će biti oslobođen, dodajući ga u tcache blokova lažne veličine. Zatim, dodelićemo blok sa lažiranom veličinom, a prethodni blok će biti vraćen znajući da je ovaj blok zapravo bio manji i to pruža mogućnost da se prepise sledeći blok u memoriji.
    Iskoristićemo ovo da prepšemo pokazivač FD sledećeg bloka da pokazuje na malloc_hook, tako da je moguće alocirati 2 pokazivača: prvo legitimni pokazivač koji smo upravo izmenili, a zatim će druga alokacija vratiti blok u malloc_hook koji je moguće zloupotrebiti kako bi se napisao one gadget.
  • CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
  • Libc info leak: Postoji upotreba nakon oslobođenja i dvostruko oslobođavanje. U ovom writeup-u autor je procurio adresu libc-a čitajući adresu bloka smeštenog u malom binu (poput procurivanja iz nesortiranog bina ali iz malog).
  • Napad na Tcache: Tcache se izvodi putem dvostrukog oslobođavanja. Isti blok je oslobođen dva puta, tako da će unutar Tcache-a blok pokazivati na sebe. Zatim, on se alocira, njegov FD pokazivač se menja da pokazuje na free hook i zatim se ponovo alocira tako da će sledeći blok na listi biti u free hook-u. Zatim, i ovaj se alocira i moguće je napisati adresu system ovde tako da kada se oslobođe malloc koji sadrži "/bin/sh" dobijemo shell.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
  • Glavna ranjivost ovde je mogućnost oslobođavanja bilo koje adrese u hipu navođenjem njenog ofseta
  • Napadi na Tcache indekse: Moguće je alocirati i osloboditi blok određene veličine koji će, kada se skladišti unutar tcache bloka (blok sa informacijama o binovima tcache-a), generisati adresu sa vrednošću 0x100. Ovo je zato što tcache čuva broj blokova u svakom binu u različitim bajtovima, stoga jedan blok u jednom određenom indeksu generiše vrednost 0x100.
  • Zatim, ova vrednost izgleda kao da postoji blok veličine 0x100. Omogućava zloupotrebu tako što se oslobodi ova adresa. Ovo će dodati tu adresu u indeks blokova veličine 0x100 u tcache-u.
  • Zatim, alociranjem bloka veličine 0x100, prethodna adresa će biti vraćena kao blok, omogućavajući prepisivanje drugih tcache indeksa.
    Na primer, postavljanje adrese malloc hook-a u jednom od njih i alokacija bloka veličine tog indeksa omogućiće blok u calloc hook-u, što omogućava pisanje one gadgeta za dobijanje shell-a.
  • CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
  • Isti ranjivost kao i prethodno sa jednim dodatnim ograničenjem
  • Napadi na Tcache indekse: Sličan napad kao prethodni ali sa manje koraka tako što se oslobađa blok koji sadrži informacije o tcache-u tako da se njegova adresa doda u tcache indeks njegove veličine tako da je moguće alocirati tu veličinu i dobiti informacije o tcache bloku kao blok, što omogućava dodavanje free hook-a kao adrese jednog indeksa, alokacija toga, i pisanje one gadgeta na njemu.
  • Math Door. HTB Cyber Apocalypse CTF 2023
  • Pisanje nakon oslobođenja da se doda broj pokazivaču fd.
  • Potrebno je puno heap feng-shui-a u ovom izazovu. Writeup pokazuje kako je kontrolisanje glave Tcache liste slobodnih blokova prilično korisno.
  • Glibc procurivanje preko stdout (FSOP).
  • Tcache trovanje za dobijanje proizvoljnog pisanja.
  • Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
  • Podelite hakovanje trikove slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
{% endhint %}