112 lines
9.4 KiB
Markdown

# Osnovna metodologija binarnog eksploatisanja
{{#include ../../banners/hacktricks-training.md}}
## ELF Osnovne informacije
Pre nego što počnete da eksploatišete bilo šta, zanimljivo je razumeti deo strukture **ELF binarnog** fajla:
{{#ref}}
elf-tricks.md
{{#endref}}
## Alati za eksploataciju
{{#ref}}
tools/
{{#endref}}
## Metodologija prelivanja steka
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 toka
Postoje različiti načini na koje možete kontrolisati tok programa:
- [**Stack Overflows**](../stack-overflow/index.html) prepisivanjem povratne adrese iz 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 da kontrolišete neke nizove i dobijete 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 instanci binarnog fajla:
- 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 binarni fajl pre završetka) adrese 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 u 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.
- Gadgeti iz [**ret2csu**](../rop-return-oriented-programing/ret2csu.md) i [**ret2vdso**](../rop-return-oriented-programing/ret2vdso.md) za kontrolu više 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.
- [**Neinicijalizovane promenljive**](../stack-overflow/uninitialized-variables.md): Nikada ne znate.
### Cilj: RCE
#### Putem shellcode-a, ako je nx onemogućen ili mešanjem shellcode-a sa ROP:
- [**(Stack) Shellcode**](#stack-shellcode): Ovo je korisno za smeštanje shellcode-a u 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 u nju** (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 gadgete** iz binarnog fajla 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 više 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 binarni fajl **učita biblioteku** sa funkcijom koju želite da pozovete (libc obično).
- Ako je **staticki kompajliran i bez** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html), **adrese** `system` i `/bin/sh` se neće menjati, tako da ih je moguće koristiti statički.
- **Bez** [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **i poznavanja verzije libc** koja je učitana, **adrese** `system` i `/bin/sh` se neće menjati, tako da ih je moguće koristiti statički.
- Sa [**ASLR**](../common-binary-protections-and-bypasses/aslr/index.html) **ali bez** [**PIE**](../common-binary-protections-and-bypasses/pie/index.html)**, poznavanjem libc i sa binarnim fajlom koji 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), poznavanjem libc i **bez binarnog fajla koji 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 **verziju `libc`** 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 u steku.
- Korisno za **off-by-one** prelivanja steka.
- Korisno kao alternativni način da završite 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.
- [**Neinicijalizovane promenljive**](../stack-overflow/uninitialized-variables.md): Nikada ne znate.
{{#include ../../banners/hacktricks-training.md}}