이번에 리뷰할 취약점은 Apache Tomcat 에서 공격자가 생성한 세션 파일이 역직렬화 되어 RCE(Remote Code Execution) 를 수행할 수 있는 취약점이다. 전제 조건은 다음과 같다.
1. Apache Tomcat 서버의 PersistenceManager가 Filestore를 사용하도록 설정된 경우 |
Apache Tomcat 에서는 PersistenceManager 를 통해 세션 정보를 서버에 파일로 저장할 수 있다. 이 때 데이터를 직렬화하여 저장하게 되고, 이후에 세션을 불러올 때 해당 파일을 역직렬화한다. 때문에 만약 위의 전제 조건을 만족한다면, 정상적인 세션 파일이 아닌 RCE 를 수행할 수 있는 조작된 세션 파일을 역직렬화할 수 있다.
공격 시나리오는 다음과 같다.
1. 공격자가 시스템 명령어를 삽입한 .session 확장자의 직렬화된 파일을 만든다.
2. 취약한 Tomcat 서버에 해당 파일을 업로드한다.
3. 해당 Tomcat 서버의 웹에서 JSESSIONID 를 프록시 툴을 이용하여 업로드 한 세션 파일로 바꾼다. (path traversal 공격 기법 이용)
4. 브라우저는 500 에러로 응답하고, 공격자가 업로드 한 세션 파일이 역직렬화 되면서 시스템 명령어가 실행된다.
취약점 실습
- 실습에 사용하는 파일
1. 취약한 Apache Tomcat 버전 (취약한 설정 포함)
https://github.com/IdealDreamLast/CVE-2020-9484
2. ysoserial.jar - 직렬화 오브젝트 코드를 생성하는 오픈소스 도구
https://github.com/frohoff/ysoserial
이번 실습은 공격자가 .session 파일을 업로드할 수 있는 취약점이 존재한다는 가정하에 Tomcat 서버에 바로 파일을 만들 것이다. 먼저 ysoserial.jar 를 통해 시스템 명령어를 삽입한 직렬화된 vuln.session 파일을 만든다.
그리고 나서, 다운로드 받은 톰캣 서버를 실행한다.
해당 웹 서버의 패킷을 burp suite 로 잡아서 Repeater 기능을 이용하여 path travasal 을 시도한 결과, ../ 를 6번 이상 입력하여 저장한 세션 파일을 지정해 주었을 때 500 에러가 발생하는 것을 확인할 수 있다. 참고로 서버에서 알아서 .session 파일을 찾아주기 때문에 파일명만 입력해주면 된다.
vuln.session 에 저장한 "touch /tmp/rce" 명령이 잘 수행되었는지 확인하기 위해 Tomcat 서버로 가서 확인해보자.
위와 같이 rce 라는 파일이 생성된 것을 확인할 수 있다.
영향을 받는 버전과 최신 버전
- Apache Tomcat 10점대 버전 : 10.0.0-M5(최신버전) 미만 버전
- Apache Tomcat 9점대 버전 : 9.0.35(최신버전) 미만 버전
- Apache Tomcat 8점대 버전 : 8.5.55(최신버전) 미만 버전
- Apache Tomcat 7점대 버전 : 7.0.104(최신버전) 미만 버전
참고 사이트
https://github.com/IdealDreamLast/CVE-2020-9484
https://www.krcert.or.kr/data/secNoticeView.do?bulletin_writing_sequence=35435