diff --git a/.gitbook/assets/image (1235).png b/.gitbook/assets/image (1235).png new file mode 100644 index 000000000..3fda80ffc Binary files /dev/null and b/.gitbook/assets/image (1235).png differ diff --git a/pentesting-web/browser-extension-pentesting-methodology/README.md b/pentesting-web/browser-extension-pentesting-methodology/README.md index 8f9a13102..1709e7652 100644 --- a/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -2,7 +2,7 @@
-Zacznij od zera i stań się ekspertem od hakowania AWS dzięki htARTE (HackTricks AWS Red Team Expert)! +Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)! 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); ```
-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:
@@ -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**:
-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.