Java DNS Deserialization, GadgetProbe and Java Deserialization Scanner
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)
Η κλάση 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
στο domain, εκκινώντας ένα DNS query.
Επομένως, αυτή η κλάση μπορεί να καταχραστεί προκειμένου να εκκινήσει ένα DNS query για να δείξει ότι είναι δυνατή η deserialization, ή ακόμα και για να εξάγει πληροφορίες (μπορείτε να προσθέσετε ως υποτομέα την έξοδο μιας εκτέλεσης εντολής).
Μπορείτε να βρείτε τον κώδικα payload URDNS από το ysoserial εδώ. Ωστόσο, απλά για να διευκολύνω την κατανόηση του πώς να το κωδικοποιήσετε, δημιούργησα το δικό μου PoC (βασισμένο σε αυτό από το ysoserial):
Στην αρχική ιδέα, το payload των commons collections άλλαξε για να εκτελέσει ένα DNS query, αυτό ήταν λιγότερο αξιόπιστο από τη προτεινόμενη μέθοδο, αλλά αυτή είναι η ανάρτηση: https://www.gosecure.net/blog/2017/03/22/detecting-deserialization-bugs-with-dns-exfiltration/
Μπορείτε να κατεβάσετε GadgetProbe από το Burp Suite App Store (Extender).
GadgetProbe θα προσπαθήσει να καταλάβει αν κάποιες Java κλάσεις υπάρχουν στην Java κλάση του διακομιστή ώστε να γνωρίζετε αν είναι ευάλωτη σε κάποια γνωστή εκμετάλλευση.
GadgetProbe θα χρησιμοποιήσει το ίδιο DNS payload της προηγούμενης ενότητας αλλά πριν εκτελέσει το DNS query θα προσπαθήσει να αποσειρικοποιήσει μια αυθαίρετη κλάση. Αν η αυθαίρετη κλάση υπάρχει, το DNS query θα σταλεί και το GadgetProbe θα σημειώσει ότι αυτή η κλάση υπάρχει. Αν το DNS αίτημα ποτέ δεν σταλεί, αυτό σημαίνει ότι η αυθαίρετη κλάση δεν αποσειρικοποιήθηκε επιτυχώς, οπότε είτε δεν είναι παρούσα είτε δεν είναι σειριοποιήσιμη/εκμεταλλεύσιμη.
Μέσα στο github, GadgetProbe έχει κάποιες λίστες λέξεων με Java κλάσεις για δοκιμή.
Αυτός ο σαρωτής μπορεί να κατέβει από το Burp App Store (Extender). Η επέκταση έχει παθητικές και ενεργές ικανότητες.
Από προεπιλογή, ελέγχει παθητικά όλα τα αιτήματα και τις απαντήσεις που αποστέλλονται αναζητώντας Java σειριοποιημένα μαγικά bytes και θα παρουσιάσει μια προειδοποίηση ευπάθειας αν βρεθεί κάποια:
Χειροκίνητη Δοκιμή
Μπορείτε να επιλέξετε ένα αίτημα, να κάνετε δεξί κλικ και Send request to DS - Manual Testing
.
Στη συνέχεια, μέσα στην καρτέλα Deserialization Scanner Tab --> Manual testing tab μπορείτε να επιλέξετε το σημείο εισαγωγής. Και να ξεκινήσετε τη δοκιμή (Επιλέξτε την κατάλληλη επίθεση ανάλογα με την κωδικοποίηση που χρησιμοποιείται).
Ακόμα και αν αυτό ονομάζεται "Χειροκίνητη δοκιμή", είναι αρκετά αυτοματοποιημένο. Θα ελέγξει αυτόματα αν η αποσειριοποίηση είναι ευάλωτη σε οποιοδήποτε ysoserial payload ελέγχοντας τις βιβλιοθήκες που είναι παρούσες στον διακομιστή ιστού και θα επισημάνει αυτές που είναι ευάλωτες. Για να ελέγξετε για ευάλωτες βιβλιοθήκες μπορείτε να επιλέξετε να εκκινήσετε Javas Sleeps, sleeps μέσω κατανάλωσης CPU, ή χρησιμοποιώντας DNS όπως έχει αναφερθεί προηγουμένως.
Εκμετάλλευση
Αφού έχετε εντοπίσει μια ευάλωτη βιβλιοθήκη μπορείτε να στείλετε το αίτημα στην καρτέλα Exploiting Tab. Σε αυτή την καρτέλα πρέπει να επιλέξετε ξανά το σημείο εισαγωγής, να γράψετε τη ευάλωτη βιβλιοθήκη για την οποία θέλετε να δημιουργήσετε ένα payload, και την εντολή. Στη συνέχεια, απλώς πατήστε το κατάλληλο κουμπί Επίθεσης.
Κάντε το payload σας να εκτελέσει κάτι σαν το εξής:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)