mirror of
https://github.com/carlospolop/hacktricks
synced 2025-02-16 22:18:27 +00:00
Translated ['pentesting-web/browser-extension-pentesting-methodology/REA
This commit is contained in:
parent
68c2c51b36
commit
378dddfecb
2 changed files with 73 additions and 106 deletions
BIN
.gitbook/assets/image (1235).png
Normal file
BIN
.gitbook/assets/image (1235).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
|
@ -1,28 +1,28 @@
|
|||
# Browser Extension Pentesting Methodology
|
||||
# Metodologia di Pentesting delle Estensioni del Browser
|
||||
|
||||
<details>
|
||||
|
||||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (Esperto Red Team AWS di HackTricks)</strong></a><strong>!</strong></summary>
|
||||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata in HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** Controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di [**NFT esclusivi**](https://opensea.io/collection/the-peass-family)
|
||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
|
||||
* **Condividi i tuoi trucchi di hacking inviando PR a** [**HackTricks**](https://github.com/carlospolop/hacktricks) e [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repos di github.
|
||||
|
||||
</details>
|
||||
|
||||
## Informazioni di Base
|
||||
|
||||
Le estensioni del browser sono scritte in JavaScript e caricate dal browser in background. Hanno il loro [DOM](https://www.w3schools.com/js/js\_htmldom.asp) ma possono interagire con i DOM di altri siti. Ciò significa che potrebbero compromettere la riservatezza, l'integrità e la disponibilità di altri siti (CIA).
|
||||
Le estensioni del browser sono scritte in JavaScript e caricate dal browser in background. Hanno il loro [DOM](https://www.w3schools.com/js/js\_htmldom.asp) ma possono interagire con i DOM di altri siti. Ciò significa che potrebbero compromettere la confidenzialità, l'integrità e la disponibilità di altri siti (CIA).
|
||||
|
||||
## Componenti Principali
|
||||
|
||||
I layout delle estensioni appaiono migliori quando visualizzati e sono composti da tre componenti. Esaminiamo ogni componente in dettaglio.
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (4) (1).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (13).png" alt=""><figcaption><p><a href="http://webblaze.cs.berkeley.edu/papers/Extensions.pdf">http://webblaze.cs.berkeley.edu/papers/Extensions.pdf</a></p></figcaption></figure>
|
||||
|
||||
### **Script di Contenuto**
|
||||
|
||||
|
@ -51,7 +51,6 @@ Inoltre, gli script di contenuto sono separati dalle rispettive pagine web da **
|
|||
Un'estensione Chrome è semplicemente una cartella ZIP con estensione file [.crx](https://www.lifewire.com/crx-file-2620391). Il core dell'estensione è il file **`manifest.json`** nella radice della cartella, che specifica layout, autorizzazioni e altre opzioni di configurazione.
|
||||
|
||||
Esempio:
|
||||
|
||||
```json
|
||||
{
|
||||
"manifest_version": 2,
|
||||
|
@ -82,11 +81,9 @@ Esempio:
|
|||
}
|
||||
}
|
||||
```
|
||||
|
||||
### `content_scripts`
|
||||
|
||||
I content scripts vengono **caricati** ogni volta che l'utente **naviga su una pagina corrispondente**, nel nostro caso su qualsiasi pagina che corrisponda all'espressione **`https://example.com/*`** e non corrisponda alla regex **`*://*/*/business*`**. Eseguono **come gli script della pagina stessa** e hanno accesso arbitrario al [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model) della pagina.
|
||||
|
||||
I content scripts vengono **caricati** ogni volta che l'utente **naviga su una pagina corrispondente**, nel nostro caso su qualsiasi pagina corrispondente all'espressione **`https://example.com/*`** e non corrispondente al regex **`*://*/*/business*`**. Eseguono **come gli script della pagina stessa** e hanno accesso arbitrario al [Document Object Model (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document\_Object\_Model).
|
||||
```json
|
||||
"content_scripts": [
|
||||
{
|
||||
|
@ -101,11 +98,9 @@ I content scripts vengono **caricati** ogni volta che l'utente **naviga su una p
|
|||
}
|
||||
],
|
||||
```
|
||||
|
||||
Per includere o escludere ulteriori URL, è anche possibile utilizzare **`include_globs`** e **`exclude_globs`**.
|
||||
Per includere o escludere ulteriori URL è anche possibile utilizzare **`include_globs`** e **`exclude_globs`**.
|
||||
|
||||
Questo è un esempio di script di contenuto che aggiungerà un pulsante di spiegazione alla pagina quando [l'API di storage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/storage) per recuperare il valore `message` dallo storage dell'estensione.
|
||||
|
||||
```js
|
||||
chrome.storage.local.get("message", result =>
|
||||
{
|
||||
|
@ -118,27 +113,26 @@ chrome.runtime.sendMessage("explain");
|
|||
document.body.appendChild(div);
|
||||
});
|
||||
```
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (7).png" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (20).png" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
Un messaggio viene inviato alle pagine dell'estensione dallo script di contenuto quando viene cliccato questo pulsante, attraverso l'utilizzo dell'[**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Ciò è dovuto alla limitazione dello script di contenuto nell'accesso diretto alle API, con `storage` tra le poche eccezioni. Per funzionalità al di là di queste eccezioni, vengono inviati messaggi alle pagine dell'estensione con cui gli script di contenuto possono comunicare.
|
||||
|
||||
{% hint style="warning" %}
|
||||
A seconda del browser, le capacità dello script di contenuto possono variare leggermente. Per i browser basati su Chromium, l'elenco delle capacità è disponibile nella [documentazione degli sviluppatori di Chrome](https://developer.chrome.com/docs/extensions/mv3/content\_scripts/#capabilities), e per Firefox, il [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content\_scripts#webextension\_apis) serve come fonte primaria.\
|
||||
A seconda del browser, le capacità dello script di contenuto possono variare leggermente. Per i browser basati su Chromium, l'elenco delle capacità è disponibile nella [documentazione per sviluppatori di Chrome](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), e per Firefox, il [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) funge da fonte primaria.\
|
||||
È inoltre importante notare che gli script di contenuto hanno la capacità di comunicare con gli script di background, consentendo loro di eseguire azioni e trasmettere risposte.
|
||||
{% endhint %}
|
||||
|
||||
Per visualizzare e eseguire il debug degli script di contenuto in Chrome, il menu degli strumenti per sviluppatori di Chrome può essere accessibile da Opzioni > Altri strumenti > Strumenti per sviluppatori OPPURE premendo Ctrl + Shift + I.
|
||||
Per visualizzare e eseguire il debug degli script di contenuto in Chrome, è possibile accedere al menu degli strumenti per sviluppatori di Chrome da Opzioni > Altri strumenti > Strumenti per sviluppatori O premendo Ctrl + Shift + I.
|
||||
|
||||
Una volta visualizzati gli strumenti per sviluppatori, è necessario fare clic sulla scheda **Sorgente**, seguita dalla scheda **Script di contenuto**. Ciò consente di osservare gli script di contenuto in esecuzione da varie estensioni e di impostare i punti di interruzione per tracciare il flusso di esecuzione.
|
||||
Una volta visualizzati gli strumenti per sviluppatori, è necessario fare clic sulla scheda **Sorgente**, seguita dalla scheda **Script di contenuto**. Ciò consente di osservare gli script di contenuto in esecuzione da varie estensioni e impostare i punti di interruzione per tracciare il flusso di esecuzione.
|
||||
|
||||
### Script di contenuto iniettati
|
||||
|
||||
{% hint style="success" %}
|
||||
Si noti che **gli script di contenuto non sono obbligatori** poiché è anche possibile **iniettare dinamicamente** **script** e **iniettarli programmaticamente** nelle pagine web tramite **`tabs.executeScript`**. Questo fornisce effettivamente un maggiore **controllo granulare**.
|
||||
Si noti che **gli script di contenuto non sono obbligatori** poiché è anche possibile **iniettare dinamicamente** script e **iniettarli programmaticamente** nelle pagine web tramite **`tabs.executeScript`**. Questo fornisce effettivamente un controllo più **granulare**.
|
||||
{% endhint %}
|
||||
|
||||
Per l'iniezione programmatica di uno script di contenuto, è necessario che l'estensione abbia le [autorizzazioni dell'host](https://developer.chrome.com/docs/extensions/reference/permissions) per la pagina in cui gli script devono essere iniettati. Queste autorizzazioni possono essere garantite sia richiedendole all'interno del manifesto dell'estensione che su base temporanea tramite [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
Per l'iniezione programmatica di uno script di contenuto, è necessario che l'estensione abbia i [permessi dell'host](https://developer.chrome.com/docs/extensions/reference/permissions) per la pagina in cui gli script devono essere iniettati. Questi permessi possono essere garantiti sia richiedendoli nel manifesto dell'estensione che su base temporanea tramite [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||
|
||||
#### Esempio di estensione basata su activeTab
|
||||
|
||||
|
@ -162,7 +156,6 @@ Per l'iniezione programmatica di uno script di contenuto, è necessario che l'es
|
|||
{% endcode %}
|
||||
|
||||
* **Iniettare un file JS al clic:**
|
||||
|
||||
```javascript
|
||||
// content-script.js
|
||||
document.body.style.backgroundColor = "orange";
|
||||
|
@ -175,9 +168,7 @@ files: ["content-script.js"]
|
|||
});
|
||||
});
|
||||
```
|
||||
|
||||
* **Iniettare una funzione** al click:
|
||||
|
||||
```javascript
|
||||
//service-worker.js - Inject a function
|
||||
function injectedFunction() {
|
||||
|
@ -191,9 +182,7 @@ func : injectedFunction,
|
|||
});
|
||||
});
|
||||
```
|
||||
|
||||
#### Esempio con autorizzazioni di scripting
|
||||
|
||||
```javascript
|
||||
// service-workser.js
|
||||
chrome.scripting.registerContentScripts([{
|
||||
|
@ -206,7 +195,6 @@ js : [ "contentScript.js" ],
|
|||
// Another example
|
||||
chrome.tabs.executeScript(tabId, { file: "content_script.js" });
|
||||
```
|
||||
|
||||
Per includere o escludere ulteriori URL è anche possibile utilizzare **`include_globs`** e **`exclude_globs`**.
|
||||
|
||||
### Esecuzione degli script `run_at`
|
||||
|
@ -216,11 +204,10 @@ Il campo `run_at` controlla **quando i file JavaScript vengono iniettati nella p
|
|||
I valori possibili sono:
|
||||
|
||||
* **`document_idle`**: Quando possibile
|
||||
* **`document_start`**: Dopo eventuali file da `css`, ma prima che venga costruito qualsiasi altro DOM o eseguito qualsiasi altro script.
|
||||
* **`document_start`**: Dopo eventuali file da `css`, ma prima che venga costruito qualsiasi altro DOM o venga eseguito qualsiasi altro script.
|
||||
* **`document_end`**: Immediatamente dopo il completamento del DOM, ma prima che vengano caricati sottorisorse come immagini e frame.
|
||||
|
||||
#### Attraverso `manifest.json`
|
||||
|
||||
```json
|
||||
{
|
||||
"name": "My extension",
|
||||
|
@ -236,9 +223,7 @@ I valori possibili sono:
|
|||
}
|
||||
|
||||
```
|
||||
|
||||
Attraverso **`service-worker.js`**
|
||||
|
||||
```javascript
|
||||
chrome.scripting.registerContentScripts([{
|
||||
id : "test",
|
||||
|
@ -247,23 +232,21 @@ runAt : "document_idle",
|
|||
js : [ "contentScript.js" ],
|
||||
}]);
|
||||
```
|
||||
|
||||
### `sfondo`
|
||||
|
||||
I messaggi inviati dagli script di contenuto sono ricevuti dalla **pagina di sfondo**, che svolge un ruolo centrale nel coordinare i componenti dell'estensione. In particolare, la pagina di sfondo persiste per tutta la durata dell'estensione, operando discretamente senza interazione diretta dell'utente. Possiede il proprio Document Object Model (DOM), consentendo interazioni complesse e gestione dello stato.
|
||||
|
||||
**Punti chiave**:
|
||||
**Punti Chiave**:
|
||||
|
||||
* **Ruolo della Pagina di Sfondo:** Agisce come centro nervoso dell'estensione, garantendo comunicazione e coordinamento tra le varie parti dell'estensione.
|
||||
* **Persistenza:** È un'entità sempre presente, invisibile per l'utente ma fondamentale per la funzionalità dell'estensione.
|
||||
* **Generazione Automatica:** Se non è definita esplicitamente, il browser creerà automaticamente una pagina di sfondo. Questa pagina generata automaticamente includerà tutti gli script di sfondo specificati nel manifesto dell'estensione, garantendo il funzionamento senza intoppi dei compiti di sfondo dell'estensione.
|
||||
* **Generazione Automatica:** Se non esplicitamente definita, il browser creerà automaticamente una pagina di sfondo. Questa pagina generata automaticamente includerà tutti gli script di sfondo specificati nel manifesto dell'estensione, garantendo il corretto funzionamento dei compiti di sfondo dell'estensione.
|
||||
|
||||
{% hint style="success" %}
|
||||
La comodità fornita dal browser nella generazione automatica di una pagina di sfondo (quando non dichiarata esplicitamente) garantisce che tutti gli script di sfondo necessari siano integrati e operativi, semplificando il processo di configurazione dell'estensione.
|
||||
{% endhint %}
|
||||
|
||||
Esempio di script di sfondo:
|
||||
|
||||
```js
|
||||
chrome.runtime.onMessage.addListener((request, sender, sendResponse) =>
|
||||
{
|
||||
|
@ -273,12 +256,11 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
|
|||
}
|
||||
})
|
||||
```
|
||||
Utilizza l'API [runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) per ascoltare i messaggi. Quando viene ricevuto un messaggio `"explain"`, utilizza l'API [tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) per aprire una pagina in una nuova scheda.
|
||||
|
||||
Utilizza l'API [runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) per ascoltare i messaggi. Quando riceve un messaggio `"explain"`, utilizza l'API [tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) per aprire una pagina in una nuova scheda.
|
||||
Per eseguire il debug dello script di background, è possibile andare ai **dettagli dell'estensione e ispezionare il service worker**, ciò aprirà gli strumenti per sviluppatori con lo script di background:
|
||||
|
||||
Per eseguire il debug dello script di background, è possibile andare ai **dettagli dell'estensione e ispezionare il service worker**, che aprirà gli strumenti per sviluppatori con lo script di background:
|
||||
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/it/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||
|
||||
### Pagine delle opzioni e altre
|
||||
|
||||
|
@ -288,18 +270,18 @@ Le estensioni del browser possono contenere vari tipi di pagine:
|
|||
* Pagine che l'estensione **caricherà in una nuova scheda**.
|
||||
* **Pagine delle opzioni**: Questa pagina viene visualizzata sopra l'estensione quando si fa clic. Nel manifesto precedente nel mio caso sono riuscito ad accedere a questa pagina in `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` o facendo clic su:
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (8).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
<figure><img src="../../.gitbook/assets/image (21).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Si noti che queste pagine non sono persistenti come le pagine di background poiché caricano dinamicamente il contenuto solo quando necessario. Nonostante ciò, condividono alcune capacità con la pagina di background:
|
||||
|
||||
* **Comunicazione con gli script di contenuto:** Similmente alla pagina di background, queste pagine possono ricevere messaggi dagli script di contenuto, facilitando l'interazione all'interno dell'estensione.
|
||||
* **Accesso alle API specifiche dell'estensione:** Queste pagine godono di un ampio accesso alle API specifiche dell'estensione, soggette alle autorizzazioni definite per l'estensione.
|
||||
|
||||
### `permissions` & `host_permissions`
|
||||
### `permissions` e `host_permissions`
|
||||
|
||||
**`permissions`** e **`host_permissions`** sono voci presenti nel `manifest.json` che indicano **quali autorizzazioni** ha l'estensione del browser (archiviazione, posizione...) e in **quali pagine web**.
|
||||
**`permissions`** e **`host_permissions`** sono voci presenti nel `manifest.json` che indicheranno **quali autorizzazioni** ha l'estensione del browser (archiviazione, posizione...) e in **quali pagine web**.
|
||||
|
||||
Poiché le estensioni del browser possono essere così **privilegiate**, una estensione malintenzionata o compromessa potrebbe consentire all'attaccante **diversi mezzi per rubare informazioni sensibili e spiare l'utente**.
|
||||
Poiché le estensioni del browser possono essere così **privilegiate**, una malintenzionata o compromessa potrebbe consentire all'attaccante **diversi mezzi per rubare informazioni sensibili e spiare l'utente**.
|
||||
|
||||
Verifica come funzionano queste impostazioni e come potrebbero essere abusate in:
|
||||
|
||||
|
@ -312,11 +294,9 @@ Verifica come funzionano queste impostazioni e come potrebbero essere abusate in
|
|||
Una **policy di sicurezza dei contenuti** può essere dichiarata anche all'interno del `manifest.json`. Se ne è definita una, potrebbe essere **vulnerabile**.
|
||||
|
||||
L'impostazione predefinita per le pagine delle estensioni del browser è piuttosto restrittiva:
|
||||
|
||||
```bash
|
||||
script-src 'self'; object-src 'self';
|
||||
```
|
||||
|
||||
Per ulteriori informazioni su CSP e potenziali bypass, controlla:
|
||||
|
||||
{% content-ref url="../content-security-policy-csp-bypass/" %}
|
||||
|
@ -327,7 +307,6 @@ Per ulteriori informazioni su CSP e potenziali bypass, controlla:
|
|||
|
||||
affinché una pagina web possa accedere a una pagina di un'estensione del browser, ad esempio una pagina `.html`, questa pagina deve essere menzionata nel campo **`web_accessible_resources`** del `manifest.json`.\
|
||||
Per esempio:
|
||||
|
||||
```javascript
|
||||
{
|
||||
...
|
||||
|
@ -344,18 +323,15 @@ Per esempio:
|
|||
...
|
||||
}
|
||||
```
|
||||
|
||||
Queste pagine sono accessibili tramite URL come:
|
||||
|
||||
```
|
||||
chrome-extension://<extension-id>/message.html
|
||||
```
|
||||
Nei **estensioni pubbliche l'ID dell'estensione è accessibile**:
|
||||
|
||||
Nei **extension pubblici l'extension-id è accessibile**:
|
||||
<figure><img src="../../.gitbook/assets/image (1191).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
<figure><img src="../../.gitbook/assets/image (722).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||
|
||||
Tuttavia, se il parametro `manifest.json` **`use_dynamic_url`** è utilizzato, questo **id può essere dinamico**.
|
||||
Tuttavia, se il parametro `manifest.json` **`use_dynamic_url`** è utilizzato, questo **ID può essere dinamico**.
|
||||
|
||||
Essere autorizzati ad accedere a queste pagine rende queste pagine **potenzialmente vulnerabili al ClickJacking**:
|
||||
|
||||
|
@ -369,19 +345,17 @@ Consentire il caricamento di queste pagine solo dall'estensione e non da URL cas
|
|||
|
||||
### `externally_connectable`
|
||||
|
||||
Come da [**documentazione**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), la proprietà del manifesto `"externally_connectable"` dichiara **quali estensioni e pagine web possono connettersi** alla tua estensione tramite [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) e [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
Come da [**documentazione**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), La proprietà del manifesto `"externally_connectable"` dichiara **quali estensioni e pagine web possono connettersi** alla tua estensione tramite [runtime.connect](https://developer.chrome.com/docs/extensions/reference/runtime#method-connect) e [runtime.sendMessage](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage).
|
||||
|
||||
* Se la chiave **`externally_connectable`** non è dichiarata nel manifesto della tua estensione o è dichiarata come **`"ids": ["*"]`**, **tutte le estensioni possono connettersi, ma nessuna pagina web può connettersi**.
|
||||
* Se vengono specificati **ID specifici**, come in `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **solo quelle applicazioni** possono connettersi.
|
||||
* Se vengono specificati **corrispondenze**, quelle app web potranno connettersi:
|
||||
|
||||
* Se vengono specificati **corrispondenze**, quelle app web saranno in grado di connettersi:
|
||||
```json
|
||||
"matches": [
|
||||
"https://*.google.com/*",
|
||||
"*://*.chromium.org/*",
|
||||
```
|
||||
|
||||
* Se specificato come vuoto: **`"externally_connectable": {}`**, nessuna app o sito web potrà connettersi.
|
||||
* Se è specificato come vuoto: **`"externally_connectable": {}`**, nessuna app o sito web potrà connettersi.
|
||||
|
||||
Più estensioni e URL sono indicati qui, più piccola sarà la superficie di attacco.
|
||||
|
||||
|
@ -390,7 +364,7 @@ Se una pagina web vulnerabile a XSS o takeover è indicata in **`externally_conn
|
|||
|
||||
Pertanto, si tratta di un bypass molto potente.
|
||||
|
||||
Inoltre, se il cliente installa un'estensione fraudolenta, anche se non è consentito comunicare con l'estensione vulnerabile, potrebbe iniettare dati XSS in una pagina web consentita o abusare delle API **`WebRequest`** o **`DeclarativeNetRequest`** per manipolare le richieste su un dominio mirato alterando una richiesta di una pagina per un file JavaScript. (Si noti che la CSP sulla pagina mirata potrebbe prevenire questi attacchi). Questa idea proviene [**da questo articolo**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
Inoltre, se il cliente installa un'estensione fraudolenta, anche se non è consentito comunicare con l'estensione vulnerabile, potrebbe iniettare dati XSS in una pagina web consentita o abusare delle API **`WebRequest`** o **`DeclarativeNetRequest`** per manipolare le richieste su un dominio mirato alterando la richiesta di una pagina per un file JavaScript. (Si noti che la CSP sulla pagina mirata potrebbe prevenire questi attacchi). Quest'idea proviene [**da questo articolo**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||
{% endhint %}
|
||||
|
||||
##
|
||||
|
@ -399,7 +373,7 @@ Inoltre, se il cliente installa un'estensione fraudolenta, anche se non è conse
|
|||
|
||||
Gli ambienti in cui operano gli **script di contenuto** e dove esistono le pagine host sono **separati** l'uno dall'altro, garantendo **isolamento**. Nonostante questo isolamento, entrambi hanno la capacità di interagire con il **Modello ad Oggetti del Documento (DOM)** della pagina, una risorsa condivisa. Per consentire alla pagina host di comunicare con lo **script di contenuto**, o indirettamente con l'estensione attraverso lo script di contenuto, è necessario utilizzare il **DOM** accessibile da entrambe le parti come canale di comunicazione.
|
||||
|
||||
### Messaggi Postati
|
||||
### Messaggi Post
|
||||
|
||||
{% code title="content-script.js" %}
|
||||
```javascript
|
||||
|
@ -430,11 +404,11 @@ window.postMessage(
|
|||
|
||||
Una comunicazione sicura tramite Post Message dovrebbe verificare l'autenticità del messaggio ricevuto, questo può essere fatto controllando:
|
||||
|
||||
* **`event.isTrusted`**: Questo è True solo se l'evento è stato attivato da un'azione dell'utente
|
||||
* Lo script di contenuto potrebbe aspettarsi un messaggio solo se l'utente esegue qualche azione
|
||||
* **Dominio di origine**: potrebbe aspettarsi un messaggio solo da una lista di domini autorizzati.
|
||||
* Se viene utilizzata un'espressione regolare, fare molta attenzione
|
||||
* **Sorgente**: `received_message.source !== window` può essere utilizzato per verificare se il messaggio proveniva **dalla stessa finestra** in cui lo script di contenuto sta ascoltando.
|
||||
- **`event.isTrusted`**: Questo è True solo se l'evento è stato attivato da un'azione dell'utente
|
||||
- Lo script di contenuto potrebbe aspettarsi un messaggio solo se l'utente esegue qualche azione
|
||||
- **Dominio di origine**: potrebbe aspettarsi un messaggio solo da una lista di domini approvati.
|
||||
- Se viene utilizzata un'espressione regolare, fare molta attenzione
|
||||
- **Sorgente**: `received_message.source !== window` può essere utilizzato per verificare se il messaggio proveniva **dalla stessa finestra** in cui lo script di contenuto sta ascoltando.
|
||||
|
||||
I controlli precedenti, anche se eseguiti, potrebbero essere vulnerabili, quindi controlla nella seguente pagina **potenziali bypass di Post Message**:
|
||||
|
||||
|
@ -454,7 +428,7 @@ Un altro possibile modo di comunicazione potrebbe essere attraverso **URL Iframe
|
|||
|
||||
Questo non è "esattamente" un modo di comunicazione, ma il **web e lo script di contenuto avranno accesso al DOM web**. Quindi, se lo **script di contenuto** sta leggendo alcune informazioni da esso, **fidandosi del DOM web**, il web potrebbe **modificare questi dati** (perché il web non dovrebbe essere fidato, o perché il web è vulnerabile a XSS) e **compromettere lo script di contenuto**.
|
||||
|
||||
Puoi trovare anche un esempio di **XSS basato su DOM per compromettere un'estensione del browser** in:
|
||||
Puoi trovare anche un esempio di **XSS basato sul DOM per compromettere un'estensione del browser** in:
|
||||
|
||||
{% content-ref url="browext-xss-example.md" %}
|
||||
[browext-xss-example.md](browext-xss-example.md)
|
||||
|
@ -468,14 +442,15 @@ Pertanto, la memoria dell'estensione del browser **non dovrebbe essere considera
|
|||
|
||||
Naturalmente, **non inserire informazioni sensibili nel codice**, poiché saranno **pubbliche**.
|
||||
|
||||
Per estrarre la memoria dal browser potresti **estrarre la memoria del processo** o andare nelle **impostazioni** dell'estensione del browser cliccando su **`Ispeziona popup`** -> Nella sezione **`Memoria`** -> **`Fai uno snapshot`** e **`CTRL+F`** per cercare all'interno dello snapshot informazioni sensibili.
|
||||
|
||||
## Comunicazione Script di Contenuto **↔︎** Script di Background
|
||||
|
||||
Uno script di contenuto può utilizzare le funzioni [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **o** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) per inviare un messaggio **serializzabile in JSON** una sola volta.
|
||||
Uno script di contenuto può utilizzare le funzioni [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **o** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) per inviare un messaggio **una tantum serializzabile in JSON**.
|
||||
|
||||
Per gestire la **risposta**, utilizzare la **Promise** restituita. Tuttavia, per la compatibilità all'indietro, è ancora possibile passare un **callback** come ultimo argomento.
|
||||
Per gestire la **risposta**, utilizza la **Promise** restituita. Tuttavia, per la compatibilità all'indietro, è ancora possibile passare un **callback** come ultimo argomento.
|
||||
|
||||
L'invio di una richiesta da uno **script di contenuto** appare così:
|
||||
|
||||
```javascript
|
||||
(async () => {
|
||||
const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
||||
|
@ -483,9 +458,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
|||
console.log(response);
|
||||
})();
|
||||
```
|
||||
|
||||
Inviare una richiesta dall'**estensione** (di solito uno **script di background**) Uno script di contenuto può utilizzare le funzioni, tranne che è necessario specificare a quale scheda inviarlo. Esempio di come inviare un messaggio allo script di contenuto nella scheda selezionata:
|
||||
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||
(async () => {
|
||||
|
@ -495,9 +468,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
|
|||
console.log(response);
|
||||
})();
|
||||
```
|
||||
|
||||
Sul **lato ricevente**, è necessario impostare un [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **ascoltatore di eventi** per gestire il messaggio. Questo appare allo stesso modo da uno script di contenuto o da una pagina di estensione.
|
||||
|
||||
```javascript
|
||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||
chrome.runtime.onMessage.addListener(
|
||||
|
@ -510,7 +481,6 @@ sendResponse({farewell: "goodbye"});
|
|||
}
|
||||
);
|
||||
```
|
||||
|
||||
Nell'esempio evidenziato, **`sendResponse()`** è stato eseguito in modo sincrono. Per modificare il gestore degli eventi `onMessage` per l'esecuzione asincrona di `sendResponse()`, è imperativo incorporare `return true;`.
|
||||
|
||||
Una considerazione importante è che nei casi in cui più pagine sono impostate per ricevere eventi `onMessage`, **la prima pagina a eseguire `sendResponse()`** per un evento specifico sarà l'unica in grado di consegnare efficacemente la risposta. Eventuali risposte successive allo stesso evento non verranno prese in considerazione.
|
||||
|
@ -533,34 +503,32 @@ Il codice sorgente di un'estensione Chrome può essere ottenuto attraverso vari
|
|||
|
||||
Il codice sorgente di un'estensione Chrome può essere scaricato come file ZIP utilizzando la riga di comando. Questo comporta l'uso di `curl` per recuperare il file ZIP da un URL specifico e quindi estrarre i contenuti del file ZIP in una directory. Ecco i passaggi:
|
||||
|
||||
1. Sostituisci `"extension_id"` con il vero ID dell'estensione.
|
||||
1. Sostituisci `"extension_id"` con l'effettivo ID dell'estensione.
|
||||
2. Esegui i seguenti comandi:
|
||||
|
||||
```bash
|
||||
extension_id=your_extension_id # Replace with the actual extension ID
|
||||
curl -L -o "$extension_id.zip" "https://clients2.google.com/service/update2/crx?response=redirect&os=mac&arch=x86-64&nacl_arch=x86-64&prod=chromecrx&prodchannel=stable&prodversion=44.0.2403.130&x=id%3D$extension_id%26uc"
|
||||
unzip -d "$extension_id-source" "$extension_id.zip"
|
||||
```
|
||||
|
||||
### Utilizzare il sito web CRX Viewer
|
||||
|
||||
[https://robwu.nl/crxviewer/](https://robwu.nl/crxviewer/)
|
||||
|
||||
### Utilizzare l'estensione CRX Viewer
|
||||
|
||||
Un altro metodo conveniente è utilizzare Chrome Extension Source Viewer, che è un progetto open-source. Può essere installato dal [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Il codice sorgente del visualizzatore è disponibile nel suo [repository GitHub](https://github.com/Rob--W/crxviewer).
|
||||
Un altro metodo conveniente è utilizzare il Chrome Extension Source Viewer, che è un progetto open-source. Può essere installato dal [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Il codice sorgente del visualizzatore è disponibile nel suo [repository GitHub](https://github.com/Rob--W/crxviewer).
|
||||
|
||||
### Visualizzare il codice sorgente dell'estensione installata localmente
|
||||
|
||||
Anche le estensioni Chrome installate localmente possono essere ispezionate. Ecco come:
|
||||
|
||||
1. Accedi alla directory del profilo locale di Chrome visitando `chrome://version/` e individuando il campo "Percorso del profilo".
|
||||
2. Naviga nella sottocartella `Extensions/` all'interno della directory del profilo.
|
||||
3. Questa cartella contiene tutte le estensioni installate, di solito con il loro codice sorgente in un formato leggibile.
|
||||
2. Naviga alla sottocartella `Extensions/` all'interno della directory del profilo.
|
||||
3. Questa cartella contiene tutte le estensioni installate, tipicamente con il loro codice sorgente in un formato leggibile.
|
||||
|
||||
Per identificare le estensioni, puoi mappare i loro ID ai nomi:
|
||||
|
||||
* Abilita la Modalità Sviluppatore sulla pagina `about:extensions` per vedere gli ID di ciascuna estensione.
|
||||
* Abilita la Modalità Sviluppatore nella pagina `about:extensions` per vedere gli ID di ciascuna estensione.
|
||||
* All'interno della cartella di ciascuna estensione, il file `manifest.json` contiene un campo `name` leggibile, che ti aiuta a identificare l'estensione.
|
||||
|
||||
### Utilizzare un Archiviatore o Decompressore di File
|
||||
|
@ -569,38 +537,38 @@ Vai al Chrome Web Store e scarica l'estensione. Il file avrà estensione `.crx`.
|
|||
|
||||
### Utilizzare la Modalità Sviluppatore in Chrome
|
||||
|
||||
Apri Chrome e vai su `chrome://extensions/`. Abilita "Modalità Sviluppatore" in alto a destra. Fai clic su "Carica estensione non pacchettizzata...". Naviga nella directory della tua estensione. Questo non scarica il codice sorgente, ma è utile per visualizzare e modificare il codice di un'estensione già scaricata o sviluppata.
|
||||
Apri Chrome e vai a `chrome://extensions/`. Abilita "Modalità Sviluppatore" in alto a destra. Clicca su "Carica estensione non pacchettizzata...". Naviga alla directory della tua estensione. Questo non scarica il codice sorgente, ma è utile per visualizzare e modificare il codice di un'estensione già scaricata o sviluppata.
|
||||
|
||||
## Checklist di Audit di Sicurezza
|
||||
## Checklist di Audit della Sicurezza
|
||||
|
||||
Anche se le Estensioni del Browser hanno una **superficie di attacco limitata**, alcune di esse potrebbero contenere **vulnerabilità** o **miglioramenti potenziali della sicurezza**. Ecco le più comuni:
|
||||
|
||||
* [ ] **Limitare** il più possibile le **`permissions`** richieste
|
||||
* [ ] **Limitare** il più possibile le **`host_permissions`**
|
||||
* [ ] Utilizzare una **`content_security_policy`** **forte**
|
||||
* [ ] **Limitare** il più possibile le **`externally_connectable`**, se non è necessario e possibile, non lasciarlo per impostazione predefinita, specificare **`{}`**
|
||||
* [ ] Se un **URL vulnerabile a XSS o a takeover** è menzionato qui, un attaccante sarà in grado di **inviare messaggi direttamente agli script di background**. Un bypass molto potente.
|
||||
* Utilizzare una **`content_security_policy`** **forte**
|
||||
* [ ] **Limitare** il più possibile il **`externally_connectable`**, se non è necessario e possibile, non lasciarlo per impostazione predefinita, specificare **`{}`**
|
||||
* Se un **URL vulnerabile a XSS o a takeover** è menzionato qui, un attaccante sarà in grado di **inviare messaggi direttamente agli script di background**. Molto potente bypass.
|
||||
* [ ] **Limitare** il più possibile le **`web_accessible_resources`**, anche vuoto se possibile.
|
||||
* [ ] Se **`web_accessible_resources`** non è nullo, controllare il [**ClickJacking**](browext-clickjacking.md)
|
||||
* [ ] Se avviene una qualsiasi **comunicazione** dall'**estensione** alla **pagina web**, [**controllare XSS**](browext-xss-example.md) **vulnerabilità** causate nella comunicazione.
|
||||
* [ ] Se vengono utilizzati i Post Messages, controllare le [**vulnerabilità di Post Message**](../postmessage-vulnerabilities/)**.**
|
||||
* [ ] Se lo **Script di Contenuto accede ai dettagli del DOM**, controllare che non stiano introducendo un XSS se vengono **modificati** dalla pagina web
|
||||
* [ ] Fare particolare attenzione se questa comunicazione è coinvolta anche nella **comunicazione Script di Contenuto -> Script di Background**
|
||||
* [ ] Le **informazioni sensibili non dovrebbero essere memorizzate** all'interno del codice dell'Estensione del Browser
|
||||
* [ ] Le **informazioni sensibili non dovrebbero essere memorizzate** nella memoria dell'Estensione del Browser
|
||||
* Se **`web_accessible_resources`** non è nullo, controllare il [**ClickJacking**](browext-clickjacking.md)
|
||||
* Se avviene una qualsiasi **comunicazione** dall'**estensione** alla **pagina web**, [**controllare XSS**](browext-xss-example.md) **vulnerabilità** causate nella comunicazione.
|
||||
* Se vengono utilizzati i Post Messages, controllare le [**vulnerabilità di Post Message**](../postmessage-vulnerabilities/)**.**
|
||||
* Se lo **Script di Contenuto accede ai dettagli del DOM**, controllare che non stiano introducendo un XSS se vengono **modificati** dalla pagina web
|
||||
* Fare un'enfasi particolare se questa comunicazione è coinvolta anche nella **comunicazione Script di Contenuto -> Script di Background**
|
||||
* Le **informazioni sensibili non dovrebbero essere memorizzate** all'interno del codice dell'Estensione del Browser
|
||||
* Le **informazioni sensibili non dovrebbero essere memorizzate** all'interno della memoria dell'Estensione del Browser
|
||||
|
||||
## Strumenti
|
||||
|
||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||
|
||||
* Estrae qualsiasi estensione Chrome da un link fornito dal Chrome webstore.
|
||||
* Visualizzatore di [**manifest.json**](https://developer.chrome.com/extensions/manifest): visualizza semplicemente una versione JSON-prettified del manifesto dell'estensione.
|
||||
* Analisi delle impronte digitali: Rilevamento delle [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) e generazione automatica di JavaScript di fingerprinting per estensioni Chrome.
|
||||
* Analisi potenziale di Clickjacking: Rilevamento delle pagine HTML dell'estensione con la direttiva [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) impostata. Queste sono potenzialmente vulnerabili al clickjacking a seconda dello scopo delle pagine.
|
||||
* Visualizzatore di Avvisi di Autorizzazione: mostra un elenco di tutti gli avvisi di autorizzazione di Chrome che verranno visualizzati quando un utente cercherà di installare l'estensione.
|
||||
* Funzioni Pericolose: mostra la posizione delle funzioni pericolose che potrebbero essere sfruttate da un attaccante (ad es. funzioni come innerHTML, chrome.tabs.executeScript).
|
||||
* Punti di Ingresso: mostra dove l'estensione accetta input dell'utente/esterno. Questo è utile per comprendere l'area di superficie di un'estensione e cercare potenziali punti per inviare dati malevoli all'estensione.
|
||||
* Sia i scanner di Funzioni Pericolose che di Punti di Ingresso hanno quanto segue per i loro avvisi generati:
|
||||
* Visualizzatore di [**manifest.json**](https://developer.chrome.com/extensions/manifest): visualizza semplicemente una versione JSON formattata del manifesto dell'estensione.
|
||||
* Analisi dell'**Impronta Digitale**: Rilevamento delle [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) e generazione automatica di JavaScript per l'impronta digitale dell'estensione Chrome.
|
||||
* Analisi del **Potenziale Clickjacking**: Rilevamento delle pagine HTML dell'estensione con la direttiva [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) impostata. Queste sono potenzialmente vulnerabili al clickjacking a seconda dello scopo delle pagine.
|
||||
* Visualizzatore di Avvertimenti di **Permessi**: mostra un elenco di tutti gli avvisi di permessi di Chrome che verranno visualizzati quando un utente cercherà di installare l'estensione.
|
||||
* **Funzioni Pericolose**: mostra la posizione delle funzioni pericolose che potrebbero essere sfruttate da un attaccante (ad esempio funzioni come innerHTML, chrome.tabs.executeScript).
|
||||
* **Punti di Ingresso**: mostra dove l'estensione accetta input dell'utente/esterno. Questo è utile per comprendere l'area di superficie di un'estensione e cercare potenziali punti per inviare dati malevoli all'estensione.
|
||||
* Sia gli scanner di Funzioni Pericolose che di Punti di Ingresso hanno quanto segue per i loro avvisi generati:
|
||||
* Frammento di codice rilevante e linea che ha causato l'avviso.
|
||||
* Descrizione del problema.
|
||||
* Un pulsante "Visualizza File" per visualizzare il file sorgente completo contenente il codice.
|
||||
|
@ -608,17 +576,17 @@ Anche se le Estensioni del Browser hanno una **superficie di attacco limitata**,
|
|||
* L'URI completo dell'estensione Chrome del file segnalato.
|
||||
* Il tipo di file, come uno script di Pagina di Background, Script di Contenuto, Azione del Browser, ecc.
|
||||
* Se la linea vulnerabile è in un file JavaScript, i percorsi di tutte le pagine in cui è inclusa nonché lo stato di [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) di queste pagine.
|
||||
* Analizzatore e verificatore di bypass della Content Security Policy (CSP): Questo evidenzierà le debolezze nella CSP della tua estensione e illuminerà eventuali modi per bypassare la tua CSP a causa di CDN in whitelist, ecc.
|
||||
* Librerie Vulnerabili Conosciute: Utilizza [Retire.js](https://retirejs.github.io/retire.js/) per controllare l'uso di librerie JavaScript conosciute come vulnerabili.
|
||||
* **Analizzatore e Verificatore di Bypass della Politica di Sicurezza del Contenuto (CSP)**: Questo evidenzierà le debolezze nella CSP della tua estensione e illuminerà eventuali modi per aggirare la tua CSP a causa di CDN in whitelist, ecc.
|
||||
* **Librerie Vulnerabili Conosciute**: Utilizza [Retire.js](https://retirejs.github.io/retire.js/) per controllare l'uso di librerie JavaScript conosciute come vulnerabili.
|
||||
* Scarica l'estensione e le versioni formattate.
|
||||
* Scarica l'estensione originale.
|
||||
* Scarica una versione formattata dell'estensione (HTML e JavaScript auto-prettified).
|
||||
* Cache automatica dei risultati della scansione, eseguire una scansione dell'estensione richiederà molto tempo la prima volta che la si esegue. Tuttavia, la seconda volta, assumendo che l'estensione non sia stata aggiornata, sarà quasi istantanea grazie alla cache dei risultati.
|
||||
* URL di report collegabili, è facile collegare qualcun altro a un report sull'estensione generato da tarnish.
|
||||
* Scarica una versione formattata dell'estensione (HTML e JavaScript autoformattati).
|
||||
* Cache automatica dei risultati della scansione, eseguire una scansione dell'estensione richiederà molto tempo la prima volta che la esegui. Tuttavia, la seconda volta, assumendo che l'estensione non sia stata aggiornata, sarà quasi istantanea grazie ai risultati in cache.
|
||||
* URL di Report collegabili, per collegare facilmente qualcun altro a un report sull'estensione generato da tarnish.
|
||||
|
||||
### [Neto](https://github.com/elevenpaths/neto)
|
||||
|
||||
Il progetto Neto è un pacchetto Python 3 concepito per analizzare e svelare funzionalità nascoste di plugin ed estensioni del browser per browser ben noti come Firefox e Chrome. Automatizza il processo di decomprimere i file confezionati per estrarre queste funzionalità da risorse rilevanti in un'estensione come `manifest.json`, cartelle di localizzazione o file sorgente Javascript e HTML.
|
||||
Il Progetto Neto è un pacchetto Python 3 concepito per analizzare e svelare funzionalità nascoste di plugin e estensioni del browser per browser ben noti come Firefox e Chrome. Automatizza il processo di decomprimere i file confezionati per estrarre queste funzionalità da risorse rilevanti in un'estensione come `manifest.json`, cartelle di localizzazione o file sorgente Javascript e HTML.
|
||||
|
||||
## Riferimenti
|
||||
|
||||
|
@ -638,8 +606,7 @@ Il progetto Neto è un pacchetto Python 3 concepito per analizzare e svelare fun
|
|||
<summary><strong>Impara l'hacking di AWS da zero a eroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
Altri modi per supportare HackTricks:
|
||||
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** controlla i [**PIANI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Se vuoi vedere la tua **azienda pubblicizzata su HackTricks** o **scaricare HackTricks in PDF** controlla i [**PACCHETTI DI ABBONAMENTO**](https://github.com/sponsors/carlospolop)!
|
||||
* Ottieni il [**merchandising ufficiale di PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||
* Scopri [**La Famiglia PEASS**](https://opensea.io/collection/the-peass-family), la nostra collezione di esclusive [**NFT**](https://opensea.io/collection/the-peass-family)
|
||||
* **Unisciti al** 💬 [**gruppo Discord**](https://discord.gg/hRep4RUj7f) o al [**gruppo telegram**](https://t.me/peass) o **seguici** su **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||
|
|
Loading…
Add table
Reference in a new issue