Basic Stack Binary Exploitation Methodology
Last updated
Last updated
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Pre nego što počnete da eksploatišete bilo šta, zanimljivo je razumeti deo strukture ELF binarnog fajla:
Sa toliko tehnika, dobro je imati shemu kada će svaka tehnika biti korisna. Imajte na umu da će iste zaštite uticati na različite tehnike. Možete pronaći načine da zaobiđete zaštite u svakoj sekciji zaštite, ali ne u ovoj metodologiji.
Postoje različiti načini na koje možete kontrolisati tok programa:
Stack Overflows prepisivanjem povratne adrese iz steka ili EBP -> ESP -> EIP.
Možda će biti potrebno da zloupotrebite Integer Overflows da izazovete prelivanje.
Ili putem Arbitrary Writes + Write What Where to Execution.
Format strings: Zloupotreba printf
za pisanje proizvoljnog sadržaja na proizvoljne adrese.
Array Indexing: Zloupotreba loše dizajniranog indeksiranja kako biste mogli da kontrolišete neke nizove i dobijete proizvoljno pisanje.
Možda će biti potrebno da zloupotrebite Integer Overflows da izazovete prelivanje.
bof to WWW putem ROP-a: Zloupotreba prelivanja bafera za konstrukciju ROP-a i mogućnost dobijanja WWW.
Možete pronaći tehnike Write What Where to Execution u:
Nešto što treba uzeti u obzir je da obično samo jedna eksploatacija ranjivosti možda neće biti dovoljna da se izvrši uspešna eksploatacija, posebno neke zaštite treba zaobići. Stoga, zanimljivo je raspraviti o nekim opcijama za učiniti jednu ranjivost eksploatabilnom više puta u istoj izvršnoj binarnoj datoteci:
Pisanje u ROP lancu adrese main
funkcije ili na adresu gde se ranjivost dešava.
Kontrolisanjem odgovarajućeg ROP lanca možda ćete moći da izvršite sve akcije u tom lancu.
Pisanje u exit
adresu u GOT (ili bilo kojoj drugoj funkciji koju koristi binarna datoteka pre završetka) adrese za povratak na ranjivost.
Kao što je objašnjeno u .fini_array, ovde čuvajte 2 funkcije, jednu za ponovno pozivanje ranjivosti i drugu za pozivanje __libc_csu_fini
koja će ponovo pozvati funkciju iz .fini_array
.
ret2win: Postoji funkcija u kodu koju treba pozvati (možda sa nekim specifičnim parametrima) kako biste dobili zastavicu.
U bof-u sa PIE, moraćete da je zaobiđete.
U bof-u sa canary, moraćete da je zaobiđete.
Ako treba da postavite nekoliko parametara da biste ispravno pozvali funkciju ret2win, možete koristiti:
ROP lanac ako ima dovoljno gadgeta da pripremite sve parametre.
SROP (u slučaju da možete pozvati ovaj syscall) da kontrolišete mnogo registara.
Putem Write What Where mogli biste zloupotrebiti druge ranjivosti (ne bof) da pozovete funkciju win
.
Pointers Redirecting: U slučaju da stek sadrži pokazivače na funkciju koja će biti pozvana ili na string koji će koristiti zanimljiva funkcija (system ili printf), moguće je prepisati tu adresu.
Neinicijalizovane promenljive: Nikad ne znate.
(Stack) Shellcode: Ovo je korisno za skladištenje shellcode-a u steku pre ili posle prepisivanja povratne adrese i zatim skakanje na njega da ga izvršite:
U svakom slučaju, ako postoji canary, u običnom bof-u moraćete da je zaobiđete (leak).
Sa ASLR moraćete koristiti tehnike kao što su ret2esp/ret2reg da biste skočili na njega.
Ovo će pomešati shellcode sa ROP lancem.
Ret2syscall: Korisno za pozivanje execve
da izvrši proizvoljne komande. Morate biti u mogućnosti da pronađete gadgete za pozivanje specifičnog syscall-a sa parametrima.
SROP može biti koristan za pripremu ret2execve.
Ret2lib: Korisno za pozivanje funkcije iz biblioteke (obično iz libc
) kao što je system
sa nekim pripremljenim argumentima (npr. '/bin/sh'
). Potrebno je da binarna datoteka učita biblioteku sa funkcijom koju želite da pozovete (libc obično).
Ako je staticki kompajlirana i bez PIE, adresa system
i /bin/sh
se neće menjati, tako da ih je moguće koristiti statički.
Bez ASLR i znajući verziju libc koja je učitana, adresa system
i /bin/sh
se neće menjati, tako da ih je moguće koristiti statički.
Koristite ret2dlresolve
da biste rešili adresu system
i pozvali je.
Zaobiđite ASLR i izračunajte adresu system
i '/bin/sh'
u memoriji.
Zaobići PIE.
Pronaći libc
verziju koja se koristi (leak nekoliko adresa funkcija).
Proveriti prethodne scenarije sa ASLR da nastavite.
Stack Pivoting / EBP2Ret / EBP Chaining: Kontrola ESP-a da kontrolišete RET putem sačuvanog EBP-a u steku.
Korisno za off-by-one prelivanja steka.
Korisno kao alternativni način da se završi kontrola EIP-a dok se zloupotrebljava EIP za konstrukciju payload-a u memoriji i zatim skakanje na njega putem EBP-a.
Pointers Redirecting: U slučaju da stek sadrži pokazivače na funkciju koja će biti pozvana ili na string koji će koristiti zanimljiva funkcija (system ili printf), moguće je prepisati tu adresu.
Neinicijalizovane promenljive: Nikad ne znate.
Učite i vežbajte AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Učite i vežbajte GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)