Μοιραστείτε τα χάκινγκ κόλπα σας υποβάλλοντας PRs σταHackTricks και HackTricks Cloud αποθετήρια στο GitHub.
Χρησιμοποιήστε το Trickest για να δημιουργήσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία κοινότητας στον κόσμο.
Αποκτήστε πρόσβαση σήμερα:
Βασικές Πληροφορίες
Η Απομακρυσμένη Κλήση Μεθόδων Java, ή Java RMI, είναι ένα μηχανισμός αντικειμενοστραφούς RPC που επιτρέπει σε ένα αντικείμενο που βρίσκεται σε μία εικονική μηχανή Java να καλεί μεθόδους σε ένα άλλο αντικείμενο που βρίσκεται σε μια άλλη εικονική μηχανή Java. Αυτό επιτρέπει στους προγραμματιστές να γράφουν κατανεμημένες εφαρμογές χρησιμοποιώντας ένα αντικειμενοστραφή παράδειγμα. Μια σύντομη εισαγωγή στο Java RMI από μια επιθετική οπτική γωνία μπορεί να βρεθεί σε αυτήν την ομιλία του blackhat.
PORT STATE SERVICE VERSION
1090/tcp open ssl/java-rmi Java RMI
9010/tcp open java-rmi Java RMI
37471/tcp open java-rmi Java RMI
40259/tcp open ssl/java-rmi Java RMI
Συνήθως, μόνο τα προεπιλεγμένα στοιχεία Java RMI (το RMI Registry και το Activation System) είναι συνδεδεμένα σε κοινές θύρες. Τα απομακρυσμένα αντικείμενα που υλοποιούν την πραγματική εφαρμογή RMI συνήθως συνδέονται σε τυχαίες θύρες όπως φαίνεται στην παραπάνω έξοδο.
Το nmap μερικές φορές αντιμετωπίζει προβλήματα στο να αναγνωρίσει υπηρεσίες SSL που προστατεύονται με RMI. Αν αντιμετωπίσετε μια άγνωστη υπηρεσία ssl σε μια κοινή RMI θύρα, θα πρέπει να εξετάσετε περαιτέρω.
Στοιχεία RMI
Απλά, το Java RMI επιτρέπει σε έναν προγραμματιστή να κάνει ένα αντικείμενο Java διαθέσιμο στο δίκτυο. Αυτό ανοίγει μια TCP θύρα όπου οι πελάτες μπορούν να συνδεθούν και να καλέσουν μεθόδους στο αντίστοιχο αντικείμενο. Παρόλο που αυτό ακούγεται απλό, υπάρχουν αρκετές προκλήσεις που το Java RMI πρέπει να λύσει:
Για να διαβιβάσει μια κλήση μεθόδου μέσω Java RMI, οι πελάτες πρέπει να γνωρίζουν τη διεύθυνση IP, τη θύρα ακρόασης, την υλοποιημένη κλάση ή διεπαφή και το ObjID του στοχευμένου αντικειμένου (το ObjID είναι ένα μοναδικό και τυχαίο αναγνωριστικό που δημιουργείται όταν το αντικείμενο γίνεται διαθέσιμο στο δίκτυο. Απαιτείται επειδή το Java RMI επιτρέπει σε πολλά αντικείμενα να ακούνε στην ίδια TCP θύρα).
Οι απομακρυσμένοι πελάτες μπορεί να δεσμεύουν πόρους στον εξυπηρετητή καλώντας μεθόδους στο εκτεθέν αντικείμενο. Η Java virtual machine πρέπει να παρακολουθεί ποιοι από αυτούς τους πόρους εξακολουθούν να χρησιμοποιούνται και ποιοι μπορούν να είναι αντικείμενα συλλογής σκουπιδιών.
Η πρώτη πρόκληση λύνεται από το RMI registry, το οποίο είναι βασικά ένα υπηρεσία ονοματοδότησης για το Java RMI. Το ίδιο το RMI registry είναι επίσης μια υπηρεσία RMI, αλλά η υλοποιημένη διεπαφή και το ObjID είναι σταθερά και γνωστά από όλους τους πελάτες RMI. Αυτό επιτρέπει στους πελάτες RMI να καταναλώνουν το RMI registry απλώς γνωρίζοντας την αντίστοιχη TCP θύρα.
Όταν οι προγραμματιστές θέλουν να κάνουν τα Java αντικείμενά τους διαθέσιμα στο δίκτυο, συνήθως τα συνδέουν σε ένα RMI registry. Το registry αποθηκεύει όλες τις πληροφορίες που απαιτούνται για τη σύνδεση με το αντικείμενο (διεύθυνση IP, θύρα ακρόασης, υλοποιημένη κλάση ή διεπαφή και η τιμή ObjID) και τις καθιστά διαθέσιμες υπό ένα ανθρώπινα αναγνώσιμο όνομα (το bound name). Οι πελάτες που θέλουν να καταναλώσουν την υπηρεσία RMI ζητούν από το RMI registry το αντίστοιχο bound name και το registry επιστρέφει όλες τις απαιτούμενες πληροφορίες για σύνδεση. Έτσι, η κατάσταση είναι βασικά η ίδια με μια συνηθισμένη υπηρεσία DNS. Το παρακάτω παράδειγμα δείχνει ένα μικρό παράδειγμα:
importjava.rmi.registry.Registry;importjava.rmi.registry.LocateRegistry;importlab.example.rmi.interfaces.RemoteService;publicclassExampleClient {privatestaticfinalString remoteHost ="172.17.0.2";privatestaticfinalString boundName ="remote-service";publicstaticvoidmain(String[] args){try {Registry registry =LocateRegistry.getRegistry(remoteHost); // Connect to the RMI registryRemoteService ref = (RemoteService)registry.lookup(boundName); // Lookup the desired bound nameString response =ref.remoteMethod(); // Call a remote method} catch( Exception e) {e.printStackTrace();}}}
Το δεύτερο από τα παραπάνω αναφερόμενα προβλήματα λύνεται από τον Κατανεμημένο Συλλέκτη Σκουπιδιών (DGC). Αυτή είναι μια άλλη υπηρεσία RMI με μια γνωστή τιμή ObjID και είναι διαθέσιμη σε βασικά κάθε RMI σημείο πρόσβασης. Όταν ένας πελάτης RMI αρχίζει να χρησιμοποιεί μια υπηρεσία RMI, στέλνει μια πληροφορία στον DGC ότι το αντίστοιχο απομακρυσμένο αντικείμενο χρησιμοποιείται. Ο DGC μπορεί τότε να παρακολουθεί τον μετρητή αναφορών και να καθαρίζει τα ανεκχώρητα αντικείμενα.
Μαζί με το αποσιωπημένο Σύστημα Ενεργοποίησης, αυτά είναι τα τρία προεπιλεγμένα στοιχεία του Java RMI:
Το Μητρώο RMI (ObjID = 0)
Το Σύστημα Ενεργοποίησης (ObjID = 1)
Ο Κατανεμημένος Συλλέκτης Σκουπιδιών (ObjID = 2)
Τα προεπιλεγμένα στοιχεία του Java RMI έχουν γνωστά σημεία επίθεσης για αρκετό καιρό και υπάρχουν πολλαπλές ευπάθειες σε απαρχαιωμένες εκδόσεις Java. Από την άποψη του επιτιθέμενου, αυτά τα προεπιλεγμένα στοιχεία είναι ενδιαφέροντα, επειδή υλοποιούν γνωστές κλάσεις / διεπαφές και είναι εύκολο να αλληλεπιδράσετε μαζί τους. Αυτή η κατάσταση είναι διαφορετική για προσαρμοσμένες υπηρεσίες RMI. Για να καλέσετε έναν μέθοδο σε ένα απομακρυσμένο αντικείμενο, πρέπει να γνωρίζετε εκ των προτέρων την αντίστοιχη υπογραφή μεθόδου. Χωρίς να γνωρίζετε μια υπάρχουσα υπογραφή μεθόδου, δεν υπάρχει τρόπος επικοινωνίας με μια υπηρεσία RMI.
Απαρίθμηση RMI
remote-method-guesser είναι ένα εργαλείο σάρωσης ευπαθειών Java RMI που είναι ικανό να αναγνωρίζει αυτόματα κοινές ευπαθείες RMI. Όποτε εντοπίσετε ένα RMI σημείο πρόσβασης, θα πρέπει να το δοκιμάσετε:
$ rmg enum 172.17.0.2 9010
[+] RMI registry bound names:
[+]
[+] - plain-server2
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff7, 3638117546492248534]
[+] - legacy-service
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ffc, 708796783031663206]
[+] - plain-server
[+] --> de.qtc.rmg.server.interfaces.IPlainServer (unknown class)
[+] Endpoint: iinsecure.dev:37471 TLS: no ObjID: [55ff5a5d:17e0501b054:-7ff8, -4004948013687638236]
[+]
[+] RMI server codebase enumeration:
[+]
[+] - http://iinsecure.dev/well-hidden-development-folder/
[+] --> de.qtc.rmg.server.legacy.LegacyServiceImpl_Stub
[+] --> de.qtc.rmg.server.interfaces.IPlainServer
[+]
[+] RMI server String unmarshalling enumeration:
[+]
[+] - Caught ClassNotFoundException during lookup call.
[+] --> The type java.lang.String is unmarshalled via readObject().
[+] Configuration Status: Outdated
[+]
[+] RMI server useCodebaseOnly enumeration:
[+]
[+] - Caught MalformedURLException during lookup call.
[+] --> The server attempted to parse the provided codebase (useCodebaseOnly=false).
[+] Configuration Status: Non Default
[+]
[+] RMI registry localhost bypass enumeration (CVE-2019-2684):
[+]
[+] - Caught NotBoundException during unbind call (unbind was accepeted).
[+] Vulnerability Status: Vulnerable
[+]
[+] RMI Security Manager enumeration:
[+]
[+] - Security Manager rejected access to the class loader.
[+] --> The server does use a Security Manager.
[+] Configuration Status: Current Default
[+]
[+] RMI server JEP290 enumeration:
[+]
[+] - DGC rejected deserialization of java.util.HashMap (JEP290 is installed).
[+] Vulnerability Status: Non Vulnerable
[+]
[+] RMI registry JEP290 bypass enmeration:
[+]
[+] - Caught IllegalArgumentException after sending An Trinh gadget.
[+] Vulnerability Status: Vulnerable
[+]
[+] RMI ActivationSystem enumeration:
[+]
[+] - Caught IllegalArgumentException during activate call (activator is present).
[+] --> Deserialization allowed - Vulnerability Status: Vulnerable
[+] --> Client codebase enabled - Configuration Status: Non Default
Η έξοδος της ενέργειας απαρίθμησης εξηγείται λεπτομερώς στις σελίδες τεκμηρίωσης του έργου. Ανάλογα με το αποτέλεσμα, θα πρέπει να προσπαθήσετε να επαληθεύσετε τις εντοπισμένες ευπαθείες.
Οι τιμές ObjID που εμφανίζονται από το remote-method-guesser μπορούν να χρησιμοποιηθούν για να προσδιοριστεί ο χρόνος λειτουργίας της υπηρεσίας. Αυτό μπορεί να βοηθήσει στην εντοπισμό άλλων ευπαθειών:
Ακόμα και όταν δεν έχουν εντοπιστεί ευπαθείες κατά τη διάρκεια της απαρίθμησης, οι διαθέσιμες υπηρεσίες RMI ενδέχεται να αποκαλύπτουν επικίνδυνες λειτουργίες. Επιπλέον, παρόλο που η επικοινωνία RMI με τα προεπιλεγμένα στοιχεία RMI προστατεύεται από φίλτρα αποσειριοποίησης, όταν γίνεται λόγος για προσαρμοσμένες υπηρεσίες RMI, τέτοια φίλτρα συνήθως δεν υπάρχουν. Η γνώση των έγκυρων υπογραφών μεθόδων στις υπηρεσίες RMI είναι επομένως πολύτιμη.
Δυστυχώς, το Java RMI δεν υποστηρίζει την απαρίθμηση μεθόδων σε απομακρυσμένα αντικείμενα. Ωστόσο, είναι δυνατόν να εξαναγκαστεί η υπογραφή μεθόδων με εργαλεία όπως το remote-method-guesser ή το rmiscout:
Εκτός από τη μάντεψη, θα πρέπει επίσης να ψάξετε σε μηχανές αναζήτησης ή στο GitHub για τη διεπαφή ή ακόμα και την υλοποίηση μιας συναντηθείσας υπηρεσίας RMI. Το bound name και το όνομα της υλοποιημένης κλάσης ή διεπαφής μπορεί να είναι χρήσιμα εδώ.
Γνωστές Διεπαφές
Το remote-method-guesser επισημαίνει κλάσεις ή διεπαφές ως γνωστές εάν αναφέρονται στην εσωτερική βάση δεδομένων του εργαλείου για γνωστές υπηρεσίες RMI. Σε αυτές τις περιπτώσεις μπορείτε να χρησιμοποιήσετε την ενέργεια γνωστή για να λάβετε περισσότερες πληροφορίες σχετικά με την αντίστοιχη υπηρεσία RMI:
$ rmg enum 172.17.0.2 1090 | head -n 5
[+] RMI registry bound names:
[+]
[+] - jmxrmi
[+] --> javax.management.remote.rmi.RMIServerImpl_Stub (known class: JMX Server)
[+] Endpoint: localhost:41695 TLS: no ObjID: [7e384a4f:17e0546f16f:-7ffe, -553451807350957585]
$ rmg known javax.management.remote.rmi.RMIServerImpl_Stub
[+] Name:
[+] JMX Server
[+]
[+] Class Name:
[+] - javax.management.remote.rmi.RMIServerImpl_Stub
[+] - javax.management.remote.rmi.RMIServer
[+]
[+] Description:
[+] Java Management Extensions (JMX) can be used to monitor and manage a running Java virtual machine.
[+] This remote object is the entrypoint for initiating a JMX connection. Clients call the newClient
[+] method usually passing a HashMap that contains connection options (e.g. credentials). The return
[+] value (RMIConnection object) is another remote object that is when used to perform JMX related
[+] actions. JMX uses the randomly assigned ObjID of the RMIConnection object as a session id.
[+]
[+] Remote Methods:
[+] - String getVersion()
[+] - javax.management.remote.rmi.RMIConnection newClient(Object params)
[+]
[+] References:
[+] - https://docs.oracle.com/javase/8/docs/technotes/guides/management/agent.html
[+] - https://github.com/openjdk/jdk/tree/master/src/java.management.rmi/share/classes/javax/management/remote/rmi
[+]
[+] Vulnerabilities:
[+]
[+] -----------------------------------
[+] Name:
[+] MLet
[+]
[+] Description:
[+] MLet is the name of an MBean that is usually available on JMX servers. It can be used to load
[+] other MBeans dynamically from user specified codebase locations (URLs). Access to the MLet MBean
[+] is therefore most of the time equivalent to remote code execution.
[+]
[+] References:
[+] - https://github.com/qtc-de/beanshooter
[+]
[+] -----------------------------------
[+] Name:
[+] Deserialization
[+]
[+] Description:
[+] Before CVE-2016-3427 got resolved, JMX accepted arbitrary objects during a call to the newClient
[+] method, resulting in insecure deserialization of untrusted objects. Despite being fixed, the
[+] actual JMX communication using the RMIConnection object is not filtered. Therefore, if you can
[+] establish a working JMX connection, you can also perform deserialization attacks.
[+]
[+] References:
[+] - https://github.com/qtc-de/beanshooter
Protocol_Name: Java RMI #Protocol Abbreviation if there is one.
Port_Number: 1090,1098,1099,1199,4443-4446,8999-9010,9999 #Comma separated if there is more than one.
Protocol_Description: Java Remote Method Invocation #Protocol Abbreviation Spelled out
Entry_1:
Name: Enumeration
Description: Perform basic enumeration of an RMI service
Command: rmg enum {IP} {PORT}
Χρησιμοποιήστε το Trickest για να κατασκευάσετε εύκολα και να αυτοματοποιήσετε ροές εργασίας με τα πιο προηγμένα εργαλεία της κοινότητας.
Αποκτήστε πρόσβαση σήμερα: