mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 23:20:49 +00:00
Translated ['pentesting-web/browser-extension-pentesting-methodology/REA
This commit is contained in:
parent
e940c1a7dd
commit
2b87b8c38e
1 changed files with 115 additions and 51 deletions
|
@ -1,8 +1,8 @@
|
|||
# Metodologia de Pentesting de Extensões de Navegador
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -21,7 +21,7 @@ As extensões de navegador são escritas em JavaScript e carregadas pelo navegad
|
|||
|
||||
## 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>
|
||||
|
||||
|
@ -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**
|
||||
|
||||
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**
|
||||
|
||||
|
@ -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.
|
||||
{% 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.
|
||||
|
||||
|
@ -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.
|
||||
|
||||
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
|
||||
|
||||
{% 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 %}
|
||||
|
||||
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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
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 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>
|
||||
|
||||
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.
|
||||
* **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**.
|
||||
|
||||
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:
|
||||
|
||||
|
@ -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**.
|
||||
|
||||
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
|
||||
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>
|
||||
|
||||
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" %}
|
||||
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 %}
|
||||
|
||||
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" %}
|
||||
[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).
|
||||
|
||||
* 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:
|
||||
```json
|
||||
"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**.
|
||||
|
||||
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 %}
|
||||
|
||||
## Resumo da comunicação
|
||||
|
||||
### 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
|
||||
|
||||
|
@ -419,7 +419,7 @@ console.log("Content script received message from background script:", msg);
|
|||
```
|
||||
</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
|
||||
|
||||
|
@ -429,11 +429,23 @@ chrome.runtime.sendMessage(extensionId, ...
|
|||
```
|
||||
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
|
||||
|
||||
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" %}
|
||||
```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:
|
||||
|
||||
* **`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
|
||||
* **domínio de origem**: pode esperar uma mensagem apenas de uma lista de domínios permitidos.
|
||||
* 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.
|
||||
|
||||
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/" %}
|
||||
[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
|
||||
|
||||
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.
|
||||
|
||||
|
@ -520,7 +532,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
|
|||
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
|
||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||
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.
|
||||
|
||||
## 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
|
||||
|
||||
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**.
|
||||
|
||||
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
|
||||
|
||||
|
@ -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).
|
||||
|
||||
### 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:
|
||||
|
||||
|
@ -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
|
||||
|
||||
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
|
||||
|
||||
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`**
|
||||
* [ ] 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 **`{}`**
|
||||
* [ ] 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.
|
||||
* [ ] Se **`web_accessible_resources`** não for nenhum, verifique por [**ClickJacking**](browext-clickjacking.md)
|
||||
* [ ] **Limitar** o máximo possível os **`web_accessible_resources`**, mesmo vazios, se possível.
|
||||
* [ ] 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 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
|
||||
* [ ] 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 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
|
||||
|
||||
### [**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.
|
||||
* **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.
|
||||
* 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.
|
||||
* **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.
|
||||
* 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 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 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).
|
||||
* 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:
|
||||
* Trecho de código relevante e linha que causou o alerta.
|
||||
* Descrição do problema.
|
||||
* Um botão “Ver Arquivo” para visualizar o arquivo fonte completo contendo o código.
|
||||
* 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.
|
||||
* 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.
|
||||
* **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.
|
||||
* 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.
|
||||
* 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 a extensão original.
|
||||
* 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.
|
||||
* 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)
|
||||
|
||||
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
|
||||
|
||||
|
@ -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)
|
||||
|
||||
{% 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 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 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)
|
||||
|
||||
<details>
|
||||
|
||||
|
|
Loading…
Reference in a new issue