아파치 톰캣(Apache Tomcat)은 아파치 소프트웨어 재단에서 만든 자바 서블릿 및 JSP 기술 구현을 위한 웹 어플리케이션 서버 오픈 소스 도구이다.
2017년 9월 말, 7.x 버전에서 취약점이 발견된 CVE 취약점 번호인 CVE-2017-12617에 이어 2017년 10월 초, 모든 버전에서 취약점이 발견되었으며, CVE-2017-12617로 명명되었다.
해당 취약점은 PUT 메소드가 활성화된 서버에 조작된 파일을 업로드 및 실행이 가능한 취약점이다.
대상
영향을 받는 버전의 7.x ~ 9.x 버전을 사용하는 모든 시스템에 위험이 노출되어 있다.
구분 | 제품명 | 버전 |
취약한 대상 | Apache Tomcat | 9.0.0.M1 ~ 9.0.0 8.5.0 ~ 8.5.22 8.0.0.RC1 ~ 8.0.46 7.0.0 ~ 7.0.81 |
권고 대상 | Apache Tomcat | 9.0.1 8.0.47, 8.5.23 7.0.82 |
환경 설정
취약점 공격에 앞서 아파치 톰캣을 공격 조건과 동일한 환경으로 구성한다.
해당 취약점은 PUT 메소드를 이용하여 조작된 파일이 업로드될 때 발생되므로 web.xml 소스 코드에서 기본 서블릿의 읽기 전용 초기화 변수를 "false"로 설정한다.
○ web.xml : 톰캣 루트 디렉토리 > conf > web.xml
읽기 전용 초기화 변수 |
아파치 톰캣은 기본적으로 PUT, DELETE 등 불필요한 메소드가 비활성화 되어 있다. web.xml 소스 코드를 보면 기본 서블릿 위에 주석이 되어있지만, 해당 메소드를 활성화하려면 readonly 변수를 "false"로 설정하면 된다. 기본적으로 비활성화 되어 있는 메소드가 활성화된 이유는 개발자가 만든 소스코드 파일을 업로드 및 삭제 등의 작업을 좀 더 편하게 하기 위해 설정해 놓은 것으로 보인다. |
취약점 공격
PUT 메소드가 활성화 되어 있으므로 PUT 메소드를 이용해 jsp 파일을 업로드한다.
요청 URL을 /test1.jsp로 변경 후 서버로 요청하면 404 응답 코드가 반환 된다. CVE-2017-12615 취약점 공격 패턴(%20, ::$data)을 대입해도 동일한 에러가 발생한다.
기본적으로 존재하지 않는 jsp 파일을 업로드할 때, 서버는 확장자 검사를 한다. "%20", "::$data"는 확장자 검사를 우회(확장자 뒤에 특수 문자 제거)할 수 있는 패턴이지만, 해당 버전에서 우회가 되지 않는다.
확장자 검사를 우회할 수 있는 패턴 중 하나인 "/"를 붙여 요청하면 201 응답 코드가 반환된다.
정상적으로 파일이 업로드 및 실행되는지 확인하기 위해 GET 메소드를 이용해 test1.jsp 파일을 요청하면 test1.jsp 파일이 실행된다.
아파치 톰캣 취약점 진단 및 원격 실행 공격을 자동화할 수 있는 메타스플로잇 프레임워크를 이용한다. tomcat_jsp_upload_bypass 모듈을 로드하고, 서버 아이피 및 포트를 설정한다.
check 명령어는 취약점 존재 유무를 판단할 수 있는 명령어로 해당 서버에 취약점이 존재하면 "vulnerable" 문자열이 출력된다. 취약점이 존재하므로 run 명령어를 입력 해 서버의 쉘을 획득한다.
와이어 샤크(Wireshark)로 공격 수행 중 서버의 패킷을 캡처해보면 TEZWrsJJyD.jsp 파일을 업로드 후 삭제했고, bPAXxFeclD.jsp 파일을 업로드 후 실행된 것으로 확인된다.
TEZWrsJJyD.jsp 패킷을 보면 확장자 우회 패턴을 대입하여 파일을 업로드하는데 성공하면 해당 파일을 삭제한다.
bPAXxFeclD.jsp 패킷은 파일을 업로드하는데 성공하면 해당 파일을 실행한다.
TEZWrsJJyD.jsp 패킷은 메타스플로잇 프레임워크의 check 명령어를 입력할 때 발생되는 패킷이고, bPAXxFeclD.jsp 패킷은 run 명령어를 입력할 때 발생되는 패킷이다.
tomcat_jsp_upload_bypass 모듈을 살펴보면 check 함수가 실행되면 PUT 메소드를 이용해 문자열 출력 기능을 수행하는 jsp 파일을 업로드한다. 업로드 하는데 성공하면 해당 파일을 삭제 후 Vulnerable 문자열을 출력한다.
exploit 함수가 실행되면 PUT 메소드를 이용해 인코딩 된 페이로드 jsp 파일이 업로드 된다. 업로드 하는데 성공하면 해당 파일을 실행한다.
취약점 발생 원리
web.xml 소스 코드에서 어떤 부분에서 취약점이 발생했는지 분석을 해보자.
web.xml 파일의 서블릿 매핑 파일을 보면 *.jsp, *.jspx 파일은 jsp 서블릿이 처리되고, 그 외의 파일들은 기본 서블릿이 처리된다.
취약점 공격 시 test1.jsp를 요청하게 되면 jsp 서블릿이 처리하게 되어 정상적으로 파일을 업로드할 수 없다.
하지만, test1.jsp/를 요청하게 되면 기본 서블릿으로 PUT 메소드를 처리하게 된다. 또한, 파일을 업로드(생성)하는 과정에서 확장자 우회 패턴("/")을 대입함으로써 정상적으로 파일이 업로드 된다.
대응 방안
1. 업그레이드
○ 아파치 톰캣 9.x 버전 사용자 : 아파치 톰캣 9.0.1 버전 업그레이드
○ 아파치 톰캣 8.x 버전 사용자 : 아파치 톰캣 8.0.47 또는 8.5.23 버전 업그레이드
○ 아파치 톰캣 7.x 버전 사용자 : 아파치 톰캣 7.0.82 버전 업그레이드
2. 메소드 제한
○ web.xml 파일에서 기본 서블릿의 읽기 전용 초기화 변수를 "true"로 설정
○ PUT 메소드 비활성화
▶ CVE-2017-5638 취약점 분석 (Apache Struts2)
▶ Metasploit msfconsole 사용법 및 활용