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

This commit is contained in:
Translator 2024-07-31 09:35:48 +00:00
parent e940c1a7dd
commit 2b87b8c38e

View file

@ -1,8 +1,8 @@
# Metodologia de Pentesting de Extensões de Navegador # Metodologia de Pentesting de Extensões de Navegador
{% hint style="success" %} {% hint style="success" %}
Aprenda e pratique Hacking AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Aprenda e pratique Hacking AWS:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Aprenda e pratique Hacking GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Aprenda e pratique Hacking GCP: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>
@ -21,7 +21,7 @@ As extensões de navegador são escritas em JavaScript e carregadas pelo navegad
## Componentes Principais ## Componentes Principais
Os layouts de extensão ficam melhores quando visualizados e consistem em três componentes. Vamos analisar cada componente em profundidade. Os layouts de extensão são melhor visualizados e consistem em três componentes. Vamos analisar cada componente em profundidade.
<figure><img src="../../.gitbook/assets/image (16) (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 (16) (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>
@ -31,7 +31,7 @@ Cada script de conteúdo tem acesso direto ao DOM de uma **única página da web
### **Núcleo da Extensão** ### **Núcleo da Extensão**
O núcleo da extensão contém a maioria dos privilégios/acessos da extensão, mas o núcleo da extensão só pode interagir com o conteúdo da web via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) e scripts de conteúdo. Além disso, o núcleo da extensão não tem acesso direto à máquina host. O núcleo da extensão contém a maior parte dos privilégios/acessos da extensão, mas o núcleo da extensão só pode interagir com o conteúdo da web via [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) e scripts de conteúdo. Além disso, o núcleo da extensão não tem acesso direto à máquina host.
### **Binário Nativo** ### **Binário Nativo**
@ -43,7 +43,7 @@ A extensão permite um binário nativo que pode **acessar a máquina host com os
Para obter os privilégios totais do usuário, um atacante deve convencer a extensão a passar entrada maliciosa do script de conteúdo para o núcleo da extensão e do núcleo da extensão para o binário nativo. Para obter os privilégios totais do usuário, um atacante deve convencer a extensão a passar entrada maliciosa do script de conteúdo para o núcleo da extensão e do núcleo da extensão para o binário nativo.
{% endhint %} {% endhint %}
Cada componente da extensão é separado dos outros por **fortes limites protetores**. Cada componente é executado em um **processo de sistema operacional separado**. Scripts de conteúdo e núcleos de extensão são executados em **processos de sandbox** indisponíveis para a maioria dos serviços do sistema operacional. Cada componente da extensão é separado dos outros por **fortes limites de proteção**. Cada componente é executado em um **processo de sistema operacional separado**. Scripts de conteúdo e núcleos de extensão são executados em **processos de sandbox** indisponíveis para a maioria dos serviços do sistema operacional.
Além disso, os scripts de conteúdo são separados de suas páginas da web associadas por **executarem em um heap JavaScript separado**. O script de conteúdo e a página da web têm **acesso ao mesmo DOM subjacente**, mas os dois **nunca trocam ponteiros JavaScript**, prevenindo o vazamento de funcionalidade JavaScript. Além disso, os scripts de conteúdo são separados de suas páginas da web associadas por **executarem em um heap JavaScript separado**. O script de conteúdo e a página da web têm **acesso ao mesmo DOM subjacente**, mas os dois **nunca trocam ponteiros JavaScript**, prevenindo o vazamento de funcionalidade JavaScript.
@ -125,12 +125,12 @@ Dependendo do navegador, as capacidades do script de conteúdo podem variar lige
Para visualizar e depurar scripts de conteúdo no Chrome, o menu de ferramentas de desenvolvedor do Chrome pode ser acessado em Opções > Mais ferramentas > Ferramentas do desenvolvedor OU pressionando Ctrl + Shift + I. Para visualizar e depurar scripts de conteúdo no Chrome, o menu de ferramentas de desenvolvedor do Chrome pode ser acessado em Opções > Mais ferramentas > Ferramentas do desenvolvedor OU pressionando Ctrl + Shift + I.
Ao exibir as ferramentas de desenvolvedor, a **aba Fonte** deve ser clicada, seguida pela aba **Scripts de Conteúdo**. Isso permite a observação de scripts de conteúdo em execução de várias extensões e a definição de pontos de interrupção para rastrear o fluxo de execução. Após a exibição das ferramentas de desenvolvedor, a aba **Fonte** deve ser clicada, seguida pela aba **Scripts de Conteúdo**. Isso permite a observação de scripts de conteúdo em execução de várias extensões e a definição de pontos de interrupção para rastrear o fluxo de execução.
### Scripts de conteúdo injetados ### Scripts de conteúdo injetados
{% hint style="success" %} {% hint style="success" %}
Observe que **Scripts de Conteúdo não são obrigatórios** pois também é possível **injetar** scripts **dinamicamente** e **injetá-los programaticamente** em páginas da web via **`tabs.executeScript`**. Isso na verdade fornece **controles mais granulares**. Observe que **Scripts de Conteúdo não são obrigatórios** pois também é possível **injetar** scripts **dinamicamente** e **injetá-los programaticamente** em páginas da web via **`tabs.executeScript`**. Isso na verdade fornece mais **controles granulares**.
{% endhint %} {% endhint %}
Para a injeção programática de um script de conteúdo, a extensão deve ter [permissões de host](https://developer.chrome.com/docs/extensions/reference/permissions) para a página na qual os scripts devem ser injetados. Essas permissões podem ser obtidas solicitando-as dentro do manifesto da extensão ou de forma temporária através de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). Para a injeção programática de um script de conteúdo, a extensão deve ter [permissões de host](https://developer.chrome.com/docs/extensions/reference/permissions) para a página na qual os scripts devem ser injetados. Essas permissões podem ser obtidas solicitando-as dentro do manifesto da extensão ou de forma temporária através de [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
@ -257,7 +257,7 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
} }
}) })
``` ```
Ele usa a [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escutar mensagens. Quando uma mensagem `"explain"` é recebida, ele usa a [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir uma página em uma nova aba. Utiliza a [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) para escutar mensagens. Quando uma mensagem `"explain"` é recebida, utiliza a [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) para abrir uma página em uma nova aba.
Para depurar o script de fundo, você pode ir aos **detalhes da extensão e inspecionar o service worker,** isso abrirá as ferramentas de desenvolvedor com o script de fundo: Para depurar o script de fundo, você pode ir aos **detalhes da extensão e inspecionar o service worker,** isso abrirá as ferramentas de desenvolvedor com o script de fundo:
@ -265,15 +265,15 @@ Para depurar o script de fundo, você pode ir aos **detalhes da extensão e insp
### Páginas de opções e outras ### Páginas de opções e outras
As extensões do navegador podem conter vários tipos de páginas: As extensões de navegador podem conter vários tipos de páginas:
* **Páginas de ação** são exibidas em um **menu suspenso quando o ícone da extensão** é clicado. * **Páginas de ação** são exibidas em um **menu suspenso quando o ícone da extensão** é clicado.
* Páginas que a extensão irá **carregar em uma nova aba**. * Páginas que a extensão irá **carregar em uma nova aba**.
* **Páginas de Opções**: Esta página é exibida no topo da extensão quando clicada. No manifesto anterior, no meu caso, consegui acessar esta página em `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou clicando: * **Páginas de Opção**: Esta página é exibida no topo da extensão quando clicada. No manifesto anterior, no meu caso, consegui acessar esta página em `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` ou clicando:
<figure><img src="../../.gitbook/assets/image (24).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (24).png" alt="" width="375"><figcaption></figcaption></figure>
Note que essas páginas não são persistentes como as páginas de fundo, pois carregam conteúdo dinamicamente conforme necessário. Apesar disso, elas compartilham certas capacidades com a página de fundo: Note que essas páginas não são persistentes como as páginas de fundo, pois carregam conteúdo dinamicamente conforme a necessidade. Apesar disso, elas compartilham certas capacidades com a página de fundo:
* **Comunicação com Scripts de Conteúdo:** Semelhante à página de fundo, essas páginas podem receber mensagens de scripts de conteúdo, facilitando a interação dentro da extensão. * **Comunicação com Scripts de Conteúdo:** Semelhante à página de fundo, essas páginas podem receber mensagens de scripts de conteúdo, facilitando a interação dentro da extensão.
* **Acesso a APIs Específicas da Extensão:** Essas páginas têm acesso abrangente a APIs específicas da extensão, sujeito às permissões definidas para a extensão. * **Acesso a APIs Específicas da Extensão:** Essas páginas têm acesso abrangente a APIs específicas da extensão, sujeito às permissões definidas para a extensão.
@ -282,7 +282,7 @@ Note que essas páginas não são persistentes como as páginas de fundo, pois c
**`permissions`** e **`host_permissions`** são entradas do `manifest.json` que indicarão **quais permissões** a extensão do navegador possui (armazenamento, localização...) e em **quais páginas da web**. **`permissions`** e **`host_permissions`** são entradas do `manifest.json` que indicarão **quais permissões** a extensão do navegador possui (armazenamento, localização...) e em **quais páginas da web**.
Como as extensões do navegador podem ser tão **privilegiadas**, uma maliciosa ou uma que esteja comprometida poderia permitir ao atacante **diferentes meios de roubar informações sensíveis e espionar o usuário**. Como as extensões de navegador podem ser tão **privilegiadas**, uma maliciosa ou uma que esteja comprometida poderia permitir ao atacante **diferentes meios de roubar informações sensíveis e espionar o usuário**.
Verifique como essas configurações funcionam e como podem ser abusadas em: Verifique como essas configurações funcionam e como podem ser abusadas em:
@ -294,7 +294,7 @@ Verifique como essas configurações funcionam e como podem ser abusadas em:
Uma **política de segurança de conteúdo** pode ser declarada também dentro do `manifest.json`. Se houver uma definida, ela pode ser **vulnerável**. Uma **política de segurança de conteúdo** pode ser declarada também dentro do `manifest.json`. Se houver uma definida, ela pode ser **vulnerável**.
A configuração padrão para páginas de extensão do navegador é bastante restritiva: A configuração padrão para páginas de extensão de navegador é bastante restritiva:
```bash ```bash
script-src 'self'; object-src 'self'; script-src 'self'; object-src 'self';
``` ```
@ -332,13 +332,13 @@ Em extensões públicas, o **extension-id é acessível**:
<figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure> <figure><img src="../../.gitbook/assets/image (1194).png" alt="" width="375"><figcaption></figcaption></figure>
Embora, se o parâmetro `manifest.json` **`use_dynamic_url`** for usado, esse **id pode ser dinâmico**. Embora, se o parâmetro `manifest.json` **`use_dynamic_url`** for utilizado, este **id pode ser dinâmico**.
{% hint style="success" %} {% hint style="success" %}
Observe que mesmo que uma página seja mencionada aqui, ela pode estar **protegida contra ClickJacking** graças à **Content Security Policy**. Portanto, você também precisa verificá-la (seção frame-ancestors) antes de confirmar que um ataque de ClickJacking é possível. Observe que mesmo que uma página seja mencionada aqui, ela pode estar **protegida contra ClickJacking** graças à **Content Security Policy**. Portanto, você também precisa verificá-la (seção frame-ancestors) antes de confirmar que um ataque de ClickJacking é possível.
{% endhint %} {% endhint %}
Ter permissão para acessar essas páginas torna essas páginas **potencialmente vulneráveis a ClickJacking**: Ter acesso a essas páginas torna essas páginas **potencialmente vulneráveis a ClickJacking**:
{% content-ref url="browext-clickjacking.md" %} {% content-ref url="browext-clickjacking.md" %}
[browext-clickjacking.md](browext-clickjacking.md) [browext-clickjacking.md](browext-clickjacking.md)
@ -359,7 +359,7 @@ Além disso, note que você só pode abrir páginas indicadas em **`web_accessib
De acordo com a [**documentação**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), a propriedade de manifesto `"externally_connectable"` declara **quais extensões e páginas da web podem se conectar** à sua extensão via [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). De acordo com a [**documentação**](https://developer.chrome.com/docs/extensions/reference/manifest/externally-connectable), a propriedade de manifesto `"externally_connectable"` declara **quais extensões e páginas da web podem se conectar** à sua extensão via [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 a chave **`externally_connectable`** **não** for declarada no manifesto da sua extensão ou for declarada como **`"ids": ["*"]`**, **todas as extensões podem se conectar, mas nenhuma página da web pode se conectar**. * Se a chave **`externally_connectable`** **não** for declarada no manifesto da sua extensão ou for declarada como **`"ids": ["*"]`**, **todas as extensões podem se conectar, mas nenhuma página da web pode se conectar**.
* Se **IDs específicos forem especificados**, como em `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **apenas esses aplicativos** podem se conectar. * Se **IDs específicos forem especificados**, como em `"ids": ["aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"]`, **apenas essas aplicações** podem se conectar.
* Se **matches** forem especificados, esses aplicativos da web poderão se conectar: * Se **matches** forem especificados, esses aplicativos da web poderão se conectar:
```json ```json
"matches": [ "matches": [
@ -375,14 +375,14 @@ Se uma página da web **vulnerável a XSS ou takeover** estiver indicada em **`e
Portanto, este é um **bypass muito poderoso**. Portanto, este é um **bypass muito poderoso**.
Além disso, se o cliente instalar uma extensão maliciosa, mesmo que não seja permitido comunicar-se com a extensão vulnerável, ela poderá injetar **dados XSS em uma página da web permitida** ou abusar das APIs **`WebRequest`** ou **`DeclarativeNetRequest`** para manipular solicitações em um domínio alvo alterando a solicitação de uma **arquivo JavaScript**. (Observe que o CSP na página alvo pode prevenir esses ataques). Esta ideia vem [**deste writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). Além disso, se o cliente instalar uma extensão maliciosa, mesmo que não seja permitido comunicar-se com a extensão vulnerável, ela poderá injetar **dados XSS em uma página da web permitida** ou abusar das APIs **`WebRequest`** ou **`DeclarativeNetRequest`** para manipular solicitações em um domínio alvo, alterando a solicitação de uma página para um **arquivo JavaScript**. (Observe que o CSP na página alvo pode prevenir esses ataques). Esta ideia vem [**deste writeup**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
{% endhint %} {% endhint %}
## Resumo da comunicação ## Resumo da comunicação
### Extensão <--> WebApp ### Extensão <--> WebApp
Para se comunicar entre o script de conteúdo e a página da web, mensagens postadas são geralmente usadas. Portanto, na aplicação web você geralmente encontrará chamadas para a função **`window.postMessage`** e no script de conteúdo ouvintes como **`window.addEventListener`**. Note, no entanto, que a extensão também pode **comunicar-se com a aplicação web enviando uma Post Message** (e, portanto, a web deve esperar por isso) ou apenas fazer a web carregar um novo script. Para se comunicar entre o script de conteúdo e a página da web, mensagens postadas são geralmente usadas. Portanto, na aplicação web você geralmente encontrará chamadas para a função **`window.postMessage`** e, no script de conteúdo, ouvintes como **`window.addEventListener`**. Note, no entanto, que a extensão também pode **se comunicar com a aplicação web enviando uma Post Message** (e, portanto, a web deve esperar por isso) ou apenas fazer a web carregar um novo script.
### Dentro da extensão ### Dentro da extensão
@ -419,7 +419,7 @@ console.log("Content script received message from background script:", msg);
``` ```
</details> </details>
Também é possível enviar mensagens de um script de fundo para um script de conteúdo localizado em uma aba específica chamando **`chrome.tabs.sendMessage`**, onde você precisará indicar o **ID da aba** para a qual enviar a mensagem. Também é possível enviar mensagens de um script de fundo para um script de conteúdo localizado em uma aba específica chamando **`chrome.tabs.sendMessage`**, onde você precisará indicar o **ID da aba** para enviar a mensagem.
### De `externally_connectable` permitido para a extensão ### De `externally_connectable` permitido para a extensão
@ -429,11 +429,23 @@ chrome.runtime.sendMessage(extensionId, ...
``` ```
Onde é necessário mencionar o **extension ID**. Onde é necessário mencionar o **extension ID**.
### Native Messaging
É possível que os scripts de fundo se comuniquem com binários dentro do sistema, que podem ser **susceptíveis a vulnerabilidades críticas, como RCEs**, se essa comunicação não for devidamente protegida. [Mais sobre isso mais tarde](./#native-messaging).
```javascript
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
```
## Web **↔︎** Comunicação de Script de Conteúdo ## Web **↔︎** Comunicação de Script de Conteúdo
Os ambientes onde os **content scripts** operam e onde as páginas host existem são **separados** um do outro, garantindo **isolamento**. Apesar desse isolamento, ambos têm a capacidade de interagir com o **Document Object Model (DOM)** da página, um recurso compartilhado. Para que a página host se envolva em comunicação com o **content script**, ou indiretamente com a extensão através do content script, é necessário utilizar o **DOM** que é acessível por ambas as partes como o canal de comunicação. Os ambientes onde os **scripts de conteúdo** operam e onde as páginas host existem são **separados** um do outro, garantindo **isolamento**. Apesar desse isolamento, ambos têm a capacidade de interagir com o **Modelo de Objeto de Documento (DOM)** da página, um recurso compartilhado. Para que a página host se envolva em comunicação com o **script de conteúdo**, ou indiretamente com a extensão através do script de conteúdo, é necessário utilizar o **DOM** que é acessível por ambas as partes como o canal de comunicação.
### Post Messages ### Mensagens Post
{% code title="content-script.js" %} {% code title="content-script.js" %}
```javascript ```javascript
@ -466,13 +478,13 @@ window.postMessage(
Uma comunicação segura de Post Message deve verificar a autenticidade da mensagem recebida, isso pode ser feito verificando: Uma comunicação segura de Post Message deve verificar a autenticidade da mensagem recebida, isso pode ser feito verificando:
* **`event.isTrusted`**: Isso é True apenas se o evento foi acionado por uma ação do usuário * **`event.isTrusted`**: Isso é Verdadeiro apenas se o evento foi acionado por uma ação do usuário
* O script de conteúdo pode esperar uma mensagem apenas se o usuário realizar alguma ação * O script de conteúdo pode esperar uma mensagem apenas se o usuário realizar alguma ação
* **domínio de origem**: pode esperar uma mensagem apenas de uma lista de domínios permitidos. * **domínio de origem**: pode esperar uma mensagem apenas de uma lista de domínios permitidos.
* Se uma regex for usada, tenha muito cuidado * Se uma regex for usada, tenha muito cuidado
* **Fonte**: `received_message.source !== window` pode ser usado para verificar se a mensagem foi **da mesma janela** onde o Script de Conteúdo está ouvindo. * **Fonte**: `received_message.source !== window` pode ser usado para verificar se a mensagem foi **da mesma janela** onde o Script de Conteúdo está ouvindo.
As verificações anteriores, mesmo se realizadas, podem ser vulneráveis, então verifique na página seguinte **potenciais bypasses de Post Message**: As verificações anteriores, mesmo que realizadas, podem ser vulneráveis, então verifique na página seguinte **potenciais bypasses de Post Message**:
{% content-ref url="../postmessage-vulnerabilities/" %} {% content-ref url="../postmessage-vulnerabilities/" %}
[postmessage-vulnerabilities](../postmessage-vulnerabilities/) [postmessage-vulnerabilities](../postmessage-vulnerabilities/)
@ -498,7 +510,7 @@ Você também pode encontrar um exemplo de um **XSS baseado em DOM para comprome
## Comunicação entre Script de Conteúdo **↔︎** Script de Fundo ## Comunicação entre Script de Conteúdo **↔︎** Script de Fundo
Um Script de Conteúdo pode usar as funções [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ou** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) para enviar uma mensagem **JSON-serializável de uma única vez**. Um Script de Conteúdo pode usar as funções [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **ou** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) para enviar uma mensagem **serializável em JSON de uma única vez**.
Para lidar com a **resposta**, use a **Promise** retornada. Embora, para compatibilidade retroativa, você ainda possa passar um **callback** como o último argumento. Para lidar com a **resposta**, use a **Promise** retornada. Embora, para compatibilidade retroativa, você ainda possa passar um **callback** como o último argumento.
@ -520,7 +532,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
console.log(response); console.log(response);
})(); })();
``` ```
No **lado receptor**, você precisa configurar um [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **ouvinte de eventos** para lidar com a mensagem. Isso parece o mesmo a partir de um script de conteúdo ou página de extensão. No **lado receptor**, você precisa configurar um [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) **ouvinte de eventos** para lidar com a mensagem. Isso parece o mesmo de um script de conteúdo ou página de extensão.
```javascript ```javascript
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js // From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
chrome.runtime.onMessage.addListener( chrome.runtime.onMessage.addListener(
@ -539,17 +551,56 @@ Uma consideração importante é que, em cenários onde várias páginas estão
Ao criar novas extensões, a preferência deve ser por promessas em vez de callbacks. Em relação ao uso de callbacks, a função `sendResponse()` é considerada válida apenas se for executada diretamente dentro do contexto síncrono, ou se o manipulador de eventos indicar uma operação assíncrona retornando `true`. Se nenhum dos manipuladores retornar `true` ou se a função `sendResponse()` for removida da memória (coletada pelo lixo), o callback associado à função `sendMessage()` será acionado por padrão. Ao criar novas extensões, a preferência deve ser por promessas em vez de callbacks. Em relação ao uso de callbacks, a função `sendResponse()` é considerada válida apenas se for executada diretamente dentro do contexto síncrono, ou se o manipulador de eventos indicar uma operação assíncrona retornando `true`. Se nenhum dos manipuladores retornar `true` ou se a função `sendResponse()` for removida da memória (coletada pelo lixo), o callback associado à função `sendMessage()` será acionado por padrão.
## Native Messaging
As extensões do navegador também permitem comunicar-se com **binários no sistema via stdin**. O aplicativo deve instalar um json indicando isso em um json como:
```json
{
"name": "com.my_company.my_application",
"description": "My Application",
"path": "C:\\Program Files\\My Application\\chrome_native_messaging_host.exe",
"type": "stdio",
"allowed_origins": ["chrome-extension://knldjmfmopnpolahpmmgbagdohdnhkik/"]
}
```
Onde o `name` é a string passada para [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) ou [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) para se comunicar com o aplicativo a partir dos scripts de fundo da extensão do navegador. O `path` é o caminho para o binário, há apenas 1 `type` válido que é stdio (use stdin e stdout) e os `allowed_origins` indicam as extensões que podem acessá-lo (e não podem ter wildcard).
O Chrome/Chromium irá procurar por este json em alguns registros do Windows e alguns caminhos no macOS e Linux (mais informações na [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)).
{% hint style="success" %}
A extensão do navegador também precisa da permissão `nativeMessaing` declarada para poder usar essa comunicação.
{% endhint %}
Assim é como parece um código de script de fundo enviando mensagens para um aplicativo nativo:
```javascript
chrome.runtime.sendNativeMessage(
'com.my_company.my_application',
{text: 'Hello'},
function (response) {
console.log('Received ' + response);
}
);
```
Em [**este post do blog**](https://spaceraccoon.dev/universal-code-execution-browser-extensions/), um padrão vulnerável que abusa de mensagens nativas é proposto:
1. A extensão do navegador tem um padrão curinga para o script de conteúdo.
2. O script de conteúdo passa mensagens `postMessage` para o script de fundo usando `sendMessage`.
3. O script de fundo passa a mensagem para o aplicativo nativo usando `sendNativeMessage`.
4. O aplicativo nativo manipula a mensagem de forma perigosa, levando à execução de código.
E dentro dele, um exemplo de **como ir de qualquer página para RCE abusando de uma extensão do navegador é explicado**.
## Informações Sensíveis na Memória/Código/Área de Transferência ## Informações Sensíveis na Memória/Código/Área de Transferência
Se uma Extensão de Navegador armazena **informações sensíveis dentro de sua memória**, isso pode ser **despejado** (especialmente em máquinas Windows) e **pesquisado** por essas informações. Se uma Extensão do Navegador armazena **informações sensíveis dentro de sua memória**, isso pode ser **extraído** (especialmente em máquinas Windows) e **procurado** por essas informações.
Portanto, a memória da Extensão de Navegador **não deve ser considerada segura** e **informações sensíveis** como credenciais ou frases mnemônicas **não devem ser armazenadas**. Portanto, a memória da Extensão do Navegador **não deve ser considerada segura** e **informações sensíveis** como credenciais ou frases mnemônicas **não devem ser armazenadas**.
Claro, **não coloque informações sensíveis no código**, pois isso será **público**. Claro, **não coloque informações sensíveis no código**, pois isso será **público**.
Para despejar a memória do navegador, você pode **despejar a memória do processo** ou ir para as **configurações** da extensão do navegador, clicar em **`Inspecionar pop-up`** -> Na seção **`Memória`** -> **`Tirar um instantâneo`** e **`CTRL+F`** para pesquisar dentro do instantâneo por informações sensíveis. Para extrair a memória do navegador, você pode **extrair a memória do processo** ou ir para as **configurações** da extensão do navegador clicando em **`Inspecionar pop-up`** -> Na seção **`Memória`** -> **`Tirar um instantâneo`** e **`CTRL+F`** para procurar dentro do instantâneo por informações sensíveis.
Além disso, informações altamente sensíveis, como chaves mnemônicas ou senhas, **não devem ser permitidas para serem copiadas na área de transferência** (ou pelo menos removê-las da área de transferência em alguns segundos), pois assim processos que monitoram a área de transferência poderão obtê-las. Além disso, informações altamente sensíveis como chaves mnemônicas ou senhas **não devem ser permitidas para serem copiadas na área de transferência** (ou pelo menos removê-las da área de transferência em poucos segundos) porque então processos que monitoram a área de transferência poderão obtê-las.
## Carregando uma Extensão no Navegador ## Carregando uma Extensão no Navegador
@ -582,7 +633,7 @@ unzip -d "$extension_id-source" "$extension_id.zip"
Outro método conveniente é usar o Chrome Extension Source Viewer, que é um projeto de código aberto. Ele pode ser instalado na [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=pt). O código-fonte do visualizador está disponível em seu [repositório GitHub](https://github.com/Rob--W/crxviewer). Outro método conveniente é usar o Chrome Extension Source Viewer, que é um projeto de código aberto. Ele pode ser instalado na [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=pt). O código-fonte do visualizador está disponível em seu [repositório GitHub](https://github.com/Rob--W/crxviewer).
### Visualizar o código da extensão instalada localmente ### Ver o código-fonte da extensão instalada localmente
As extensões do Chrome instaladas localmente também podem ser inspecionadas. Veja como: As extensões do Chrome instaladas localmente também podem ser inspecionadas. Veja como:
@ -601,56 +652,69 @@ Vá para a Chrome Web Store e baixe a extensão. O arquivo terá uma extensão `
### Use o Modo Desenvolvedor no Chrome ### Use o Modo Desenvolvedor no Chrome
Abra o Chrome e vá para `chrome://extensions/`. Ative o "Modo desenvolvedor" no canto superior direito. Clique em "Carregar extensão descompactada...". Navegue até o diretório da sua extensão. Isso não baixa o código-fonte, mas é útil para visualizar e modificar o código de uma extensão já baixada ou desenvolvida. Abra o Chrome e vá para `chrome://extensions/`. Ative "Modo desenvolvedor" no canto superior direito. Clique em "Carregar extensão descompactada...". Navegue até o diretório da sua extensão. Isso não baixa o código-fonte, mas é útil para visualizar e modificar o código de uma extensão já baixada ou desenvolvida.
## Conjunto de dados do manifesto da extensão do Chrome
Para tentar identificar extensões de navegador vulneráveis, você pode usar o [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) e verificar seus arquivos de manifesto em busca de sinais potencialmente vulneráveis. Por exemplo, para verificar extensões com mais de 25000 usuários, `content_scripts` e a permissão `nativeMessaing`:
{% code overflow="wrap" %}
```bash
# Query example from https://spaceraccoon.dev/universal-code-execution-browser-extensions/
node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.length > 0 && manifest.permissions?.includes('nativeMessaging')"
```
{% endcode %}
## Lista de Verificação de Auditoria de Segurança ## Lista de Verificação de Auditoria de Segurança
Embora as Extensões de Navegador tenham uma **superfície de ataque limitada**, algumas delas podem conter **vulnerabilidades** ou **melhorias potenciais de endurecimento**. As seguintes são as mais comuns: Embora as Extensões de Navegador tenham uma **superfície de ataque limitada**, algumas delas podem conter **vulnerabilidades** ou **potenciais melhorias de endurecimento**. As seguintes são as mais comuns:
* [ ] **Limitar** o máximo possível as **`permissions`** solicitadas * [ ] **Limitar** o máximo possível as **`permissões`** solicitadas
* [ ] **Limitar** o máximo possível as **`host_permissions`** * [ ] **Limitar** o máximo possível as **`host_permissions`**
* [ ] Usar uma **`content_security_policy`** **forte** * [ ] Usar uma **política de segurança de conteúdo** **`strong`**
* [ ] **Limitar** o máximo possível o **`externally_connectable`**, se nenhum for necessário e possível, não deixá-lo por padrão, especificar **`{}`** * [ ] **Limitar** o máximo possível o **`externally_connectable`**, se nenhum for necessário e possível, não deixá-lo por padrão, especificar **`{}`**
* [ ] Se **URL vulnerável a XSS ou a takeover** for mencionada aqui, um atacante poderá **enviar mensagens para os scripts de fundo diretamente**. Um bypass muito poderoso. * [ ] Se **URL vulnerável a XSS ou a takeover** for mencionada aqui, um atacante poderá **enviar mensagens para os scripts de fundo diretamente**. Um bypass muito poderoso.
* [ ] **Limitar** o máximo possível os **`web_accessible_resources`**, mesmo vazios se possível. * [ ] **Limitar** o máximo possível os **`web_accessible_resources`**, mesmo vazios, se possível.
* [ ] Se **`web_accessible_resources`** não for nenhum, verifique por [**ClickJacking**](browext-clickjacking.md) * [ ] Se **`web_accessible_resources`** não for nenhum, verifique [**ClickJacking**](browext-clickjacking.md)
* [ ] Se qualquer **comunicação** ocorrer da **extensão** para a **página da web**, [**verifique por XSS**](browext-xss-example.md) **vulnerabilidades** causadas na comunicação. * [ ] Se qualquer **comunicação** ocorrer da **extensão** para a **página da web**, [**verifique por XSS**](browext-xss-example.md) **vulnerabilidades** causadas na comunicação.
* [ ] Se Post Messages forem usados, verifique por [**vulnerabilidades de Post Message**](../postmessage-vulnerabilities/)**.** * [ ] Se Post Messages forem usados, verifique por [**vulnerabilidades de Post Message**](../postmessage-vulnerabilities/)**.**
* [ ] Se o **Content Script acessar detalhes do DOM**, verifique se eles **não estão introduzindo um XSS** se forem **modificados** pela web * [ ] Se o **Content Script acessar detalhes do DOM**, verifique se eles **não estão introduzindo um XSS** se forem **modificados** pela web
* [ ] Faça uma ênfase especial se essa comunicação também estiver envolvida na **comunicação do Content Script -> script de fundo** * [ ] Faça uma ênfase especial se essa comunicação também estiver envolvida na **comunicação do Content Script -> Script de Fundo**
* [ ] Se o script de fundo estiver se comunicando via **native messaging**, verifique se a comunicação é segura e sanitizada
* [ ] **Informações sensíveis não devem ser armazenadas** dentro do código da Extensão do Navegador * [ ] **Informações sensíveis não devem ser armazenadas** dentro do código da Extensão do Navegador
* [ ] **Informações sensíveis não devem ser armazenadas** dentro da memória da Extensão do Navegador * [ ] **Informações sensíveis não devem ser armazenadas** dentro da memória da Extensão do Navegador
* [ ] **Informações sensíveis não devem ser armazenadas** dentro do **sistema de arquivos sem proteção**
## Ferramentas ## Ferramentas
### [**Tarnish**](https://thehackerblog.com/tarnish/) ### [**Tarnish**](https://thehackerblog.com/tarnish/)
* Extrai qualquer extensão do Chrome a partir de um link fornecido da Chrome Webstore. * Puxa qualquer extensão do Chrome a partir de um link fornecido da Chrome webstore.
* Visualizador de [**manifest.json**](https://developer.chrome.com/extensions/manifest): simplesmente exibe uma versão JSON formatada do manifesto da extensão. * Visualizador de [**manifest.json**](https://developer.chrome.com/extensions/manifest): simplesmente exibe uma versão JSON formatada do manifesto da extensão.
* **Análise de Impressão Digital**: Detecção de [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) e geração automática de JavaScript de impressão digital de extensão do Chrome. * Análise de Impressão Digital: Detecção de [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) e geração automática de JavaScript de impressão digital de extensão do Chrome.
* **Análise Potencial de Clickjacking**: Detecção de páginas HTML de extensão com a diretiva [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) definida. Estas são potencialmente vulneráveis a clickjacking dependendo do propósito das páginas. * Análise de Clickjacking Potencial: Detecção de páginas HTML de extensão com a diretiva [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) definida. Estas são potencialmente vulneráveis a clickjacking dependendo do propósito das páginas.
* Visualizador de **Aviso(s) de Permissão**: que mostra uma lista de todos os avisos de solicitação de permissão do Chrome que serão exibidos quando um usuário tentar instalar a extensão. * Visualizador de Aviso(s) de Permissão: que mostra uma lista de todos os avisos de prompt de permissão do Chrome que serão exibidos quando um usuário tentar instalar a extensão.
* **Função(ões) Perigosa(s)**: mostra a localização de funções perigosas que poderiam potencialmente ser exploradas por um atacante (por exemplo, funções como innerHTML, chrome.tabs.executeScript). * Função(ões) Perigosa(s): mostra a localização de funções perigosas que poderiam potencialmente ser exploradas por um atacante (por exemplo, funções como innerHTML, chrome.tabs.executeScript).
* **Ponto(s) de Entrada**: mostra onde a extensão recebe entrada de usuário/externa. Isso é útil para entender a área de superfície de uma extensão e procurar pontos potenciais para enviar dados maliciosamente elaborados para a extensão. * Ponto(s) de Entrada: mostra onde a extensão recebe entrada de usuário/externa. Isso é útil para entender a área de superfície de uma extensão e procurar pontos potenciais para enviar dados maliciosamente elaborados para a extensão.
* Tanto os scanners de Função(ões) Perigosa(s) quanto de Ponto(s) de Entrada têm o seguinte para seus alertas gerados: * Tanto os scanners de Função(ões) Perigosa(s) quanto de Ponto(s) de Entrada têm o seguinte para seus alertas gerados:
* Trecho de código relevante e linha que causou o alerta. * Trecho de código relevante e linha que causou o alerta.
* Descrição do problema. * Descrição do problema.
* Um botão “Ver Arquivo” para visualizar o arquivo fonte completo contendo o código. * Um botão “Ver Arquivo” para visualizar o arquivo fonte completo contendo o código.
* O caminho do arquivo alertado. * O caminho do arquivo alertado.
* A URI completa da extensão do Chrome do arquivo alertado. * O URI completo da extensão do Chrome do arquivo alertado.
* O tipo de arquivo que é, como um script de Página de Fundo, Script de Conteúdo, Ação do Navegador, etc. * O tipo de arquivo que é, como um script de Página de Fundo, Script de Conteúdo, Ação do Navegador, etc.
* Se a linha vulnerável estiver em um arquivo JavaScript, os caminhos de todas as páginas onde está incluída, bem como o tipo dessas páginas, e o status de [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). * Se a linha vulnerável estiver em um arquivo JavaScript, os caminhos de todas as páginas onde está incluída, bem como o tipo dessas páginas e o status de [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources).
* **Analisador de Política de Segurança de Conteúdo (CSP) e verificador de bypass**: Isso apontará fraquezas na CSP da sua extensão e também iluminará quaisquer maneiras potenciais de contornar sua CSP devido a CDNs na lista branca, etc. * Analisador de Política de Segurança de Conteúdo (CSP) e verificador de bypass: Isso apontará fraquezas na CSP da sua extensão e também iluminará quaisquer maneiras potenciais de contornar sua CSP devido a CDNs na lista branca, etc.
* **Bibliotecas Conhecidas Vulneráveis**: Isso usa [Retire.js](https://retirejs.github.io/retire.js/) para verificar qualquer uso de bibliotecas JavaScript conhecidas como vulneráveis. * Bibliotecas Conhecidas Vulneráveis: Isso usa [Retire.js](https://retirejs.github.io/retire.js/) para verificar qualquer uso de bibliotecas JavaScript conhecidas como vulneráveis.
* Baixar extensão e versões formatadas. * Baixar extensão e versões formatadas.
* Baixar a extensão original. * Baixar a extensão original.
* Baixar uma versão embelezada da extensão (HTML e JavaScript automaticamente formatados). * Baixar uma versão embelezada da extensão (HTML e JavaScript automaticamente formatados).
* Cache automático dos resultados da varredura, executar uma varredura de extensão levará um bom tempo na primeira vez que você a executar. No entanto, na segunda vez, assumindo que a extensão não foi atualizada, será quase instantâneo devido aos resultados estarem em cache. * Cache automático dos resultados da varredura, executar uma varredura de extensão levará um bom tempo na primeira vez que você a executar. No entanto, na segunda vez, assumindo que a extensão não foi atualizada, será quase instantâneo devido aos resultados estarem em cache.
* URLs de Relatório linkáveis, facilmente vincule alguém a um relatório de extensão gerado pelo tarnish. * URLs de Relatório Linkáveis, facilmente vincule alguém a um relatório de extensão gerado pelo tarnish.
### [Neto](https://github.com/elevenpaths/neto) ### [Neto](https://github.com/elevenpaths/neto)
O projeto Neto é um pacote Python 3 concebido para analisar e desvendar recursos ocultos de plugins e extensões de navegadores bem conhecidos, como Firefox e Chrome. Ele automatiza o processo de descompactar os arquivos empacotados para extrair esses recursos de recursos relevantes em uma extensão, como `manifest.json`, pastas de localização ou arquivos de origem JavaScript e HTML. O Projeto Neto é um pacote Python 3 concebido para analisar e desvendar recursos ocultos de plugins e extensões de navegador para navegadores bem conhecidos, como Firefox e Chrome. Ele automatiza o processo de descompactar os arquivos empacotados para extrair esses recursos de recursos relevantes em uma extensão como `manifest.json`, pastas de localização ou arquivos fonte JavaScript e HTML.
## Referências ## Referências
@ -666,8 +730,8 @@ O projeto Neto é um pacote Python 3 concebido para analisar e desvendar recurso
* [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0) * [https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0](https://gist.github.com/LongJohnCoder/9ddf5735df3a4f2e9559665fb864eac0)
{% hint style="success" %} {% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\ Learn & practice AWS Hacking:<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte) Learn & practice GCP Hacking: <img src="../../.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="../../.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details> <details>