mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
112 lines
9.4 KiB
Markdown
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}}
|