KOROMOON

착한 사마리아인이 되고 싶습니다.

3/02/2020

[CVE-2020-1938] Ghostcat Vulnerability


( 1 ) 취약점 정보



Apache Tomcat AJP 커넥터에 임의의 파일 읽기 및 원격코드 실행이 가능한 취약점임.
Chaitin Tech 사의 보안 연구원에 의해 발견하여 2020 01 03 Apache Software Foundation 사에 보고됨.
2020 02 11(9.0, 8.0 버전), 14(7.0 버전)에 각각 취약점 버전에 대한 패치 릴리스됨.

영향받는 Tomcat 제품 버전
Apache Tomcat 9.x < 9.0.31
Apache Tomcat 8.x < 8.5.51
Apache Tomcat 7.x < 7.0.100
Apache Tomcat 6.x

Apache Tomcat 6 제품 버전에 영향을 미치지만 Apache 사에서 더 이상 지원되지 않으므로 패치를 릴리스하지 않음. 최신 상위 버전의 Tomcat 으로 업그레이드하는 것이 좋음.

< AJP 를 활용한 웹서버와 WAS 연동 간 요청처리 흐름 >

여기서 AJP 란 Apache JServ Protocol 의 약자로 웹서버 뒤에 있는 어플리케이션 서버로부터 웹서버로 들어오는 요청을 위임할 수 있는 바이너리 프로토콜임.

웹 개발자들은 대체로 AJP 를 여러 웹서버로부터 여러 개 어플리케이션 서버로의 로드밸런스 구현에 이용함.

Tomcat 커넥터는 Tomcat 이 외부로 연결하기 위한 채널임.
Catalina 는 외부로부터 요청을 수신하고 처리를 위해 해당 웹 어플리케이션으로 요청을 전달하고 요청의 응답 결과를 리턴함.
기본적으로 Tomcat 은 HTTP 커넥터와 AJP 커넥터 이 두 개의 커넥터로 구성됨.

HTTP 커넥터 : HTTP 프로토콜 요청(HTTP/1.1)을 처리하는 데 사용되며 기본 수신 주소는 0.0.0.0:8080 임. HTTP 웹서비스를 제공하는 사용됨.
AJP 커넥터 : AJP 프로토콜 요청(AJP/1.3)을 처리하는 데 사용되며 기본 수신 주소는 0.0.0.0:8009 임. AJP 프로토콜은 바이러니 형식의 HTTP 프로토콜로 성능 최적화 버전으로 이해하면 되며 HTTP 요청의 처리 비용을 줄일 수 있으므로 주로 클러스터링 또는 리버스 프록시가 필요한 구성에서 사용됨.



( 2 ) 취약점 분석

인증되지 않은 공격자가 Ghostcat 취약점을 이용하여 Tomcat 의 webapp 목록 하위에 있는 모든 임의의 파일을 읽을 수 있음.
또한, 취약한 서버가 파일 업로드를 허용할 경우 이를 악용하여 파일 형식 내 악성 JSP 코드를 업로드한 후 원격코드 실행을 할 수 있음.

Apache Tomcat 취약한 버전의 /conf/server.xml 파일에서 AJP 가 기본적으로 활성화되어 있기 때문에 Ghostcat 취약점이 발생함.

< 취약한 버전의 server.xml 파일에서 AJP 설정 >


Tomcat 이 AJP 요청을 받았을 경우 org.apache.coyote.ajp.AjpProcessor.java 를 호출하여 AJP 메세지를 처리함.

prepareRequest 메소드를 통해 AJP 메세지 내용을 추출하여 Request 객체의 Attribute 속성으로 설정함.
< prepareRequest 메소드 >


아래와 같이 빨간색 박스로 표시된 Constants.SC_A_REQ_ATTRIBUTE 를 처리하는 코드(디버깅 시 확인된 코드임)에서 내용을 확인하지 않고 요청된 내용을 맹목적으로 복사됨.


따라서 Attrubute 속성을 변경할 수 있으며 request.setAttribute 메소드를 이용하여 Request 객체의 다음 3개 Attribute 속성을 제어할 수 있음.
javax.servlet.include.request_uri
javax.servlet.include.path_info
javax.servlet.include.servlet_path
< request.setAttribute 메소드 >

YDHCUI 님이 작성한 PoC 테스트를 이용하여 아래와 같이 테스트한 화면과 패킷 덤프 화면임.
해당 PoC 는 단순히 WEB-INF/web.xml 파일을 접근 시도하여 코드를 확인하는 PoC 임.

< PoC 테스트 >

< Packet Dump 화면 >




( 3 ) 공격 탐지 방법


AJP 포트(TCP/8009)로 접근하여 3가지 Attribute 속성을 이용한 취약점 공격을 탐지함.
alert tcp any any -> any 8009 (msg:"KOROMOON_Ghostcat_Request"; content:"javax|2e|servlet|2e|include|2e|request_uri"; content:"javax|2e|servlet|2e|include|2e|path_info"; content:"javax|2e|servlet|2e|include|2e|servlet_path";)



( 4 ) 취약점 방어

최신 버전으로 업데이트함.
Apache Tomcat 9.x -> 9.0.31 업데이트
Apache Tomcat 8.x -> 8.5.51 업데이트
Apache Tomcat 7.x -> 7.0.100 업데이트



참고 사이트 : 




============================================================

본 게시물은 KOROMOON 님께서 작성하였으며 CCL (Creative Commons License) 에서 "저작자표시-비영리-동일조건변경허락" 이용조건으로 자료를 이용하셔야 합니다.


댓글 없음:

댓글 쓰기