112 lines
9.4 KiB
Markdown

# 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}}