Basic .Net deserialization (ObjectDataProvider gadget, ExpandedWrapper, and Json.Net)
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Αυτή η ανάρτηση είναι αφιερωμένη στο να κατανοήσουμε πώς εκμεταλλεύεται το gadget ObjectDataProvider για να αποκτήσουμε RCE και πώς οι βιβλιοθήκες Serialization Json.Net και xmlSerializer μπορούν να κακοποιηθούν με αυτό το gadget.
Από την τεκμηρίωση: η κλάση ObjectDataProvider περιτυλίγει και δημιουργεί ένα αντικείμενο που μπορείτε να χρησιμοποιήσετε ως πηγή δέσμευσης. Ναι, είναι μια περίεργη εξήγηση, ας δούμε λοιπόν τι έχει αυτή η κλάση που είναι τόσο ενδιαφέρον: Αυτή η κλάση επιτρέπει να περιτυλίξετε ένα αυθαίρετο αντικείμενο, να χρησιμοποιήσετε MethodParameters για να ορίσετε αυθαίρετους παραμέτρους, και στη συνέχεια να χρησιμοποιήσετε το MethodName για να καλέσετε μια αυθαίρετη συνάρτηση του αυθαίρετου αντικειμένου που δηλώνεται χρησιμοποιώντας τις αυθαίρετες παραμέτρους. Επομένως, το αυθαίρετο αντικείμενο θα εκτελέσει μια συνάρτηση με παραμέτρους κατά την αποσυμπίεση.
Ο System.Windows.Data χώρος ονομάτων, που βρίσκεται μέσα στο PresentationFramework.dll στο C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF
, είναι όπου ορίζεται και υλοποιείται το ObjectDataProvider.
Χρησιμοποιώντας dnSpy μπορείτε να επιθεωρήσετε τον κώδικα της κλάσης που μας ενδιαφέρει. Στην παρακάτω εικόνα βλέπουμε τον κώδικα του PresentationFramework.dll --> System.Windows.Data --> ObjectDataProvider --> Method name
Όπως μπορείτε να παρατηρήσετε, όταν οριστεί το MethodName
, καλείται το base.Refresh()
, ας ρίξουμε μια ματιά σε τι κάνει αυτό:
Εντάξει, ας συνεχίσουμε βλέποντας τι κάνει το this.BeginQuery()
. Το BeginQuery
έχει παρακαμφθεί από το ObjectDataProvider
και αυτό είναι που κάνει:
Σημειώστε ότι στο τέλος του κώδικα καλεί το this.QueryWorke(null)
. Ας δούμε τι εκτελεί αυτό:
Σημειώστε ότι αυτό δεν είναι ο πλήρης κώδικας της συνάρτησης QueryWorker
, αλλά δείχνει το ενδιαφέρον μέρος της: Ο κώδικας καλεί this.InvokeMethodOnInstance(out ex);
αυτή είναι η γραμμή όπου καλείται η μέθοδος.
Αν θέλετε να ελέγξετε ότι απλά ορίζοντας το MethodName** θα εκτελείται**, μπορείτε να εκτελέσετε αυτόν τον κώδικα:
Σημειώστε ότι πρέπει να προσθέσετε ως αναφορά C:\Windows\Microsoft.NET\Framework\v4.0.30319\WPF\PresentationFramework.dll προκειμένου να φορτώσετε System.Windows.Data
Χρησιμοποιώντας την προηγούμενη εκμετάλλευση, θα υπάρχουν περιπτώσεις όπου το αντικείμενο θα αποσυμπιεστεί ως μια ObjectDataProvider παρουσία (για παράδειγμα στην ευπάθεια DotNetNuke, χρησιμοποιώντας XmlSerializer, το αντικείμενο αποσυμπιέστηκε χρησιμοποιώντας GetType
). Στη συνέχεια, θα έχουμε καμία γνώση του τύπου του αντικειμένου που είναι περιτυλιγμένο στην ObjectDataProvider παρουσία (Process
για παράδειγμα). Μπορείτε να βρείτε περισσότερες πληροφορίες σχετικά με την ευπάθεια DotNetNuke εδώ.
Αυτή η κλάση επιτρέπει να καθορίσετε τους τύπους αντικειμένων των αντικειμένων που είναι ενσωματωμένα σε μια δεδομένη παρουσία. Έτσι, αυτή η κλάση μπορεί να χρησιμοποιηθεί για να ενσωματώσει ένα αντικείμενο πηγής (ObjectDataProvider) σε έναν νέο τύπο αντικειμένου και να παρέχει τις ιδιότητες που χρειαζόμαστε (ObjectDataProvider.MethodName και ObjectDataProvider.MethodParameters). Αυτό είναι πολύ χρήσιμο για περιπτώσεις όπως αυτή που παρουσιάστηκε προηγουμένως, επειδή θα είμαστε σε θέση να τυλίξουμε _ObjectDataProvider** μέσα σε μια **ExpandedWrapper _ παρουσία και όταν αποσυμπιεστεί αυτή η κλάση θα δημιουργήσει το OjectDataProvider αντικείμενο που θα εκτελέσει τη λειτουργία που υποδεικνύεται στο MethodName.
Μπορείτε να ελέγξετε αυτόν τον περιτυλιγμένο με τον ακόλουθο κώδικα:
Στη επίσημη ιστοσελίδα αναφέρεται ότι αυτή η βιβλιοθήκη επιτρέπει να Σειριοποιήσετε και αποσειριοποιήσετε οποιοδήποτε .NET αντικείμενο με τον ισχυρό σειριοποιητή JSON του Json.NET. Έτσι, αν μπορούσαμε να αποσειριοποιήσουμε το gadget ObjectDataProvider, θα μπορούσαμε να προκαλέσουμε μια RCE απλά αποσειριοποιώντας ένα αντικείμενο.
Πρώτα απ' όλα, ας δούμε ένα παράδειγμα για το πώς να σειριοποιήσετε/αποσειριοποιήσετε ένα αντικείμενο χρησιμοποιώντας αυτή τη βιβλιοθήκη:
Χρησιμοποιώντας το ysoserial.net δημιούργησα την εκμετάλλευση:
Σε αυτόν τον κώδικα μπορείτε να δοκιμάσετε την εκμετάλλευση, απλώς εκτελέστε τον και θα δείτε ότι εκτελείται μια αριθμομηχανή:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)