# Osnovna Metodologija Eksploatacije Binarnih Datoteka {{#include ../../banners/hacktricks-training.md}} ## Osnovne Informacije o ELF-u Pre nego što počnete sa eksploatacijom bilo čega, zanimljivo je razumeti deo strukture **ELF binarne datoteke**: {{#ref}} elf-tricks.md {{#endref}} ## Alati za Eksploataciju {{#ref}} tools/ {{#endref}} ## Metodologija Stack Overflow-a 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. ## Kontrola Tokova Postoje različiti načini na koje možete kontrolisati tok programa: - [**Stack Overflows**](../stack-overflow/index.html) prepisivanjem povratne adrese sa steka ili EBP -> ESP -> EIP. - Možda će biti potrebno da zloupotrebite [**Integer Overflows**](../integer-overflow.md) da izazovete prelivanje. - Ili putem **Arbitrary Writes + Write What Where to Execution**. - [**Format strings**](../format-strings/index.html)**:** Zloupotreba `printf` za pisanje proizvoljnog sadržaja na proizvoljne adrese. - [**Array Indexing**](../array-indexing.md): Zloupotreba loše dizajniranog indeksiranja kako biste mogli kontrolisati neke nizove i dobiti proizvoljno pisanje. - Možda će biti potrebno da zloupotrebite [**Integer Overflows**](../integer-overflow.md) da izazovete prelivanje. - **bof to WWW via ROP**: Zloupotreba prelivanja bafera za konstrukciju ROP-a i mogućnost dobijanja WWW. Možete pronaći tehnike **Write What Where to Execution** u: {{#ref}} ../arbitrary-write-2-exec/ {{#endref}} ## Večne Petlje 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 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 koju drugu funkciju koju koristi binarna datoteka pre završetka) adresu za **povratak na ranjivost**. - Kao što je objašnjeno u [**.fini_array**](../arbitrary-write-2-exec/www2exec-.dtors-and-.fini_array.md#eternal-loop)**,** ovde čuvajte 2 funkcije, jednu za ponovno pozivanje ranjivosti i drugu za pozivanje **`__libc_csu_fini`** koja će ponovo pozvati funkciju iz `.fini_array`. ## Ciljevi Eksploatacije ### Cilj: Pozvati Postojeću funkciju - [**ret2win**](#ret2win): Postoji funkcija u kodu koju treba pozvati (možda sa nekim specifičnim parametrima) kako biste dobili zastavicu. - U **običnom bof-u bez** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **i** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html) samo treba da upišete adresu u povratnu adresu smeštenu na steku. - U bof-u sa [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), moraćete da je zaobiđete. - U bof-u sa [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html), moraćete da je zaobiđete. - Ako treba da postavite nekoliko parametara da biste ispravno pozvali **ret2win** funkciju, možete koristiti: - [**ROP**](#rop-and-ret2...-techniques) **lanac ako ima dovoljno gadgeta** da pripremite sve parametre. - [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) (u slučaju da možete pozvati ovaj syscall) da kontrolišete mnogo registara. - Gadgete iz [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) i [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) da kontrolišete nekoliko registara. - Putem [**Write What Where**](../arbitrary-write-2-exec/index.html) mogli biste zloupotrebiti druge ranjivosti (ne bof) da pozovete **`win`** funkciju. - [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): 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. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ili [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) mogu uticati na adrese. - [**Uninitialized variables**](../stack-overflow/uninitialized-variables.md): Nikad ne znate. ### Cilj: RCE #### Putem shellcode-a, ako je nx onemogućen ili mešanjem shellcode-a sa ROP-om: - [**(Stack) Shellcode**](#stack-shellcode): Ovo je korisno za smeštanje shellcode-a na stek pre ili posle prepisivanja povratne adrese i zatim **skakanja na njega** da ga izvršite: - **U svakom slučaju, ako postoji** [**canary**](../common-binary-protections-and-bypasses/stack-canaries/index.html)**,** u običnom bof-u moraćete da je zaobiđete (leak). - **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **i** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md) moguće je skočiti na adresu steka jer se nikada neće promeniti. - **Sa** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) moraćete da koristite tehnike kao što su [**ret2esp/ret2reg**](../rop-return-oriented-programing/ret2esp-ret2reg.md) da biste skočili na njega. - **Sa** [**nx**](../common-binary-protections-and-bypasses/no-exec-nx.md), moraćete da koristite neki [**ROP**](../rop-return-oriented-programing/index.html) **da pozovete `memprotect`** i učinite neku stranicu `rwx`, kako biste zatim **smeštali shellcode unutra** (pozivajući read na primer) i zatim skočili tamo. - Ovo će mešati shellcode sa ROP lancem. #### Putem syscalls - [**Ret2syscall**](../rop-return-oriented-programing/rop-syscall-execv/index.html): Korisno za pozivanje `execve` da izvrši proizvoljne komande. Morate biti u mogućnosti da pronađete **gadget-e za pozivanje specifičnog syscall-a sa parametrima**. - Ako su [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ili [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) omogućeni, moraćete da ih savladate **da biste koristili ROP gadget-e** iz binarne datoteke ili biblioteka. - [**SROP**](../rop-return-oriented-programing/srop-sigreturn-oriented-programming/index.html) može biti koristan za pripremu **ret2execve**. - Gadgeti iz [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) i [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) za kontrolu nekoliko registara. #### Putem libc - [**Ret2lib**](../rop-return-oriented-programing/ret2lib/index.html): 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**](../common-binary-protections-and-bypasses/pie/index.html), **adresa** `system` i `/bin/sh` se neće menjati, tako da je moguće koristiti ih statički. - **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **i znajući verziju libc** koja je učitana, **adresa** `system` i `/bin/sh` se neće menjati, tako da je moguće koristiti ih statički. - Sa [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **ali bez** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, znajući libc i sa binarnom datotekom koja koristi `system`** funkciju, moguće je **`ret` na adresu system u GOT** sa adresom `'/bin/sh'` u parametru (to ćete morati da otkrijete). - Sa [ASLR](../common-binary-protections-and-bypasses/aslr/index.html) ali bez [PIE](../common-binary-protections-and-bypasses/pie/index.html), znajući libc i **bez binarne datoteke koja koristi `system`**: - Koristite [**`ret2dlresolve`**](../rop-return-oriented-programing/ret2dlresolve.md) da rešite adresu `system` i pozovete je. - **Zaobiđite** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) i izračunajte adresu `system` i `'/bin/sh'` u memoriji. - **Sa** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **i** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) **i ne znajući libc**: Morate: - Zaobići [**PIE**](../common-binary-protections-and-bypasses/pie/index.html). - Pronaći **`libc` verziju** koja se koristi (leak nekoliko adresa funkcija). - Proveriti **prethodne scenarije sa ASLR** da nastavite. #### Putem EBP/RBP - [**Stack Pivoting / EBP2Ret / EBP Chaining**](../stack-overflow/stack-pivoting-ebp2ret-ebp-chaining.md): Kontrola ESP-a da kontrolišete RET putem smeštenog EBP-a na steku. - Korisno za **off-by-one** prelivanja steka. - Korisno kao alternativni način za kontrolu EIP-a dok zloupotrebljavate EIP za konstrukciju payload-a u memoriji i zatim skakanje na njega putem EBP-a. #### Razno - [**Pointers Redirecting**](../stack-overflow/pointer-redirecting.md): 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. - [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) ili [**PIE**](../common-binary-protections-and-bypasses/pie/index.html) mogu uticati na adrese. - [**Uninitialized variables**](../stack-overflow/uninitialized-variables.md): Nikad ne znate. {{#include ../../banners/hacktricks-training.md}}