Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
Αίτηση DNS κατά την αποσυσκευοθέτηση
Η κλάση java.net.URL
υλοποιεί το Serializable
, αυτό σημαίνει ότι αυτή η κλάση μπορεί να αποσυσκευοθετηθεί.
Αυτή η κλάση έχει ένα περίεργο συμπεριφορά. Σύμφωνα με την τεκμηρίωση: "Δύο κόμβοι θεωρούνται ισοδύναμοι εάν και οι δύο ονομασίες κόμβων μπορούν να αναλυθούν στις ίδιες διευθύνσεις IP".
Έτσι, κάθε φορά που ένα αντικείμενο URL καλεί οποιαδήποτε από τις συναρτήσεις equals
ή hashCode
, θα αποστέλλεται ένα αίτημα DNS για να ληφθεί η διεύθυνση IP.
Είναι αρκετά εύκολο να καλέσετε τη συνάρτηση hashCode
από ένα αντικείμενο URL, αρκεί να εισάγετε αυτό το αντικείμενο μέσα σε ένα HashMap
που θα αποδημιουργηθεί. Αυτό συμβαίνει επειδή στο τέλος της συνάρτησης readObject
από το HashMap
, εκτελείται ο παρακάτω κώδικας:
Θα εκτελέσει την putVal
με κάθε τιμή μέσα στο HashMap
. Ωστόσο, πιο σημαντική είναι η κλήση της hash
με κάθε τιμή. Αυτός είναι ο κώδικας της συνάρτησης hash
:
Όπως μπορείτε να παρατηρήσετε, κατά την αποσειριοποίηση ενός HashMap
, η συνάρτηση hash
θα εκτελεστεί με κάθε αντικείμενο και κατά τη διάρκεια της εκτέλεσης της hash
, θα εκτελεστεί το .hashCode()
του αντικειμένου. Επομένως, αν αποσειριοποιήσετε ένα HashMap
που περιέχει ένα αντικείμενο URL, το αντικείμενο URL θα εκτελέσει το .hashCode()
.
Τώρα, ας ρίξουμε μια ματιά στον κώδικα του URLObject.hashCode()
:
Όπως μπορείτε να δείτε, όταν ένα URLObject
εκτελεί την .hashCode()
, καλείται hashCode(this)
. Συνεχίζοντας, μπορείτε να δείτε τον κώδικα αυτής της συνάρτησης:
Μπορείτε να δείτε ότι εκτελείται ένα getHostAddress
στον τομέα, εκτελώντας ένα ερώτημα DNS.
Επομένως, αυτή η κλάση μπορεί να καταχραστεί για να εκτελέσει ένα ερώτημα DNS για να αποδείξει ότι η αποσυσκευοποίηση είναι δυνατή, ή ακόμα και για να εξαφανίσει πληροφορίες (μπορείτε να προσθέσετε ως υποτομέα την έξοδο ενός εκτελέσιμου εντολών).
Παράδειγμα κώδικα πληρωμής URLDNS
Μπορείτε να βρείτε τον κώδικα πληρωμής URDNS από το ysoserial εδώ. Ωστόσο, απλά για να το κατανοήσετε ευκολότερα πώς να το κωδικοποιήσετε, δημιούργησα το δικό μου PoC (βασισμένο στο PoC του ysoserial):
Περισσότερες πληροφορίες
Στην αρχική ιδέα, το payload της commons collections άλλαξε για να εκτελέσει μια αναζήτηση DNS, αυτό ήταν λιγότερο αξιόπιστο από την προτεινόμενη μέθοδο, αλλά αυτή είναι η ανάρτηση: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
GadgetProbe
Μπορείτε να κατεβάσετε το GadgetProbe από το Burp Suite App Store (Extender).
Το GadgetProbe θα προσπαθήσει να καταλάβει αν κάποιες κλάσεις Java υπάρχουν στην κλάση Java του διακομιστή, έτσι ώστε να μπορείτε να γνωρίζετε αν είναι ευάλωτος σε κάποια γνωστή εκμετάλλευση.
Πώς λειτουργεί
Το GadgetProbe θα χρησιμοποιήσει το ίδιο DNS payload της προηγούμενης ενότητας, αλλά πριν από την εκτέλεση του DNS query θα προσπαθήσει να αποσειριοποιήσει μια αυθαίρετη κλάση. Αν η αυθαίρετη κλάση υπάρχει, το DNS query θα αποσταλεί και το GadgetProbe θα σημειώσει ότι αυτή η κλάση υπάρχει. Αν το αίτημα DNS δεν αποσταλεί ποτέ, αυτό σημαίνει ότι η αυθαίρετη κλάση δεν αποσειριοποιήθηκε με επιτυχία, οπότε είτε δεν υπάρχει είτε δεν είναι αποσειριοποιήσιμη/εκμεταλλεύσιμη.
Μέσα στο github, το GadgetProbe έχει μερικά wordlists με κλάσεις Java για να δοκιμαστούν.
Περισσότερες πληροφορίες
Σαρωτής Αποσειριοποίησης Java
Αυτός ο σαρωτής μπορεί να κατεβάσει από το Burp App Store (Extender). Η επέκταση έχει παθητικές και ενεργές δυνατότητες.
Παθητικές
Από προεπιλογή ελέγχει παθητικά όλα τα αιτήματα και τις απαντήσεις που στέλνονται ψάχνοντας για μαγικά bytes αποσειριοποίησης Java και θα εμφανίσει μια προειδοποίηση ευπάθειας αν βρεθεί οποιοδήποτε:
Ενεργές
Χειροκίνητος Έλεγχος
Μπορείτε να επιλέξετε ένα αίτημα, δεξί κλικ και Αποστολή αιτήματος στο DS - Χειροκίνητος Έλεγχος
.
Στη συνέχεια, μέσα στην καρτέλα Deserialization Scanner --> Καρτέλα Χειροκίνητου ελέγχου μπορείτε να επιλέξετε το σημείο εισαγωγής. Και ξεκινήστε τον έλεγχο (Επιλέξτε την κατάλληλη επίθεση ανάλογα με τη χρήση κωδικοποίησης).
Ακόμη κι αν αυτό ονομάζεται "Χειροκίνητος Έλεγχος", είναι αρκετά αυτοματοποιημένος. Θα ελέγξει αυτόματα αν η αποσειριοποίηση είναι ευάλωτη σε οποιοδήποτε ysoserial payload ελέγχοντας τις βιβλιοθήκες που υπάρχουν στον web server και θα επισημάνει τις ευάλωτες. Για να ελέγξετε για ευάλωτες βιβλιοθήκες μπορείτε να επιλέξετε να εκτελέσετε Javas Sleeps, sleeps μέσω κατανάλωσης CPU, ή χρησιμοποιώντας DNS όπως αναφέρθηκε προηγουμένως.
Εκμετάλλευση
Αφού εντοπίσετε μια ευάλωτη βιβλιοθήκη, μπορείτε να στείλετε το αίτημα στην καρτέλα Εκμετάλλευση. Σε αυτήν την καρτέλα πρέπει να επιλέξετε ξανά το σημείο εισαγωγής, να γράψετε την ευάλωτη βιβλιοθήκη για την οποία θέλετε να δημιουργήσετε ένα payload, και την εντολή. Στη συνέχεια, απλά πατήστε το κατάλληλο κουμπί Attack.
Πληροφορίες Αποσειριοποίησης Java DNS Exfil
Κάντε το payload σας να εκτελέσει κάτι παρόμοιο με το παρακάτω:
Περισσότερες Πληροφορίες
Last updated