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

This commit is contained in:
Translator 2024-04-19 00:32:56 +00:00
parent 73ca6eb86f
commit 37a6761612
2 changed files with 71 additions and 69 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View file

@ -2,7 +2,7 @@
<details>
<summary><strong>Zacznij od zera i stań się ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
Inne sposoby wsparcia HackTricks:
@ -30,25 +30,25 @@ Każdy skrypt zawartości ma bezpośredni dostęp do DOM **jednej strony interne
### **Rdzeń rozszerzenia**
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu rozszerzenia, ale rdzeń rozszerzenia może współdziałać z zawartością internetową tylko za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny hosta.
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu do rozszerzenia, ale rdzeń rozszerzenia może współdziałać z zawartością internetową tylko za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny docelowej.
### **Binarny natywny**
Rozszerzenie pozwala na binarny plik natywny, który może **uzyskać dostęp do maszyny hosta z pełnymi uprawnieniami użytkownika**. Binarny plik natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programowania aplikacji wtyczek Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarki.
Rozszerzenie pozwala na binarny natywny, który może **uzyskać dostęp do maszyny docelowej z pełnymi uprawnieniami użytkownika**. Binarny natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programowania aplikacji wtyczek Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarkowe.
### Granice
{% hint style="danger" %}
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do binarnego pliku natywnego.
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do binarnego natywnego.
{% endhint %}
Każdy składnik rozszerzenia jest odseparowany od siebie za pomocą **silnych granic ochronnych**. Każdy składnik działa w **oddzielnym procesie systemu operacyjnego**. Skrypty zawartości i rdzenie rozszerzeń działają w **procesach piaskownicy** niedostępnych dla większości usług systemu operacyjnego.
Co więcej, skrypty zawartości oddzielone są od powiązanych stron internetowych poprzez **działanie w oddzielnej stercie JavaScript**. Skrypt zawartości i strona internetowa mają **dostęp do tego samego DOM**, ale **nigdy nie wymieniają wskaźników JavaScript**, co zapobiega wyciekowi funkcjonalności JavaScript.
Co więcej, skrypty zawartości oddzielone są od powiązanych stron internetowych poprzez **działanie w oddzielnej stercie JavaScript**. Skrypt zawartości i strona internetowa mają **dostęp do tego samego DOM**, ale **nigdy nie wymieniają ze sobą wskaźników JavaScript**, co zapobiega wyciekowi funkcjonalności JavaScript.
## **`manifest.json`**
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeń rozszerzenia to plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracyjne.
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeniem rozszerzenia jest plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracji.
Przykład:
```json
@ -83,7 +83,7 @@ Przykład:
```
### `content_scripts`
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do wyrażenia **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do regexu **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
```json
"content_scripts": [
{
@ -115,24 +115,24 @@ document.body.appendChild(div);
```
<figure><img src="../../.gitbook/assets/image (20).png" alt=""><figcaption></figcaption></figure>
Po kliknięciu tego przycisku skrypt zawartości wysyła wiadomość do stron rozszerzenia za pomocą [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu zawartości w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty zawartości mogą się komunikować.
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści po kliknięciu tego przycisku, poprzez wykorzystanie [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą komunikować się.
{% hint style="warning" %}
W zależności od przeglądarki, możliwości skryptu zawartości mogą się nieznacznie różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefoksa, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło informacji.\
Warto również zauważyć, że skrypty zawartości mają zdolność do komunikacji z skryptami tła, umożliwiając im wykonywanie działań i przekazywanie odpowiedzi.
W zależności od przeglądarki, możliwości skryptu treści mogą nieznacznie się różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji deweloperów Chrome'a](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefoksa, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło informacji.\
Warto również zauważyć, że skrypty treści mają zdolność komunikowania się z skryptami tła, umożliwiając im wykonywanie działań i przekazywanie odpowiedzi.
{% endhint %}
Aby wyświetlić i debugować skrypty zawartości w Chrome, menu narzędzi deweloperskich Chrome można uzyskać, przechodząc do Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB naciskając Ctrl + Shift + I.
Aby wyświetlić i debugować skrypty treści w Chrome, menu narzędzi deweloperskich Chrome'a można otworzyć z pozycji Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB poprzez naciśnięcie Ctrl + Shift + I.
Po wyświetleniu narzędzi deweloperskich, należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty zawartości**. Pozwala to na obserwację działających skryptów zawartości z różnych rozszerzeń oraz ustawianie punktów przerwania w celu śledzenia przepływu wykonania.
Po wyświetleniu narzędzi deweloperskich, należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty treści**. Pozwala to na obserwację działających skryptów treści z różnych rozszerzeń oraz ustawianie punktów przerwania w celu śledzenia przepływu wykonania.
### Wstrzyknięte skrypty zawartości
### Wstrzyknięte skrypty treści
{% hint style="success" %}
Zauważ, że **Skrypty zawartości nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego** **wstrzykiwania** skryptów i **programowego wstrzykiwania** ich na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
Zauważ, że **Skrypty treści nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego wstrzykiwania** skryptów i **programowego wstrzykiwania** ich na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
{% endhint %}
Aby programowo wstrzyknąć skrypt zawartości, konieczne jest, aby rozszerzenie miało [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, do której mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo za pomocą [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
Dla programowego wstrzykiwania skryptu treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, na którą mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo poprzez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
#### Przykładowe rozszerzenie oparte na activeTab
@ -205,9 +205,9 @@ Możliwe wartości to:
* **`document_idle`**: Kiedykolwiek to możliwe
* **`document_start`**: Po plikach z `css`, ale przed zbudowaniem jakiegokolwiek innego DOM lub uruchomieniem jakiegokolwiek innego skryptu.
* **`document_end`**: Natychmiast po zakończeniu budowy DOM, ale przed załadowaniem zasobów podrzędnych, takich jak obrazy i ramki.
* **`document_end`**: Bezpośrednio po zakończeniu budowy DOM, ale przed załadowaniem zasobów podrzędnych, takich jak obrazy i ramki.
#### Przez `manifest.json`
#### Za pomocą `manifest.json`
```json
{
"name": "My extension",
@ -234,16 +234,16 @@ js : [ "contentScript.js" ],
```
### `tło`
Wiadomości wysyłane przez skrypty zawartości są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Strona tła utrzymuje się przez cały okres istnienia rozszerzenia, działa dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający kompleksowe interakcje i zarządzanie stanem.
Wiadomości wysłane przez skrypty treści są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Warto zauważyć, że strona tła pozostaje aktywna przez cały czas działania rozszerzenia, działa dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający złożone interakcje i zarządzanie stanem.
**Kluczowe punkty**:
* **Rola Strony Tła:** Działa jako centrum nerwowe rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
* **Trwałość:** Jest to zawsze obecna jednostka, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemową pracę zadań tła rozszerzenia.
* **Trwałość:** Jest to obecna zawsze jednostka, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemowe działanie zadań tła rozszerzenia.
{% hint style="success" %}
Wygodę zapewnianą przez przeglądarkę poprzez automatyczne generowanie strony tła (gdy nie jest jawnie zadeklarowana) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działają, usprawniając proces konfiguracji rozszerzenia.
Wygodę zapewnianą przez przeglądarkę poprzez automatyczne generowanie strony tła (gdy nie jest jawnie zadeklarowane) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działają, usprawniając proces konfiguracji rozszerzenia.
{% endhint %}
Przykładowy skrypt tła:
@ -256,9 +256,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
}
})
```
Wykorzystuje [API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage), aby nasłuchiwać wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs), aby otworzyć stronę w nowej karcie.
Wykorzystuje [interfejs API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage), aby nasłuchiwać wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [interfejsu API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs), aby otworzyć stronę w nowej karcie.
Aby debugować skrypt tła, przejdź do **szczegółów rozszerzenia i zbadaj serwis workera**, co otworzy narzędzia deweloperskie z skryptem tła:
Aby debugować skrypt tła, możesz przejść do **szczegółów rozszerzenia i sprawdzić serwis workera**, co otworzy narzędzia deweloperskie z skryptem tła:
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
@ -275,7 +275,7 @@ Rozszerzenia przeglądarki mogą zawierać różne rodzaje stron:
Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ładowane są treści w razie potrzeby. Mimo to, dzielą pewne możliwości z stroną tła:
* **Komunikacja z skryptami zawartości:** Podobnie jak strona tła, te strony mogą otrzymywać wiadomości od skryptów zawartości, ułatwiając interakcję wewnątrz rozszerzenia.
* **Dostęp do API specyficznych dla rozszerzenia:** Te strony mają pełny dostęp do API specyficznych dla rozszerzenia, zgodnie z uprawnieniami zdefiniowanymi dla rozszerzenia.
* **Dostęp do interfejsów API specyficznych dla rozszerzenia:** Te strony mają pełny dostęp do interfejsów API specyficznych dla rozszerzenia, zgodnie z uprawnieniami zdefiniowanymi dla rozszerzenia.
### `permissions` i `host_permissions`
@ -283,7 +283,7 @@ Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ł
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogą umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika**.
Sprawdź, jak działają te ustawienia i jak mogą być wykorzystane w:
Sprawdź, jak działają te ustawienia i jak mogą być nadużywane w:
{% content-ref url="browext-permissions-and-host_permissions.md" %}
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
@ -297,7 +297,7 @@ Domyślne ustawienie dla stron rozszerzenia przeglądarki jest raczej restrykcyj
```bash
script-src 'self'; object-src 'self';
```
Dla więcej informacji na temat CSP i potencjalnych bypassów sprawdź:
Aby uzyskać więcej informacji na temat CSP i potencjalnych obejść, sprawdź:
{% content-ref url="../content-security-policy-csp-bypass/" %}
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
@ -305,7 +305,7 @@ Dla więcej informacji na temat CSP i potencjalnych bypassów sprawdź:
### `web_accessible_resources`
aby strona internetowa mogła uzyskać dostęp do strony Rozszerzenia Przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
Aby strona internetowa mogła uzyskać dostęp do strony rozszerzenia przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
Na przykład:
```javascript
{
@ -331,16 +331,16 @@ W publicznych rozszerzeniach **identyfikator rozszerzenia jest dostępny**:
<figure><img src="../../.gitbook/assets/image (1191).png" alt="" width="375"><figcaption></figcaption></figure>
Jednakże, jeśli używany jest parametr `manifest.json` **`use_dynamic_url`**, ten **identyfikator może być dynamiczny**.
Jednakże, jeśli parametr `manifest.json` **`use_dynamic_url`** jest używany, to **ten identyfikator może być dynamiczny**.
Zezwolenie na dostęp do tych stron sprawia, że są one **potencjalnie podatne na ataki ClickJacking**:
Zezwolenie na dostęp do tych stron sprawia, że strony te są **potencjalnie podatne na ataki ClickJacking**:
{% content-ref url="browext-clickjacking.md" %}
[browext-clickjacking.md](browext-clickjacking.md)
{% endcontent-ref %}
{% hint style="success" %}
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom CLickJacking.
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom typu CLickJacking.
{% endhint %}
### `externally_connectable`
@ -360,18 +360,18 @@ Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/refer
Im mniej rozszerzeń i adresów URL wskazanych tutaj, tym mniejsza będzie powierzchnia ataku.
{% hint style="danger" %}
Jeśli strona internetowa podatna na XSS lub przejęcie jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
Jeśli strona internetowa **podatna na XSS lub przejęcie** jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
Dlatego jest to **bardzo potężne obejście**.
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie jest ono zezwolone na komunikację z podatnym rozszerzeniem, może wstrzyknąć dane XSS na dozwolonej stronie internetowej lub nadużyć interfejsów API **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na domenie docelowej, zmieniając żądanie strony dla pliku **JavaScript**. (Należy zauważyć, że CSP na stronie docelowej może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie ma zezwolenia na komunikację z podatnym rozszerzeniem, może wstrzyknąć **dane XSS na dozwolonej stronie internetowej** lub nadużyć interfejsów API **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na docelową domenę zmieniając żądanie strony dla **pliku JavaScript**. (Należy zauważyć, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
{% endhint %}
##
## Komunikacja między Skryptem Zawartości a stroną internetową
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Model Obiektu Dokumentu (DOM)** strony, wspólnego zasobu. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM**, który jest dostępny dla obu stron jako kanał komunikacji.
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Model Obiektu Dokumentu (DOM)** strony, wspólnego zasobu. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM** dostępnego dla obu stron jako kanału komunikacji.
### Wiadomości Post
@ -408,9 +408,9 @@ Bezpieczna komunikacja Post Message powinna sprawdzać autentyczność otrzymane
* Skrypt zawartości może oczekiwać wiadomości tylko wtedy, gdy użytkownik wykonuje jakąś akcję.
* **Domena pochodzenia**: może oczekiwać wiadomości tylko z listy zaufanych domen.
* Jeśli używany jest regex, należy być bardzo ostrożnym.
* **Źródło**: `received_message.source !== window` można użyć do sprawdzenia, czy wiadomość pochodzi **z tego samego okna**, w którym nasłuchuje Skrypt Zawartości.
* **Źródło**: `received_message.source !== window` można użyć do sprawdzenia, czy wiadomość pochodziła **z tego samego okna**, w którym nasłuchuje Skrypt Zawartości.
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, więc sprawdź na następnej stronie **potencjalne sposoby obejścia Post Message**:
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne, dlatego sprawdź na następnej stronie **potencjalne sposoby obchodzenia Post Message**:
{% content-ref url="../postmessage-vulnerabilities/" %}
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
@ -418,7 +418,7 @@ Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, wię
### Iframe
Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe URLs)**, przykład można znaleźć w:
Inną możliwą drogą komunikacji może być poprzez **adresy URL Iframe**, przykład można znaleźć w:
{% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md)
@ -426,9 +426,9 @@ Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe
### DOM
To nie jest "dokładnie" sposób komunikacji, ale **strona internetowa i skrypt zawartości będą miały dostęp do DOM strony internetowej**. Dlatego jeśli **skrypt zawartości** odczytuje jakieś informacje z niego, **ufając DOM-owi strony internetowej**, strona internetowa mogłaby **zmodyfikować te dane** (ponieważ strona internetowa nie powinna być ufała, lub ponieważ strona internetowa jest podatna na XSS) i **narażać Skrypt Zawartości**.
To nie jest "dokładnie" sposób komunikacji, ale **strona internetowa i skrypt zawartości będą miały dostęp do DOM**. Dlatego jeśli **skrypt zawartości** odczytuje jakieś informacje z niego, **ufając DOM-owi strony**, strona internetowa mogłaby **zmodyfikować te dane** (ponieważ strona internetowa nie powinna być ufała, lub ponieważ strona internetowa jest podatna na XSS) i **naruszyć Skrypt Zawartości**.
Można również znaleźć przykład **opartego na DOM XSS w celu naruszenia rozszerzenia przeglądarki** w:
Można również znaleźć przykład **DOM opartego XSS do naruszenia rozszerzenia przeglądarki** w:
{% content-ref url="browext-xss-example.md" %}
[browext-xss-example.md](browext-xss-example.md)
@ -436,19 +436,21 @@ Można również znaleźć przykład **opartego na DOM XSS w celu naruszenia roz
## Wrażliwe Informacje w Pamięci/Kodzie
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one zostać **wydobyte** (szczególnie na maszynach z systemem Windows) i **przeszukane** w poszukiwaniu tych informacji.
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one zostać **wydobyte** (szczególnie w systemach Windows) i **przeszukane** w poszukiwaniu tych informacji.
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną**, a **wrażliwe informacje** takie jak dane uwierzytelniające czy frazy mnemoniczne **nie powinny być przechowywane**.
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą one **publiczne**.
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą **publiczne**.
Aby wydobyć pamięć z przeglądarki, można **wydobyć pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki i kliknąć **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Zrób zrzut`** i użyć **`CTRL+F`** do wyszukiwania wewnątrz zrzutu wrażliwych informacji.
## Komunikacja Skryptu Zawartości **↔︎** Skryptu Tła
Skrypt Zawartości może użyć funkcji [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **lub** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) do wysłania **jednorazowej wiadomości serializowalnej w formacie JSON**.
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Chociaż, dla zachowania kompatybilności wstecznej, nadal można przekazać **wywołanie zwrotne** jako ostatni argument.
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Choć, dla zachowania wstecznej kompatybilności, nadal można przekazać **callback** jako ostatni argument.
Wysłanie żądania z **skryptu zawartości** wygląda następująco:
Wysłanie żądania z **skryptu zawartości** wygląda tak:
```javascript
(async () => {
const response = await chrome.runtime.sendMessage({greeting: "hello"});
@ -456,7 +458,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"});
console.log(response);
})();
```
Wysyłanie żądania z **rozszerzenia** (zwykle z **skryptu tła**) Skrypt zawartości może korzystać z funkcji, z wyjątkiem konieczności określenia, do którego karty ma zostać wysłane. Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
Wysyłanie żądania z **rozszerzenia** (zwykle skryptu **tła**) Skrypt zawartości może korzystać z funkcji, z wyjątkiem konieczności określenia, do którego karty ma zostać wysłane. Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
```javascript
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
(async () => {
@ -466,7 +468,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
console.log(response);
})();
```
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treścią skryptu, jak i z stroną rozszerzenia.
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treści skryptu, jak i strony rozszerzenia.
```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener(
@ -479,16 +481,16 @@ sendResponse({farewell: "goodbye"});
}
);
```
W podanym przykładzie **`sendResponse()`** zostało wykonane synchronicznie. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest dodanie `return true;`.
W podanym przykładzie **`sendResponse()`** zostało wykonane w sposób synchroniczny. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest uwzględnienie `return true;`.
Ważnym aspektem jest to, że w przypadkach, gdy wiele stron jest ustawionych do odbierania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną skutecznie dostarczyć odpowiedź. Wszelkie kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
Ważnym rozważeniem jest, że w scenariuszach, gdzie wiele stron jest ustawionych do otrzymywania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną skutecznie dostarczyć odpowiedź. Wszelkie następne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
Podczas tworzenia nowych rozszerzeń, należy preferować obietnice (promises) zamiast wywołań zwrotnych. W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), wywołany zostanie domyślnie zwrotny wywołanie związane z funkcją `sendMessage()`.
Podczas tworzenia nowych rozszerzeń, należy preferować obietnice (promises) w przeciwieństwie do wywołań zwrotnych (callbacks). W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), wywołany zostanie domyślnie zwrotny wywołanie związane z funkcją `sendMessage()`.
## Ładowanie rozszerzenia w przeglądarce
1. **Pobierz** rozszerzenie przeglądarki i rozpakuj
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb programisty`
1. **Pobierz** Rozszerzenie Przeglądarki & rozpakuj
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb Dewelopera`
3. Kliknij przycisk **`Załaduj rozpakowane`**
W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i kliknij przycisk **`Załaduj tymczasowe rozszerzenie`**.
@ -497,7 +499,7 @@ W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i klikni
Kod źródłowy rozszerzenia Chrome można uzyskać za pomocą różnych metod. Poniżej znajdują się szczegółowe wyjaśnienia i instrukcje dla każdej opcji.
### Pobieranie rozszerzenia jako ZIP za pomocą wiersza poleceń
### Pobierz rozszerzenie jako ZIP za pomocą wiersza poleceń
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie rozpakowania zawartości pliku ZIP do katalogu. Oto kroki:
@ -514,20 +516,20 @@ unzip -d "$extension_id-source" "$extension_id.zip"
### Użyj rozszerzenia CRX Viewer
Inną wygodną metodą jest użycie przeglądarki Chrome Extension Source Viewer, który jest projektem open-source. Można go zainstalować ze [Sklepu Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
Inną wygodną metodą jest korzystanie z przeglądarki Chrome Extension Source Viewer, która jest projektem open-source. Można ją zainstalować ze [Sklepu Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
### Wyświetl źródło lokalnie zainstalowanego rozszerzenia
Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak:
1. Otwórz katalog profilu lokalnego Chrome, odwiedzając `chrome://version/` i zlokalizuj pole "Profile Path".
1. Otwórz katalog profilu lokalnego Chrome, odwiedzając `chrome://version/` i zlokalizuj pole "Ścieżka profilu".
2. Przejdź do podfolderu `Extensions/` w katalogu profilu.
3. Ten folder zawiera wszystkie zainstalowane rozszerzenia, zazwyczaj z kodem źródłowym w czytelnej formie.
Aby zidentyfikować rozszerzenia, można przyporządkować ich identyfikatory do nazw:
* Włącz tryb dewelopera na stronie `about:extensions`, aby zobaczyć identyfikatory każdego rozszerzenia.
* W każdym folderze rozszerzenia plik `manifest.json` zawiera czytelną wartość pola `name`, co pomaga zidentyfikować rozszerzenie.
* Wewnątrz folderu każdego rozszerzenia plik `manifest.json` zawiera czytelną sekcję `name`, co ułatwia identyfikację rozszerzenia.
### Użyj Archiwizatora lub Odpakowywacza plików
@ -545,42 +547,42 @@ Mimo że rozszerzenia przeglądarki mają **ograniczoną powierzchnię ataku**,
* [ ] **Ograniczaj** jak najbardziej **`host_permissions`**
* Użyj **silnej** **`content_security_policy`**
* [ ] **Ograniczaj** jak najbardziej **`externally_connectable`**, jeśli nie jest to potrzebne i możliwe, nie pozostawiaj go domyślnie, określ **`{}`**
* [ ] Jeśli tutaj wymieniony jest **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów tła**. Bardzo potężne obejście.
* [ ] Jeśli tutaj wymieniony jest **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów w tle**. Bardzo potężne obejście.
* [ ] **Ograniczaj** jak najbardziej **`web_accessible_resources`**, nawet jeśli jest puste, jeśli to możliwe.
* [ ] Jeśli **`web_accessible_resources`** nie jest puste, sprawdź [**ClickJacking**](browext-clickjacking.md)
* [ ] Jeśli zachodzi jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, sprawdź **podatności na XSS** spowodowane w komunikacji.
* [ ] Jeśli są używane Post Messages, sprawdź [**podatności na Post Message**](../postmessage-vulnerabilities/)**.**
* [ ] Jeśli zachodzi jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, [**sprawdź pod kątem XSS**](browext-xss-example.md) **podatności** wynikających z komunikacji.
* [ ] Jeśli są używane Post Messages, sprawdź [**podatności Post Message**](../postmessage-vulnerabilities/)**.**
* [ ] Jeśli **Skrypt zawartości uzyskuje dostęp do szczegółów DOM**, sprawdź, czy nie wprowadzają one XSS, jeśli zostaną **zmodyfikowane** przez stronę internetową
* [ ] Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skrypt tła**
* [ ] **Informacje poufne nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
* [ ] **Informacje poufne nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
* [ ] Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skryptu w tle**
* **Wrażliwe informacje nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
* **Wrażliwe informacje nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
## Narzędzia
### [**Tarnish**](https://thehackerblog.com/tarnish/)
* Pobiera dowolne rozszerzenie Chrome z podanego linku ze Sklepu Chrome.
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: po prostu wyświetla sformatowaną w JSON wersję manifestu rozszerzenia.
* Przeglądarka [**manifest.json**](https://developer.chrome.com/extensions/manifest): po prostu wyświetla sformatowaną w JSON wersję manifestu rozszerzenia.
* Analiza odcisku palca: Wykrywanie [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatyczna generacja JavaScriptu do odcisku palca rozszerzenia Chrome.
* Analiza potencjalnego Clickjackingu: Wykrywanie stron HTML rozszerzenia z dyrektywą [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Są one potencjalnie podatne na clickjacking w zależności od celu stron.
* Przeglądarka ostrzeżeń o uprawnieniach: pokazuje listę wszystkich ostrzeżeń dotyczących uprawnień Chrome, które zostaną wyświetlone podczas próby instalacji rozszerzenia przez użytkownika.
* **Funkcje niebezpieczne**: pokazuje lokalizację funkcji niebezpiecznych, które potencjalnie mogą zostać wykorzystane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane od użytkownika/zewnętrzne. Jest to przydatne do zrozumienia obszaru powierzchni ataku rozszerzenia i poszukiwania potencjalnych punktów do przesłania złośliwie spreparowanych danych do rozszerzenia.
* **Funkcje niebezpieczne**: pokazuje lokalizację funkcji niebezpiecznych, które potencjalnie mogą być wykorzystane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane od użytkownika/zewnętrzne dane. Jest to przydatne do zrozumienia obszaru powierzchni ataku rozszerzenia i poszukiwania potencjalnych punktów do przesyłania złośliwie spreparowanych danych do rozszerzenia.
* Zarówno skanery Funkcji niebezpiecznych, jak i Punkty wejścia mają następujące elementy dla wygenerowanych alertów:
* Istotny fragment kodu i linia, która spowodowała alert.
* Opis problemu.
* Przycisk „Wyświetl plik”, aby zobaczyć pełny plik źródłowy zawierający kod.
* Ścieżka pliku, który wywołał alert.
* Pełny URI rozszerzenia Chrome pliku, który wywołał alert.
* Typ pliku, taki jak skrypt strony tła, skrypt zawartości, akcja przeglądarki, itp.
* Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, gdzie jest ona zawarta, oraz status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) tych stron.
* **Analizator i sprawdzarka polityki bezpieczeństwa zawartości (CSP)**: Wskaże słabe punkty w polityce CSP Twojego rozszerzenia i oświetli potencjalne sposoby na jej obejście z powodu zatwierdzonych na biało CDN itp.
* **Znane biblioteki podatne na ataki**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane biblioteki JavaScript podatne na ataki.
* Typ pliku, taki jak skrypt strony w tle, skrypt zawartości, akcja przeglądarki, itp.
* Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, gdzie jest ona zawarta, oraz status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible_resources).
* **Analizator zasad bezpieczeństwa zawartości (CSP) i sprawdzarka bypass**: Wskaże słabe punkty w zasadach CSP Twojego rozszerzenia oraz oświetli potencjalne sposoby na obejście CSP z powodu zatwierdzonych na białej liście CDN itp.
* **Znane biblioteki podatne**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane biblioteki JavaScript podatne na ataki.
* Pobierz rozszerzenie i sformatowane wersje.
* Pobierz oryginalne rozszerzenie.
* Pobierz sformatowaną wersję rozszerzenia (automatycznie sformatowany HTML i JavaScript).
* Automatyczne buforowanie wyników skanowania, pierwsze uruchomienie skanowania rozszerzenia zajmie sporo czasu. Jednak drugie uruchomienie, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe dzięki buforowaniu wyników.
* Linkowalne adresy URL raportów, łatwe przekazanie komuś innemu raportu o rozszerzeniu wygenerowanego przez tarnish.
* Automatyczne buforowanie wyników skanowania, uruchomienie skanowania rozszerzenia zajmie sporo czasu za pierwszym razem. Jednak drugi raz, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe dzięki buforowaniu wyników.
* Linkowalne adresy URL raportów, łatwo przekieruj kogoś do raportu rozszerzenia wygenerowanego przez tarnish.
### [Neto](https://github.com/elevenpaths/neto)
@ -606,7 +608,7 @@ Projekt Neto to pakiet Python 3 stworzony do analizy i odkrywania ukrytych funkc
Inne sposoby wsparcia HackTricks:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFTów**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.