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