Translated ['pentesting-web/browser-extension-pentesting-methodology/REA

This commit is contained in:
Translator 2024-04-19 00:32:46 +00:00
parent 033ec916e9
commit 6caf992a5c
2 changed files with 92 additions and 90 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -6,7 +6,7 @@
Drugi načini podrške HackTricks-u:
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Ako želite da vidite **vašu kompaniju reklamiranu na HackTricks-u** ili **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJAVU**](https://github.com/sponsors/carlospolop)!
* Nabavite [**zvanični PEASS & HackTricks swag**](https://peass.creator-spring.com)
* Otkrijte [**Porodicu PEASS**](https://opensea.io/collection/the-peass-family), našu kolekciju ekskluzivnih [**NFT-ova**](https://opensea.io/collection/the-peass-family)
* **Pridružite se** 💬 [**Discord grupi**](https://discord.gg/hRep4RUj7f) ili [**telegram grupi**](https://t.me/peass) ili nas **pratite** na **Twitteru** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
@ -34,21 +34,21 @@ Jezgro proširenja sadrži većinu privilegija/pristupa proširenja, ali jezgro
### **Nativni binarni fajl**
Proširenje omogućava nativni binarni fajl koji može **pristupiti host mašini sa punim privilegijama korisnika.** Nativni binarni fajl interaguje sa jezgrom proširenja putem standardnog interfejsa za programiranje aplikacija Netscape Plugin ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) koji koriste Flash i drugi dodaci pregledača.
Proširenje dozvoljava nativnom binarnom fajlu da **pristupi host mašini sa punim privilegijama korisnika.** Nativni binarni fajl interaguje sa jezgrom proširenja putem standardnog Netscape Plugin Application Programming Interface ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) koji koristi Flash i druge dodatke pregledača.
### Granice
{% hint style="danger" %}
Da bi dobio puna korisnička prava, napadač mora ubediti proširenje da prosledi zlonamerni unos iz skripte sadržaja jezgru proširenja i iz jezgra proširenja nativnom binarnom fajlu.
Da bi dobio puna korisnička prava, napadač mora ubediti proširenje da prosledi zlonameran unos iz skripte sadržaja jezgru proširenja i iz jezgra proširenja nativnom binarnom fajlu.
{% endhint %}
Svaka komponenta proširenja je odvojena jedna od druge **jakim zaštitnim granicama**. Svaka komponenta se izvršava u **zasebnom operativnom procesu**. Skripte sadržaja i jezgra proširenja se izvršavaju u **peskovitim procesima** nedostupnim većini usluga operativnog sistema.
Svaka komponenta proširenja je odvojena jedna od druge **jakim zaštitnim granicama**. Svaka komponenta se izvršava u **zasebnom operativnom sistemu**. Skripte sadržaja i jezgra proširenja se izvršavaju u **peskovitim procesima** nedostupnim većini usluga operativnog sistema.
Pored toga, skripte sadržaja su odvojene od svojih povezanih veb stranica **izvršavanjem u zasebnom JavaScript hipu**. Skripta sadržaja i veb stranica imaju **pristup istom osnovnom DOM-u**, ali se **nikada ne razmenjuju JavaScript pokazivači**, čime se sprečava curenje JavaScript funkcionalnosti.
Pored toga, skripte sadržaja su odvojene od svojih povezanih veb stranica **izvršavanjem u zasebnom JavaScript hipu**. Skripta sadržaja i veb stranica imaju **pristup istom osnovnom DOM-u**, ali se **nikada ne razmenjuju JavaScript pokazivači**, sprečavajući curenje JavaScript funkcionalnosti.
## **`manifest.json`**
Chrome proširenje je samo ZIP folder sa [.crx ekstenzijom fajla](https://www.lifewire.com/crx-file-2620391). Jezgro proširenja je **`manifest.json`** fajl na korenu foldera, koji specificira dizajn, dozvole i druge konfiguracione opcije.
Chrome proširenje je samo ZIP folder sa [.crx ekstenzijom fajla](https://www.lifewire.com/crx-file-2620391). Jezgro proširenja je **`manifest.json`** fajl u korenu foldera, koji specificira izgled, dozvole i druge konfiguracione opcije.
Primer:
```json
@ -83,7 +83,7 @@ Primer:
```
### `content_scripts`
Content skripte se **učitavaju** svaki put kada korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo koju stranicu koja se podudara sa izrazom **`https://example.com/*`** i ne podudara se sa **`*://*/*/business*`** regexom. Oni se izvršavaju **kao skripte same stranice** i imaju proizvoljan pristup [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) stranice.
Content skripte se **učitavaju** svaki put kada korisnik **navigira na odgovarajuću stranicu**, u našem slučaju bilo koju stranicu koja odgovara izrazu **`https://example.com/*`** i ne odgovara regexu **`*://*/*/business*`**. Oni se izvršavaju **kao skripte same stranice** i imaju proizvoljan pristup [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) stranice.
```json
"content_scripts": [
{
@ -100,7 +100,7 @@ Content skripte se **učitavaju** svaki put kada korisnik **navigira na odgovara
```
Da biste uključili ili isključili više URL-ova, takođe je moguće koristiti **`include_globs`** i **`exclude_globs`**.
Ovo je primer skripte sadržaja koja će dodati dugme za objašnjenje na stranici kada [API za skladištenje](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) koristi se za dobijanje vrednosti `message` iz skladišta proširenja.
Ovo je primer skripte sadržaja koja će dodati dugme za objašnjenje na stranici kada [API za skladištenje](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) koristi da povuče vrednost `message` iz skladišta proširenja.
```js
chrome.storage.local.get("message", result =>
{
@ -115,21 +115,21 @@ document.body.appendChild(div);
```
<figure><img src="../../.gitbook/assets/image (20).png" alt=""><figcaption></figcaption></figure>
Kada se klikne na ovaj dugme, poruka se šalje stranicama proširenja putem sadržajnog skripta, korišćenjem [**API-ja runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Ovo je zbog ograničenja sadržajnog skripta u direktnom pristupu API-ima, pri čemu je `storage` među retkim izuzecima. Za funkcionalnosti van ovih izuzetaka, poruke se šalju stranicama proširenja sa kojima sadržajni skriptovi mogu komunicirati.
Kada se klikne na ovaj dugme, sadržajni skript šalje poruku stranicama proširenja, korišćenjem [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Ovo je zbog ograničenja sadržajnog skripta u direktnom pristupu API-ima, pri čemu je `storage` među retkim izuzecima. Za funkcionalnosti van ovih izuzetaka, poruke se šalju stranicama proširenja sa kojima sadržajni skriptovi mogu komunicirati.
{% hint style="warning" %}
Zavisno od pretraživača, mogućnosti sadržajnog skripta mogu se malo razlikovati. Za pretraživače zasnovane na Chromium-u, lista mogućnosti dostupna je u [Chrome Developers dokumentaciji](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a za Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) služi kao primarni izvor.\
Takođe je važno napomenuti da sadržajni skriptovi imaju mogućnost komunikacije sa pozadinskim skriptovima, omogućavajući im da obavljaju radnje i prenose odgovore nazad.
Zavisno od pretraživača, mogućnosti sadržajnog skripta mogu se blago razlikovati. Za pretraživače zasnovane na Chromium-u, lista mogućnosti dostupna je u [Chrome Developers dokumentaciji](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a za Firefox, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) služi kao primarni izvor.\
Takođe je važno napomenuti da sadržajni skriptovi imaju mogućnost komunikacije sa pozadinskim skriptovima, omogućavajući im da izvrše radnje i prenesu odgovore nazad.
{% endhint %}
Za pregledanje i debagovanje sadržajnih skriptova u Chrome-u, meni Chrome developer alatki može se pristupiti putem Opcije > Više alatki > Developer alatke ILI pritiskom na Ctrl + Shift + I.
Za pregledanje i debagovanje sadržajnih skriptova u Chrome-u, meni Chrome developer alatki može se pristupiti preko Opcije > Više alatki > Developer alatke ILI pritiskom na Ctrl + Shift + I.
Kada se prikažu developer alatke, treba kliknuti na **Tab izvora**, a zatim na **Tab sadržajnih skriptova**. Ovo omogućava posmatranje pokrenutih sadržajnih skriptova iz različitih proširenja i postavljanje tačaka prekida kako bi se pratilo izvršavanje toka.
### Ubaceni sadržajni skriptovi
{% hint style="success" %}
Imajte na umu da **Sadržajni skriptovi nisu obavezni** jer je takođe moguće **dinamički** **ubaciti** skripte i **programatski ih ubaciti** na web stranice putem **`tabs.executeScript`**. Ovo zapravo pruža više **granularnih kontrola**.
Imajte na umu da **Sadržajni skriptovi nisu obavezni** jer je takođe moguće **dinamički ubaciti** skripte i **programatski ih ubaciti** na web stranice putem **`tabs.executeScript`**. Ovo zapravo pruža više **granularnih kontrola**.
{% endhint %}
Za programatsko ubacivanje sadržajnog skripta, proširenju je potrebno imati [dozvole domaćina](https://developer.chrome.com/docs/extensions/reference/permissions) za stranicu u koju se skriptovi ubacuju. Ove dozvole mogu se obezbediti ili **zahtevanjem** u manifestu proširenja ili privremeno putem [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
@ -155,7 +155,7 @@ Za programatsko ubacivanje sadržajnog skripta, proširenju je potrebno imati [d
```
{% endcode %}
* **Ubacivanje JS datoteke na klik:**
* **Ubacivanje JS fajla prilikom klika:**
```javascript
// content-script.js
document.body.style.backgroundColor = "orange";
@ -182,7 +182,7 @@ func : injectedFunction,
});
});
```
#### Primer sa dozvolama za skriptovanje
#### Primer sa dozvolama skriptovanja
```javascript
// service-workser.js
chrome.scripting.registerContentScripts([{
@ -201,9 +201,9 @@ Polje `run_at` kontroliše **kada se JavaScript fajlovi ubacuju u web stranicu**
Moguće vrednosti su:
- **`document_idle`**: Kada god je moguće
- **`document_start`**: Nakon bilo kojih fajlova iz `css`, ali pre nego što je konstruisan bilo koji drugi DOM ili pokrenut bilo koji drugi skript.
- **`document_end`**: Neposredno nakon što je DOM kompletiran, ali pre nego što su se učitale podređene resurse poput slika i frejmova.
* **`document_idle`**: Kada god je moguće
* **`document_start`**: Nakon bilo kojih fajlova iz `css`, ali pre nego što je konstruisan bilo koji drugi DOM ili pokrenut bilo koji drugi skript.
* **`document_end`**: Neposredno nakon što je DOM kompletiran, ali pre nego što su se učitale podređene resurse poput slika i frejmova.
#### Putem `manifest.json`
```json
@ -237,7 +237,7 @@ Poruke poslate od strane skriptova sadržaja primaju se od strane **pozadinske s
**Ključne tačke**:
* **Uloga pozadinske stranice:** Deluje kao nervni centar proširenja, osiguravajući komunikaciju i koordinaciju među različitim delovima proširenja.
* **Perzistencija:** To je stalno prisutno entitet, nevidljivo korisniku ali integralno funkcionalnosti proširenja.
* **Perzistencija:** To je stalna entitet, nevidljiva korisniku ali integralna za funkcionalnost proširenja.
* **Automatsko generisanje:** Ako nije eksplicitno definisana, pretraživač će automatski kreirati pozadinsku stranicu. Ova automatski generisana stranica će uključiti sve pozadinske skripte navedene u manifestu proširenja, osiguravajući besprekorno funkcionisanje pozadinskih zadataka proširenja.
{% hint style="success" %}
@ -256,30 +256,30 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
```
Koristi [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) da bi osluškivao poruke. Kada primi poruku `"explain"`, koristi [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) da otvori stranicu u novom tabu.
Za debagovanje pozadinskog skripta možete otići na **detalje proširenja i inspekciju servisnog radnika**, što će otvoriti alatke za razvoj sa pozadinskim skriptom:
Za debagovanje pozadinskog skripta možete otvoriti **detalje proširenja i inspekciju servisnog radnika**, što će otvoriti alatke za razvoj sa pozadinskim skriptom:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
### Stranice opcija i ostalo
### Stranice sa opcijama i ostalo
Browser proširenja mogu sadržati različite vrste stranica:
Browser ekstenzije mogu sadržati različite vrste stranica:
* **Stranice akcija** se prikazuju u **padajućem meniju kada se klikne ikona proširenja**.
* Stranice koje će proširenje **učitati u novom tabu**.
* **Stranice opcija**: Ova stranica se prikazuje iznad proširenja kada se klikne. U prethodnom manifestu u mom slučaju sam mogao pristupiti ovoj stranici na `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ili klikom na:
* **Stranice akcija** se prikazuju u **padajućem meniju kada se klikne ikona ekstenzije**.
* Stranice koje će se **učitati u novom tabu**.
* **Stranice opcija**: Ova stranica se prikazuje iznad ekstenzije kada se klikne. U mom slučaju, mogao sam pristupiti ovoj stranici na `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ili klikom na:
<figure><img src="../../.gitbook/assets/image (21).png" alt="" width="375"><figcaption></figcaption></figure>
Imajte na umu da ove stranice nisu trajne poput pozadinskih stranica jer dinamički učitavaju sadržaj po potrebi. Ipak, dele određene mogućnosti sa pozadinskom stranicom:
* **Komunikacija sa skriptovima sadržaja:** Slično kao pozadinska stranica, ove stranice mogu primati poruke od skriptova sadržaja, olakšavajući interakciju unutar proširenja.
* **Pristup API-jima specifičnim za proširenje:** Ove stranice imaju sveobuhvatan pristup API-jima specifičnim za proširenje, podložan dozvolama definisanim za proširenje.
* **Komunikacija sa skriptama sadržaja:** Slično kao pozadinska stranica, ove stranice mogu primati poruke od skripti sadržaja, olakšavajući interakciju unutar ekstenzije.
* **Pristup API-jima specifičnim za ekstenziju:** Ove stranice imaju sveobuhvatan pristup API-jima specifičnim za ekstenziju, pod uslovom da su dozvole definisane za ekstenziju.
### `permissions` & `host_permissions`
**`permissions`** i **`host_permissions`** su unosi iz `manifest.json` koji će ukazati na **koje dozvole** browser proširenje ima (skladište, lokacija...) i na **kojim veb stranicama**.
**`permissions`** i **`host_permissions`** su unosi iz `manifest.json` koji će ukazati na **koje dozvole** browser ekstenzija ima (skladište, lokacija...) i na **kojim veb stranicama**.
Kako browser proširenja mogu biti tako **privilegovana**, zlonamerno proširenje ili ono koje je kompromitovano može omogućiti napadaču **različite načine za krađu osetljivih informacija i špijuniranje korisnika**.
S obzirom na to da browser ekstenzije mogu imati toliko **velike privilegije**, zlonamerna ili kompromitovana ekstenzija može omogućiti napadaču **različite načine za krađu osetljivih informacija i špijuniranje korisnika**.
Proverite kako ove postavke funkcionišu i kako mogu biti zloupotrebljene u:
@ -291,11 +291,11 @@ Proverite kako ove postavke funkcionišu i kako mogu biti zloupotrebljene u:
**Politika bezbednosti sadržaja** takođe može biti deklarisana unutar `manifest.json`. Ako je definisana, može biti **ranjiva**.
Podrazumevana postavka za stranice browser proširenja je prilično restriktivna:
Podrazumevana postavka za stranice browser ekstenzija je prilično restriktivna:
```bash
script-src 'self'; object-src 'self';
```
Za više informacija o CSP i potencijalnim previdima proverite:
Za više informacija o CSP i potencijalnim obilascima provere bezbednosti sadržaja proverite:
{% content-ref url="../content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
@ -321,15 +321,15 @@ Na primer:
...
}
```
Ove stranice su dostupne na URL-ovima poput:
Ove stranice su dostupne na URL-u poput:
```
chrome-extension://<extension-id>/message.html
```
U javnim ekstenzijama **ID ekstenzije je dostupan**:
U javnim ekstenzijama **id ekstenzije je dostupan**:
<figure><img src="../../.gitbook/assets/image (1191).png" alt="" width="375"><figcaption></figcaption></figure>
Međutim, ako se koristi parametar `manifest.json` **`use_dynamic_url`**, ovaj **ID može biti dinamičan**.
Međutim, ako se koristi parametar `manifest.json` **`use_dynamic_url`**, ovaj **id može biti dinamičan**.
Dozvola pristupa ovim stranicama čini ih **potencijalno ranjivim na ClickJacking**:
@ -338,16 +338,16 @@ Dozvola pristupa ovim stranicama čini ih **potencijalno ranjivim na ClickJackin
{% endcontent-ref %}
{% hint style="success" %}
Dozvoljavanje učitavanja ovih stranica samo od strane ekstenzije, a ne od nasumičnih URL-ova, može sprečiti napade ClickJacking.
Dozvoljavanje učitavanja ovih stranica samo od strane ekstenzije, a ne od nasumičnih URL-ova, moglo bi sprečiti CLickJacking napade.
{% endhint %}
### `externally_connectable`
Prema [**dokumentaciji**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), svojstvo manifesta `"externally_connectable"` deklariše **koje ekstenzije i web stranice mogu da se povežu** sa vašom ekstenzijom putem [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
Prema [**dokumentaciji**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), manifest svojstvo `"externally_connectable"` deklariše **koje ekstenzije i web stranice mogu da se povežu** sa vašom ekstenzijom putem [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) i [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
* Ako ključ **`externally_connectable`** nije deklarisan u manifestu vaše ekstenzije ili je deklarisan kao **`"ids": ["*"]`**, **sve ekstenzije mogu da se povežu, ali nijedna web stranica ne može**.
* Ako su **specifični ID-ovi navedeni**, kao u `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **samo te aplikacije** mogu da se povežu.
* Ako su navedeni **odgovarajući podudarni uslovi**, te veb aplikacije će moći da se povežu:
* Ako su **specificirani određeni ID-ovi**, kao u `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **samo te aplikacije** mogu da se povežu.
* Ako su **specificirani odgovarajući podudarni uslovi**, te veb aplikacije će moći da se povežu:
```json
"matches": [
"https://*.google.com/*",
@ -355,21 +355,21 @@ Prema [**dokumentaciji**](https://developer.chrome.com/docs/extensions/reference
```
* Ako je navedeno kao prazno: **`"externally_connectable": {}`**, nijedna aplikacija ili veb stranica neće moći da se poveže.
Što je manje proširenja i URL-ova navedeno ovde, to će površina napada biti manja.
Što je manje ekstenzija i URL-ova navedeno ovde, to će površina napada biti manja.
{% hint style="danger" %}
Ako je veb stranica ranjiva na XSS ili preuzimanje kontrole navedena u **`externally_connectable`**, napadač će moći da šalje poruke direktno skripti pozadine, potpuno zaobilazeći Skriptu sadržaja i njegovu CSP.
Stoga, ovo je veoma moćna obilaznica.
Stoga, ovo je veoma moćna zaobilaznica.
Štaviše, ako klijent instalira zlonamerno proširenje, čak i ako mu nije dozvoljeno da komunicira sa ranjivim proširenjem, moglo bi da ubaci XSS podatke na dozvoljenu veb stranicu ili zloupotrebi `WebRequest` ili `DeclarativeNetRequest` API-je da manipuliše zahtevima na ciljanoj domeni menjajući zahtev za JavaScript datoteku na stranici. (Imajte na umu da CSP na ciljanoj stranici može da spreči ove napade). Ova ideja potiče [**iz ovog teksta**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
Štaviše, ako klijent instalira zlonamernu ekstenziju, čak i ako mu nije dozvoljeno da komunicira sa ranjivom ekstenzijom, mogla bi da ubaci XSS podatke na dozvoljenu veb stranicu ili zloupotrebi `WebRequest` ili `DeclarativeNetRequest` API-je da manipuliše zahtevima na ciljanoj domeni menjajući zahtev za stranicu za JavaScript fajl. (Imajte na umu da CSP na ciljanoj stranici može da spreči ove napade). Ova ideja potiče [**iz ovog teksta**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
{% endhint %}
##
## Komunikacija između veb stranice **↔︎** Skripte sadržaja
Okruženja u kojima **skripte sadržaja** funkcionišu i gde postoje stranice domaćini su **odvojena** jedno od drugog, obezbeđujući **izolaciju**. Uprkos ovoj izolaciji, oba imaju mogućnost da interaguju sa **Modelom objekata dokumenta (DOM)** stranice, deljenim resursom. Da bi stranica domaćin stupila u komunikaciju sa **skriptom sadržaja**, ili indirektno sa proširenjem preko skripte sadržaja, potrebno je koristiti **DOM** koji je dostupan obema stranama kao kanal komunikacije.
Okruženja u kojima **skripte sadržaja** funkcionišu i gde postoje host stranice su **odvojena** jedno od drugog, obezbeđujući **izolaciju**. Uprkos ovoj izolaciji, oba imaju mogućnost da interaguju sa **Document Object Model (DOM)** stranice, deljenim resursom. Da bi host stranica stupila u komunikaciju sa **skriptom sadržaja**, ili indirektno sa ekstenzijom preko skripte sadržaja, potrebno je koristiti **DOM** koji je dostupan obema stranama kao kanal komunikacije.
### Poruke Post
@ -391,7 +391,7 @@ port.postMessage(event.data.text);
```
{% endcode %}
{% code title="primer.js" %}
{% code title="example.js" %}
```javascript
document.getElementById("theButton").addEventListener("click", () => {
window.postMessage(
@ -402,13 +402,13 @@ window.postMessage(
Bezbedna komunikacija putem Post Message-a treba da proveri autentičnost primljene poruke, ovo se može uraditi proverom:
* **`event.isTrusted`**: Ovo je tačno samo ako je događaj pokrenut akcijom korisnika
* Content skript može očekivati poruku samo ako korisnik izvrši neku akciju
* **Poreklo domena**: može očekivati poruku samo od liste odobrenih domena.
* Ako se koristi regex, budite veoma oprezni
* **Izvor**: `received_message.source !== window` može se koristiti da proverite da li je poruka **sa istog prozora** gde Content skripta sluša.
- **`event.isTrusted`**: Ovo je tačno samo ako je događaj pokrenut akcijom korisnika
- Skript za sadržaj može očekivati poruku samo ako korisnik izvrši neku akciju
- **Poreklo domena**: može očekivati poruku samo od liste odobrenih domena.
- Ako se koristi regex, budite veoma oprezni
- **Izvor**: `received_message.source !== window` može se koristiti da se proveri da li je poruka **sa istog prozora** gde Skript za Sadržaj sluša.
Prethodne provere, čak i ako su izvršene, mogu biti ranjive, pa proverite na sledećoj stranici **potencijalne Post Message obilaske**:
Prethodne provere, čak i ako su izvršene, mogu biti ranjive, pa proverite na sledećoj stranici **potencijalne Post Message zaobilaze**:
{% content-ref url="../postmessage-vulnerabilities/" %}
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
@ -424,9 +424,9 @@ Još jedan mogući način komunikacije može biti putem **Iframe URL-ova**, mož
### DOM
Ovo nije "tačno" način komunikacije, ali **web i content skripta će imati pristup web DOM-u**. Dakle, ako **content skripta** čita neke informacije iz njega, **verujući web DOM-u**, web bi mogao **modifikovati te podatke** (jer web ne bi trebalo da se veruje, ili jer je web ranjiv na XSS) i **ugroziti Content skriptu**.
Ovo nije "tačno" način komunikacije, ali **web i skript za sadržaj će imati pristup web DOM-u**. Dakle, ako **skript za sadržaj** čita neke informacije iz njega, **verujući web DOM-u**, web bi mogao **modifikovati te podatke** (jer web ne bi trebalo da se veruje, ili jer je web ranjiv na XSS) i **ugroziti Skript za Sadržaj**.
Takođe možete pronaći primer **DOM baziranog XSS-a za ugrožavanje browser ekstenzije** u:
Takođe možete pronaći primer **DOM baziranog XSS za ugrožavanje proširenja pregledača** u:
{% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md)
@ -434,19 +434,21 @@ Takođe možete pronaći primer **DOM baziranog XSS-a za ugrožavanje browser ek
## Osetljive informacije u memoriji/kodu
Ako Browser ekstenzija čuva **osetljive informacije unutar svoje memorije**, ovo bi moglo biti **izloženo** (posebno na Windows mašinama) i **pretraženo** za ovim informacijama.
Ako Browser Extension čuva **osetljive informacije unutar svoje memorije**, ovo bi moglo biti **izvađeno** (posebno na Windows mašinama) i **pretraženo** za te informacije.
Stoga, memorija Browser ekstenzije **ne bi trebalo da se smatra bezbednom** i **osetljive informacije** kao što su kredencijali ili mnemoničke fraze **ne bi trebalo da se čuvaju**.
Stoga, memorija Browser Extension-a **ne bi trebalo da se smatra sigurnom** i **osetljive informacije** kao što su pristupni podaci ili mnemoničke fraze **ne bi trebalo da se čuvaju**.
Naravno, **ne stavljajte osetljive informacije u kod**, jer će biti **javne**.
## Komunikacija Content skripte **↔︎** Background skripta
Da biste izvukli memoriju iz pregledača, možete **izvući memoriju procesa** ili otići na **postavke** proširenja pregledača klikom na **`Inspect pop-up`** -> U odeljku **`Memory`** -> **`Napravi snimak`** i **`CTRL+F`** za pretragu unutar snimka za osetljive informacije.
Content skripta može koristiti funkcije [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ili** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) da pošalje **jednokratnu JSON-serializabilnu** poruku.
## Komunikacija Skripta za Sadržaj **↔︎** Skripta Pozadine
Skript za Sadržaj može koristiti funkcije [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ili** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) da pošalje **jednokratnu JSON-serializabilnu** poruku.
Za rukovanje **odgovorom**, koristite vraćeni **Promise**. Iako, radi kompatibilnosti unazad, i dalje možete proslediti **callback** kao poslednji argument.
Slanje zahteva iz **content skripte** izgleda ovako:
Slanje zahteva iz **skripta za sadržaj** izgleda ovako:
```javascript
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
@ -454,7 +456,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"});
console.log(response);
})();
```
Slanje zahteva iz **proširenja** (obično **pozadinskog skripta**) Skript sadržaja može koristiti funkcije, osim što morate navesti na koji tab da ga pošaljete. Primer kako poslati poruku skriptu sadržaja u izabranom tabu:
Slanje zahteva iz **dodatka** (obično **pozadinskog skripta**) Skript sadržaja može koristiti funkcije, osim što morate navesti na koji tab da ga pošaljete. Primer kako poslati poruku skriptu sadržaja na izabranom tabu:
```javascript
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
@ -464,7 +466,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
console.log(response);
})();
```
Na **primalacu**, treba da postavite [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **slušaoca događaja** da biste obradili poruku. Ovo izgleda isto iz sadržajnog skripta ili stranice proširenja.
Na **primalacu**, treba da postavite [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **slušač događaja** da biste obradili poruku. Ovo izgleda isto iz sadržajnog skripta ili stranice proširenja.
```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
@ -477,15 +479,15 @@ sendResponse({farewell: "goodbye"});
}
);
```
U prikazanom primeru, **`sendResponse()`** je izvršen sinhrono. Da biste izmenili `onMessage` rukovaoca događajima za asinhrono izvršavanje `sendResponse()`, imperativno je uključiti `return true;`.
U primeru istaknutom, **`sendResponse()`** je izvršen na sinhron način. Da biste izmenili rukovaoca događajem `onMessage` za asinhrono izvršavanje `sendResponse()`, imperativno je uključiti `return true;`.
Važno je imati na umu da u scenarijima gde su više stranica postavljene da primaju `onMessage` događaje, **prva stranica koja izvrši `sendResponse()`** za određeni događaj će biti jedina sposobna da efikasno dostavi odgovor. Svi naknadni odgovori na isti događaj neće biti uzeti u obzir.
Važno je imati na umu da u scenarijima gde je više stranica postavljeno da primaju događaje `onMessage`, **prva stranica koja izvrši `sendResponse()`** za određeni događaj će biti jedina sposobna da efikasno dostavi odgovor. Svi naknadni odgovori na isti događaj neće biti uzeti u obzir.
Prilikom kreiranja novih proširenja, prednost treba dati promisima umesto povratnim pozivima. Što se tiče korišćenja povratnih poziva, funkcija `sendResponse()` se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta, ili ako rukovalac događajima ukazuje na asinhronu operaciju vraćanjem `true`. Ukoliko nijedan od rukovalaca ne vrati `true` ili ako se funkcija `sendResponse()` ukloni iz memorije (sakupljanje smeća), podrazumevano će biti pokrenut povratni poziv povezan sa funkcijom `sendMessage()`.
Prilikom kreiranja novih proširenja, prednost treba dati promisima umesto povratnim pozivima. Što se tiče korišćenja povratnih poziva, funkcija `sendResponse()` se smatra validnom samo ako se izvršava direktno unutar sinhronog konteksta, ili ako rukovalac događajem ukazuje na asinhronu operaciju vraćanjem `true`. Ukoliko nijedan od rukovalaca ne vrati `true` ili ako se funkcija `sendResponse()` ukloni iz memorije (sakupljena smećem), podrazumevano će biti pokrenut povratni poziv povezan sa funkcijom `sendMessage()`.
## Učitavanje proširenja u pregledaču
1. **Preuzmite** Browser Extension & raspakujte
1. **Preuzmite** Browser proširenje i raspakujte ga
2. Idite na **`chrome://extensions/`** i **omogućite** `Developer Mode`
3. Kliknite na dugme **`Load unpacked`**
@ -512,13 +514,13 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### Koristite CRX Viewer ekstenziju
Još jedan praktičan metod je korišćenje Chrome Extension Source Viewer-a, koji je open-source projekat. Može se instalirati sa [Chrome Web prodavnice](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Izvorni kod pregledača je dostupan u njegovom [GitHub repozitorijumu](https://github.com/Rob--W/crxviewer).
Još jedan praktičan metod je korišćenje Chrome Extension Source Viewer, koji je open-source projekat. Može se instalirati sa [Chrome Web prodavnice](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Izvorni kod pregledača je dostupan u njegovom [GitHub repozitorijumu](https://github.com/Rob--W/crxviewer).
### Pregled izvora lokalno instalirane ekstenzije
Chrome ekstenzije instalirane lokalno takođe mogu biti pregledane. Evo kako:
1. Pristupite svom Chrome lokalnom profil direktorijumu posetom `chrome://version/` i pronalaženjem polja "Profile Path".
1. Pristupite vašem Chrome lokalnom profil direktorijumu posetom `chrome://version/` i pronalaženjem polja "Profile Path".
2. Navigirajte do `Extensions/` podfoldera unutar profil direktorijuma.
3. Ovaj folder sadrži sve instalirane ekstenzije, obično sa njihovim izvornim kodom u čitljivom formatu.
@ -529,7 +531,7 @@ Da biste identifikovali ekstenzije, možete mapirati njihove ID-jeve sa imenima:
### Koristite Arhiver ili Dekompresor fajlova
Idite na Chrome Web prodavnicu i preuzmite ekstenziju. Fajl će imati ekstenziju `.crx`. Promenite ekstenziju fajla sa `.crx` na `.zip`. Koristite bilo koji arhiver fajlova (kao što su WinRAR, 7-Zip, itd.) da biste izvukli sadržaj ZIP fajla.
Idite na Chrome Web prodavnicu i preuzmite ekstenziju. Fajl će imati ekstenziju `.crx`. Promenite ekstenziju fajla sa `.crx` na `.zip`. Koristite bilo koji arhiver fajlova (kao što su WinRAR, 7-Zip, itd.) da izvučete sadržaj ZIP fajla.
### Koristite Developer Mode u Chrome-u
@ -541,44 +543,44 @@ Iako Browser ekstenzije imaju **ograničenu površinu napada**, neke od njih mog
* [ ] **Ograničite** što je više moguće tražene **`dozvole`**
* [ ] **Ograničite** što je više moguće **`host_permissions`**
* [ ] Koristite **jaku** **`content_security_policy`**
* [ ] **Ograničite** što je više moguće **`externally_connectable`**, ako nije potrebno i moguće, ne ostavljajte ga po podrazumevanim vrednostima, specificirajte **`{}`**
* [ ] Ako je ovde naveden **URL ranjiv na XSS ili preuzimanje kontrole**, napadač će moći **slati poruke direktno skriptovima pozadine**. Veoma moćan zaobilazak.
* Koristite **jak** **`content_security_policy`**
* [ ] **Ograničite** što je više moguće **`externally_connectable`**, ako nije potrebno i moguće, ne ostavljajte ga podrazumevano, specificirajte **`{}`**
* Ako je **URL ranjiv na XSS ili preuzimanje kontrole** naveden ovde, napadač će moći **slati poruke direktno skriptama pozadine**. Veoma moćan zaobilazak.
* [ ] **Ograničite** što je više moguće **`web_accessible_resources`**, čak i prazno ako je moguće.
* [ ] Ako **`web_accessible_resources`** nije ništa, proverite [**ClickJacking**](browext-clickjacking.md)
* [ ] Ako se vrši bilo kakva **komunikacija** između **ekstenzije** i **veb stranice**, [**proverite XSS**](browext-xss-example.md) **ranjivosti** izazvane u komunikaciji.
* [ ] Ako se koriste Post poruke, proverite [**Post Message ranjivosti**](../postmessage-vulnerabilities/)**.**
* [ ] Ako **Content Script pristupa detaljima DOM-a**, proverite da li oni **ne uvode XSS** ako ih veb **modifikuje**
* [ ] Posebno obratite pažnju ako je ova komunikacija takođe uključena u **komunikaciju Content Script -> Background script**
* [ ] **Osetljive informacije ne bi trebalo da se skladište** unutar koda Browser Ekstenzije
* [ ] **Osetljive informacije ne bi trebalo da se skladište** unutar memorije Browser Ekstenzije
* Ako **`web_accessible_resources`** nije ništa, proverite [**ClickJacking**](browext-clickjacking.md)
* Ako se bilo kakva **komunikacija** dešava između **ekstenzije** i **veb stranice**, [**proverite XSS**](browext-xss-example.md) **ranjivosti** izazvane u komunikaciji.
* Ako se koriste Post poruke, proverite [**Post Message ranjivosti**](../postmessage-vulnerabilities/)**.**
* Ako **Content Script pristupa detaljima DOM-a**, proverite da li oni **ne uvode XSS** ako ih veb **modifikuje**
* Posebno obratite pažnju ako je ova komunikacija takođe uključena u **komunikaciju između Content Script-a i Skripte pozadine**
* **Osetljive informacije ne bi trebalo da se čuvaju** unutar koda Browser Ekstenzije
* **Osetljive informacije ne bi trebalo da se čuvaju** unutar memorije Browser Ekstenzije
## Alati
### [**Tarnish**](https://thehackerblog.com/tarnish/)
* Preuzima bilo koju Chrome ekstenziju sa datog Chrome web prodavnice linka.
* Preuzima bilo koju Chrome ekstenziju sa pruženog linka Chrome web prodavnice.
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **pregledač**: jednostavno prikazuje JSON-oblikovanu verziju manifesta ekstenzije.
* **Analiza otiska prsta**: Detekcija [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatska generacija JavaScript otiska prsta Chrome ekstenzije.
* **Potencijalna analiza Clickjacking-a**: Detekcija HTML stranica ekstenzije sa direktivom [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Ove stranice su potencijalno ranjive na clickjacking u zavisnosti od svrhe stranica.
* **Pregled upozorenja dozvola**: koji prikazuje listu svih upozorenja dozvola Chrome-a koja će biti prikazana prilikom pokušaja korisnika da instalira ekstenziju.
* **Opasne funkcije**: prikazuje lokaciju opasnih funkcija koje bi mogle biti iskorišćene od strane napadača (npr. funkcije kao što su innerHTML, chrome.tabs.executeScript).
* **Ulazne tačke**: prikazuje gde ekstenzija prima korisničke/spoljne ulaze. Ovo je korisno za razumevanje površine ekstenzije i traženje potencijalnih tačaka za slanje zlonamerno kreiranih podataka ekstenziji.
* I skeneri Opasnih funkcija i Ulaznih tačaka imaju sledeće za njihove generisane upozorenja:
* **Analiza otiska prsta**: Detekcija [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatsko generisanje JavaScript otiska prsta Chrome ekstenzije.
* **Analiza potencijalnog Clickjacking-a**: Detekcija HTML stranica ekstenzije sa direktivom [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Ove stranice su potencijalno ranjive na clickjacking u zavisnosti od svrhe stranica.
* **Pregled upozorenja o dozvolama**: koji prikazuje listu svih upozorenja o dozvolama Chrome prozora koje će biti prikazane prilikom pokušaja korisnika da instalira ekstenziju.
* **Opasne funkcije**: prikazuje lokaciju opasnih funkcija koje bi mogle biti iskorišćene od strane napadača (npr. funkcije poput innerHTML, chrome.tabs.executeScript).
* **Ulazne tačke**: prikazuje gde ekstenzija prima korisnički/spoljni unos. Ovo je korisno za razumevanje površine ekstenzije i traženje potencijalnih tačaka za slanje zlonamerno kreiranih podataka ekstenziji.
* Za njihove generisane upozorenja, kako za Opasne funkcije tako i za Ulazne tačke, postoje sledeće informacije:
* Relevantni odlomak koda i linija koja je izazvala upozorenje.
* Opis problema.
* Dugme "Prikaži fajl" za pregled celog izvornog fajla koji sadrži kod.
* Putanja do fajla sa upozorenjem.
* Potpuna URI Chrome ekstenzije fajla sa upozorenjem.
* Putanja do upozorenog fajla.
* Potpuna URI Chrome ekstenzije upozorenog fajla.
* Tip fajla, kao što je skripta pozadine, Content Script, Browser Action, itd.
* Ako je ranjiva linija u JavaScript fajlu, putanje svih stranica gde je uključena kao i status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) ovih stranica.
* **Analizator i provera zaobilaženja Content Security Policy (CSP)**: Ovo će ukazati na slabosti u CSP vaše ekstenzije i takođe osvetliti bilo koje potencijalne načine zaobilaženja vašeg CSP-a zbog belistovanih CDN-ova, itd.
* **Poznate ranjive biblioteke**: Koristi [Retire.js](https://retirejs.github.io/retire.js/) da proveri da li se koristi bilo koja poznata ranjiva JavaScript biblioteka.
* **Analizator i provera zaobilaženja Politike bezbednosti sadržaja (CSP)**: Ovo će ukazati na slabosti u CSP vaše ekstenzije i takođe osvetliti bilo koje potencijalne načine zaobilaženja vašeg CSP-a zbog belih CDN-ova, itd.
* **Poznate ranjive biblioteke**: Koristi [Retire.js](https://retirejs.github.io/retire.js/) da proveri da li se koristi poznate ranjive JavaScript biblioteke.
* Preuzmite ekstenziju i formatirane verzije.
* Preuzmite originalnu ekstenziju.
* Preuzmite prelepljenu verziju ekstenzije (automatski oblikovan HTML i JavaScript).
* Automatsko keširanje rezultata skeniranja, pokretanje skeniranja ekstenzije će trajati dosta vremena prvi put kada ga pokrenete. Međutim, drugi put, pod uslovom da ekstenzija nije ažurirana, biće gotovo trenutno zbog keširanja rezultata.
* Linkabilni URL-ovi izveštaja, lako povežite nekoga sa izveštajem o ekstenziji generisanim od strane tarnish-a.
* Automatsko keširanje rezultata skeniranja, pokretanje skeniranja ekstenzije će trajati prilično dugo prvi put kada ga pokrenete. Međutim, drugi put, pod uslovom da ekstenzija nije ažurirana, biće gotovo trenutno zbog keširanja rezultata.
* Linkabilni URL-ovi izveštaja, lako povežite nekoga sa izveštajem o ekstenziji generisanim od strane tarnish.
### [Neto](https://github.com/elevenpaths/neto)
@ -601,8 +603,8 @@ Projekat Neto je Python 3 paket osmišljen za analizu i otkrivanje skrivenih fun
<summary><strong>Naučite hakovanje AWS-a od nule do heroja sa</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Drugi načini podrške HackTricks-a:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks** ili da **preuzmete HackTricks u PDF formatu** proverite [**PLANOVE ZA PRIJEM**](https://github.com/sponsors/carlospolop)!
Druge načine podrške HackTricks-a:
* Ako želite da vidite svoju **kompaniju reklamiranu na HackTricks** 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 [**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)**.**