
完全にリファクタリングされ、Python 3 互換の Tomcat Ghostcat (CVE-2020-1938 / CNVD-2020-10487) AJP ローカルファイルインクルージョン用エクスプロイトスクリプト
本プロジェクトは、Apache Tomcat AJP プロトコルのローカルファイルインクルージョン脆弱性(通称 Ghostcat、CVE-2020-1938 / CNVD-2020-10487)を検証するための Python 検証スクリプトを提供します。
このスクリプトは、最初に流布された Python 2 バージョンをベースに全面的にリファクタリングおよび修正を加え、Python 3 環境に完全対応しています。StringIO、base64 エンコーディング、およびバイナリデータと文字列の連結における互換性問題を修正し、最新のオペレーティングシステム上での安定性を向上させています。
Apache Tomcat が AJP(Apache JServ Protocol)プロトコルを処理する際、デフォルトで 8009 ポートが開放されており、受信したリクエスト属性に対する厳格なセキュリティ検証が行われません。攻撃者は細工された AJP リクエストを構築し、javax.servlet.include.request_uri、javax.servlet.include.path_info、javax.servlet.include.servlet_path などの属性を注入することで、以下の攻撃が可能になります:
DefaultServlet を騙し、Web アプリケーションディレクトリ内の任意のファイル(例:、設定ファイルなど)を読み取ります。WEB-INF/web.xmlJspServlet にそのファイルを強制的に JSP として解析・コンパイルさせることで、リモートコマンド実行を実現します。注:本脆弱性はローカルファイルインクルージョン(LFI)のみサポートし、直接的なリモートファイルインクルージョン(RFI)はサポートしていません。
コマンドライン構文:
python CNVD-2020-10487-Tomcat-Ajp-lfi.py <対象IP> [-p 対象ポート] [-f 対象ファイルパス]
target (必須): 対象ホストの IP アドレスまたはドメイン名。-p, --port (オプション): AJP ポート、デフォルトは 8009。-f, --file (オプション): 読み取りたい対象ファイルの相対パス、デフォルトは WEB-INF/web.xml。基本検出(デフォルトの web.xml を読み取り):
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 127.0.0.1
ポートとファイルの指定(カスタム設定ファイルを読み取り):
python CNVD-2020-10487-Tomcat-Ajp-lfi.py 192.168.1.100 -p 8009 -f WEB-INF/classes/application.properties
対象のシステムがこの脆弱性の影響を受ける場合、以下の防御措置を直ちに実施することを推奨します:
conf/server.xml 内の <Connector port="8009" protocol="AJP/1.3" ... /> 設定をコメントアウトまたは削除してください。requiredSecret(Tomcat 8.5.51/9.0.31 以降では secret)属性を追加し、強制的に認証を行ってください。本スクリプトはサイバーセキュリティ研究、教育、および企業内部でのコンプライアンスに基づくセキュリティ監査専用です。 許可されていない対象に対して本スクリプトを使用した不正な探索や攻撃を行わないでください。使用者は本スクリプトを使用する際に現地の法令を遵守しなければならず、不適切な使用または違法な使用によって生じた一切の結果は使用者自身が負うものとします。