[normaltic 취업반 5기] 2024-02-07 14주차 과제 : 2번 과제 Web Shell 1, 2, 3

2024. 2. 18. 23:01normaltic 취업반 5기/과제

 

과제 목표

 

  • Web Shell 1, 2, 3 문제에서 웹쉘 코드가 포함된 파일을 업로드하고 웹 서버 내에서 플레그를 찾아라

 

Web Shell 1 문제

 

 

1) Web Shell 1 문제 환경

 

  Web Shell 1 문제에서 주어진 웹 페이지는 다음과 같다.

 

  • http://ctf.segfaulthub.com:8989/webshell_1/  : 공격 수행 페이지

 

[1] http://ctf.segfaulthub.com:8989/webshell_1/

 

http://ctf.segfaulthub.com:8989/webshell_1/ 초기화면

 

  해당 웹 페이지에서 웹쉘 파일을 업로드 하고 플레그를 찾는다.

 

 

2) Web Shell 1 문제 공격 시나리오

 

  Web Shell 1 문제 공격 시나리오는 다음과 같다.

 

  1. 파일 업로드 기능이 존재하는 웹 페이지를 찾는다.
  2. 웹쉘 코드가 입력된 파일을 작성한다.
  3. 작성한 파일을 업로드 한다.
  4. 업로드된 파일이 저장된 경로를 확인한다.
  5. 확인한 파일 경로를 웹 브라우저 주소창에 입력한다.
  6. 웹쉘을 실행하여 웹 서버에 명령을 내린다.

 

[1] http://ctf.segfaulthub.com:8989/webshell_1/notice_write.php

 

 

  본 문제에서 파일 업로드 기능을 사용가능한 웹 페이지이다. 파일 선택을 눌러 임의의 파일을 업로드할 수 있다.

 

웹쉘 코드를 입력한 파일
웹쉘 코드를 포함한 파일을 php 파일로 변경

 

  웹쉘 코드를 입력하여 php 파일로 저장한다.

 

 

  작성한 웹쉘 파일 등록 후 게시글을 작성한다.

 

 

  'Download' 버튼 위에 커서를 올려 파일이 저장된 경로를 알려주는 툴팁을 확인하여 파일 저장 경로를 확인한다.

 

[2] http://ctf.segfaulthub.com:8989/webshell_1/files/vanhart/webshell.php

 

 

  파일 경로를 웹 브라우저 주소창에 입력 후 cms 파라미터값으로 명령어를 입력하여 정상 작동하는지 확인한다.

 

 

  find 명령어로 플레그가 적힌 파일의 위치를 확인한다. 플레그는 flag.txt 파일에 입력되어 있다. find 명령어 결과 flag.txt는 /app/webshell_1/important_data/flag.txt에 저장되어 있는 것이 확인되었다.

 

 

 

  cat 명령어로 /app/webshell_1/important_data/flag.txt 경로를 입력하면 플레그를 확인할 수 있다.

 

 

Web Shell 2 문제

 

 

1) Web Shell 2 문제 환경

 

  Web Shell 2 문제에서 주어진 웹 페이지는 다음과 같다.

 

  • http://ctf.segfaulthub.com:8989/webshell_2/  : 공격 수행 페이지

 

[1] http://ctf.segfaulthub.com:8989/webshell_2/

 

http://ctf.segfaulthub.com:8989/webshell_2/ 초기화면

 

  해당 웹 페이지에서 웹쉘 파일을 업로드하고 플레그를 찾는다.

 

 

2) Web Shell 2 문제 공격 시나리오

 

  Web Shell 2 문제 공격 시나리오는 다음과 같다.

 

  1. 파일 업로드 기능이 존재하는 웹 페이지를 찾는다.
  2. 웹쉘 코드가 입력된 파일을 작성한다.
  3. 작성한 파일을 업로드한다.
  4. 업로드된 파일이 저장된 경로를 확인한다.
  5. 확인한 파일 경로를 웹 브라우저 주소창에 입력한다.
  6. 웹쉘을 실행하여 웹 서버에 명령을 내린다.

 

[1] http://ctf.segfaulthub.com:8989/webshell_1/notice_write.php

 

 

  본 문제에서 파일 업로드 기능을 사용가능한 웹 페이지이다. 파일 선택을 눌러 임의의 파일을 업로드할 수 있다.

 

웹쉘 코드를 입력한 파일
웹쉘 코드를 포함한 파일을 php 파일로 변경

 

  웹쉘 코드를 입력하여 php 파일로 저장한다.

 

 

  작성한 웹쉘 파일 등록 후 게시글을 작성하려고 하면 업로드할 수 없는 확장자라는 알림 창이 발생하면서 게시글이 작성되지 않는다.

 

 

  프록시툴로 응답 결과를 확인한 결과 확장자 이름이 .jpg, .jpeg, .png, .gif인 파일만 등록 가능한 걸로 확인이 되었다. 이를 우회하기 위하여 개발자 도구를 통해 해당 웹 페이지를 재정의한다.

 

 

  개발자 도구에서 소스 => 재정의 탭으로 이동하여 해당 웹 페이지 파일을 열면 웹 페이지 소스를 확인할 수 있으며 이를 분석한 결과 form 태그로 submit 시 Javascript에 작성된 화이트리스트 필터링 함수가 작동되는 것으로 확인이 되었다. 해당 필터링이 작동되지 않도록 하기 위해 form 태그의 onsubmit 이벤트를 제거한 후 재정의를 한다.

 

 

  재정의 후 php 파일을 등록하여 게시글을 작성하면 이번에는 업로드될 수 없는 파일이 탐지되었다는 알림 창이 발생한다. 이는 서버 측에서 필터링이 적용된 것으로 추측해 볼 수 있으며 이를 우회하기 위해 가능한 우회 방법을 모두 사용한다.

 

[2] 파일 업로드 우회 방법 탐색

 

(1) Content-Type 우회

 

 

  Content-Type으로 필터링하는지 확인하기 위해 프록시툴로 인터셉트하여 Content-Type을 image/png로 변경한다.

 

 

  변경해도 우회 불가 하므로 Content-Type으로 필터링하지 않는 것이 확인되었다.

 

(2) Null Byte Extention(널 바이트 익스텐션)

 

 

  파일명에 널 바이트를 삽입하여 필터링을 우회한다.

 

 

  파일 업로드 후 웹 브라우저 주소창에 입력한 결과 정상 작동하는 것을 확인하였다.

 

[3] http://ctf.segfaulthub.com:7979/webshell_2/files/vanhart/webshell.php%2500.jpg

  

 

  find 명령어로 플레그가 적힌 파일의 위치를 확인한다. 플레그는 flag.txt 파일에 입력되어 있다. find 명령어 결과 flag.txt는  /app/webshell_2/secret_file/flag.txt 에 저장되어 있는 것이 확인되었다.   

 

 

  cat 명령어로 /app/webshell_2/secret_file/flag.txt  경로를 입력하면 플레그를 확인할 수 있다.

 

 

Web Shell 3 문제

 

 

1) Web Shell 3 문제 환경

 

  Web Shell 3 문제에서 주어진 웹 페이지는 다음과 같다.

 

  • http://ctf.segfaulthub.com:8989/webshell_3/  : 공격 수행 페이지

 

[1] http://ctf.segfaulthub.com:8989/webshell_3/

 

http://ctf.segfaulthub.com:8989/webshell_3/ 초기화면

 

  해당 웹 페이지에서 웹쉘 파일을 업로드하고 플레그를 찾는다.

 

 

2) Web Shell 3 문제 공격 시나리오

 

  Web Shell 3 문제 공격 시나리오는 다음과 같다.

 

  1. 파일 업로드 기능이 존재하는 웹 페이지를 찾는다.
  2. 웹쉘 코드가 입력된 파일을 작성한다.
  3. 작성한 파일을 업로드한다.
  4. 업로드된 파일이 저장된 경로를 확인한다.
  5. LFI 취약점이 존재하는 웹 페이지에서 웹쉘 파일 저장 경로를 입력한다.
  6. 웹쉘을 실행하여 웹 서버에 명령을 내린다.

 

[2] http://ctf.segfaulthub.com:8989/webshell_3/notice_write.php

 

 

  본 문제에서 파일 업로드 기능을 사용가능한 웹 페이지이다. 파일 선택을 눌러 임의의 파일을 업로드할 수 있다.

 

웹쉘 코드를 입력한 파일
웹쉘 코드를 포함한 파일을 php 파일로 변경

 

  웹쉘 코드를 입력하여 php 파일로 저장한다.

 

 

  작성한 웹쉘 파일 등록 후 게시글을 작성하려고 하면 업로드할 수 없는 확장자라는 알림 창이 발생하면서 게시글이 작성되지 않는다.

 

 

  프록시툴로 응답 결과를 확인한 결과 확장자 이름이 .jpg, .jpeg, .png, .gif인 파일만 등록 가능한 걸로 확인이 되었다. 이를 우회하기 위하여 확장자 이름을 .jpg로 변경 후 업로드 한다.

 

 

  파일이 성공적으로 업로드되었다.

 

[2] http://ctf.segfaulthub.com:9023/webshell_3/webshell_3/greet.php

 

 

  /index.php 페이지에서 '인사말' 버튼을 클릭하면 인사말이 쓰여 있으며 다른 나라 언어 버튼들을 확인할 수 있다.

 

 

  각 나라 언어 버튼들을 클릭하면 해당하는 언어로 쓰인 인사말이 출력된다. 이때 주소창에서는 버튼을 클릭할 때마다 lang 파라미터 값으로 파일명이 입력되는 것으로 보아 LFI 취약점을 의심해 볼 수 있다.

 

 

  의심을 확신으로 바꾸기 위해 lang 파라미터 값으로 ../../../../../../../etc/passwd을 입력하여 웹 서버 내 파일을 해당 웹 페이지에 포함시켰더니 출력되는 것을 확인하였다. 이를 통해 이전에 업로드했던 webshell.jpg 파일을 포함시켜 웹쉘 코드를 실행시킨다.(php의 include 함수 등 파일을 포함시키는 함수들로 파일을 불러올 때 포함된 파일의 php 코드를 실행시킨 결과를 출력한다. 즉, .php 확장자가 아니라 다른 확장자로 이루어져 있어도 파일 내용에 php 코드가 쓰여 있다면 php 코드를 실행시킬 수 있다는 의미이다.)

 

 

[3] http://ctf.segfaulthub.com:9023/webshell_3/webshell_3/greet.php?lang=../files/vanhart/webshell.jpg&cmd=id

 

 

  우선 이전에 업로드 한 webshell.jpg 파일이 저장된 경로를 확인한다. webshell.jpg 파일은 /files/vanhart/webshell.jpg에 저장되어 있는 것을 확인하였다.

 

 

  인사말 웹 페이지에서 LFI 취약점을 이용해 lang 파라미터 값으로 ../files/vanhart/webshell.jpg&cmd=id을 입력하여 webshell.jpg 파일을 포함시켜 웹쉘 코드가 정상 작동하는지 확인한다. 

 

 

  find 명령어로 flag.txt 파일의 위치를 확인한다. 그 결과 /app/lfi_1/topSecret/flag.txt와 /app/webshell_3/webshell_3/topSecret/flag.txt에 flag.txt가 있는 것이 확인되었다. 각 위치에 존재하는 flag.txt 파일의 내용을 확인한다.

 

/app/lfi_1/topSecret/flag.txt
/app/webshell_3/webshell_3/topSecret/flag.txt

 

  cat 명령어를 사용하여 각 위치에 존재하는 flag.txt의 내용을 확인한 결과 같은 내용의 파일인 것을 확인하였으며 플레그를 획득할 수 있었다.