6.5 KiB
Kuća sile
{% 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
- Proverite planove pretplate!
- Pridružite se 💬 Discord grupi ili telegram grupi ili nas pratite na Twitteru 🐦 @hacktricks_live.
- Podelite hakovanje trikova slanjem PR-ova na HackTricks i HackTricks Cloud github repozitorijume.
Osnovne informacije
Kod
- Ova tehnika je zakrpljena (ovde) i proizvodi ovu grešku:
malloc(): corrupted top size
- Možete probati kod odavde da je testirate ako želite.
Cilj
- Cilj ovog napada je da se može alocirati komad na određenoj adresi.
Zahtevi
- Prekoračenje koje omogućava prepisivanje veličine zaglavlja vrha komada (npr. -1).
- Biti u mogućnosti da se kontroliše veličina alociranja hipa
Napad
Ako napadač želi da alocira komad na adresi P da bi prepisao vrednost ovde. Počinje tako što prepisuje veličinu vrha komada sa -1
(možda prekoračenjem). Ovo osigurava da malloc neće koristiti mmap za bilo koju alokaciju jer će Vrh komada uvek imati dovoljno prostora.
Zatim, izračunajte udaljenost između adrese vrha komada i ciljnog prostora za alokaciju. Ovo je zato što će se malloc sa tom veličinom izvršiti kako bi se premestio vrh komada na tu poziciju. Na ovaj način razlika/veličina se može lako izračunati:
// From https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c#L59C2-L67C5
/*
* The evil_size is calulcated as (nb is the number of bytes requested + space for metadata):
* new_top = old_top + nb
* nb = new_top - old_top
* req + 2sizeof(long) = new_top - old_top
* req = new_top - old_top - 2sizeof(long)
* req = target - 2sizeof(long) - old_top - 2sizeof(long)
* req = target - old_top - 4*sizeof(long)
*/
Dakle, dodeljivanje veličine cilj - stari_vrh - 4*sizeof(long)
(4 long-a su zbog metapodataka vrhunskog bloka i novog bloka kada je alociran) će premestiti vrhunski blok na adresu koju želimo da prepisujemo.
Zatim, uradite još jedan malloc da biste dobili blok na ciljanoj adresi.
Reference & Drugi Primeri
- https://github.com/shellphish/how2heap/tree/master
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/
- https://heap-exploitation.dhavalkapil.com/attacks/house_of_force
- https://github.com/shellphish/how2heap/blob/master/glibc_2.27/house_of_force.c
- https://guyinatuxedo.github.io/41-house_of_force/house_force_exp/index.html
- https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house_of_force/#hitcon-training-lab-11
- Cilj ovog scenarija je ret2win gde treba izmeniti adresu funkcije koja će biti pozvana adresom funkcije ret2win
- Binarni fajl ima prelivanje koje se može zloupotrebiti za izmenu veličine vrhunskog bloka, koji je izmenjen na -1 ili p64(0xffffffffffffffff)
- Zatim se izračunava adresa mesta gde postoji pokazivač za prepisivanje, i razlika od trenutne pozicije vrhunskog bloka do tamo se alocira sa
malloc
- Na kraju se alocira novi blok koji će sadržati ovu željenu metu unutar koje će biti prepisana funkcija ret2win
- https://shift--crops-hatenablog-com.translate.goog/entry/2016/03/21/171249?_x_tr_sl=es&_x_tr_tl=en&_x_tr_hl=en&_x_tr_pto=wapp
- U
Unesite svoje ime:
postoji početna ranjivost koja omogućava otkrivanje adrese sa hipa - Zatim u funkcionalnosti
Org:
iHost:
moguće je popuniti 64B pokazivača kada se traži org ime, koji na steku sledi adresa v2, koja se zatim prati navedenim host imenom. Kako će strcpy kopirati sadržaj s u blok veličine 64B, moguće je prepisanje veličine vrhunskog bloka podacima unetim unutar host imena. - Sada kada je moguće proizvoljno pisanje, GOT
atoi
je prepisan na adresu printf-a. tada je moguće otkriti adresuIO_2_1_stderr
sa%24$p
. I sa ovim curenjem libc-a bilo je moguće ponovo prepisati GOTatoi
sa adresomsystem
i pozvati je prosleđujući kao parametar/bin/sh
- Alternativna metoda predložena u ovom drugom writeup-u, je prepisati
free
saputs
, a zatim dodati adresuatoi@got
, u pokazivač koji će kasnije biti oslobođen tako da se curenje i ovim curenjem ponovo prepisujeatoi@got
sasystem
i poziva se sa/bin/sh
. - https://guyinatuxedo.github.io/41-house_of_force/bkp16_cookbook/index.html
- Postoji UAF koji omogućava ponovnu upotrebu bloka koji je oslobođen bez brisanja pokazivača. Zbog nekih metoda čitanja, moguće je otkriti libc adresu upisivanjem pokazivača na funkciju free u GOT ovde, a zatim pozivanjem funkcije za čitanje.
- Zatim je korišćen House of force (zloupotreba UAF-a) da se prepisuje veličina preostalog prostora sa -1, alocira blok dovoljno velik da se dođe do slobodnog kuka, a zatim alocira još jedan blok koji će sadržati slobodni kuk. Zatim, u kuk upisati adresu
system
, upisati u blok"/bin/sh"
i na kraju osloboditi blok sa tim sadržajem stringa.