SONOTRI
  • [Dreamhack] Dream Beginner_Baby-linux
    2024년 06월 12일 19시 00분 46초에 업로드 된 글입니다.
    작성자: sonootri

      오왕 뭔가 뭔가 뭔가 그런 느낌이다....

     

     

    1. 문제 설명

      리눅스 명령어를 실행하는 웹 서비스가 작동한다고...? 리눅스에서 내가 명령어를 쓰듯이, 리눅스 같은 환경을 웹에서 구성했다는 소리 같다. 그리고 flag.txt 파일을 찾는 것이 관건인 것 같다.

     

     

     

    2. 접속 정보

     

    1.

     

     

    2.

      이런 화면이 뜨는데, echo가 있어 '아 그냥 내가 치는 문장을 출력하는 매커니즘인가?'라고 생각했었다. 하지만 '안녕'을 쳤을 때 아무런 출력값도 나오지 않는 것을 보니, 명령어만 인식한다고 생각했다.

     

    3.

      그래서 일단 제일 간단한 명령어를 쳐보았다. 

      

     

    app.py 
    dream hint.txt 
    requirements.txt 
    static templates

      app.py / dream hint.txt / requirments.txt / static templates 파일이 존재하는 것 같다. 근데 위에서 flag.txt 파일을 찾아 출력하라고 했다. 근데 이 파일은 출력값으로 나타나지 않는다...? 매우매우 수상하다. 그래서 일단 최상위 디렉토리인 root디렉토리를 살펴보기로 했다

     

      근데 flag.txt가 어느 디렉토리에 위치하는지는 모른다. 이 파일들이 있는 디렉토리와 다른 디렉토리에 위치 해 있을 지도 모른다. -> 7번 

     

     

     

    4.

      루트에 대한 정보를 출력하긴 했는데, 내가 위치해 있는 디렉토리는 대체 어딜까? 이건 조금 있다 찾아보기로 하고, 일단 출력값을 보자. 이전시간에 공부했던 내용들이 많이 나온다. 권한의 종류, 소유자, 소유 그룹, 일반 사용자, 이름 등 눈에 익는 게 많다.

    total 68 
    drwxr-xr-x 5 chall chall 4096 Apr 21 2023 app 
    drwxr-xr-x 2 root root 4096 Apr 12 2023 bin 
    drwxr-xr-x 2 root root 4096 Dec 9 2022 boot 
    drwxr-xr-x 8 root root 2540 Jun 12 10:04 dev 
    drwxr-xr-x 1 root root 4096 Jun 12 10:04 etc 
    drwxr-xr-x 3 root root 4096 Apr 21 2023 home 
    drwxr-xr-x 8 root root 4096 Apr 12 2023 lib 
    drwxr-xr-x 2 root root 4096 Apr 11 2023 lib64 
    drwxr-xr-x 2 root root 4096 Apr 11 2023 media 
    drwxr-xr-x 2 root root 4096 Apr 11 2023 mnt 
    drwxr-xr-x 2 root root 4096 Apr 11 2023 opt 
    dr-xr-xr-x 103 root root 0 Jun 12 10:04 proc 
    drwx------ 3 root root 4096 Apr 21 2023 root 
    drwxr-xr-x 3 root root 4096 Apr 21 2023 run 
    drwxr-xr-x 2 root root 4096 Apr 12 2023 sbin 
    drwxr-xr-x 2 root root 4096 Apr 11 2023 srv 
    dr-xr-xr-x 11 root root 0 Jun 12 10:18 sys 
    drwxrwxrwt 2 root root 4096 Apr 21 2023 tmp 
    drwxr-xr-x 11 root root 4096 Apr 11 2023 usr 
    drwxr-xr-x 11 root root 4096 Apr 11 2023 var

     

     

     

     

     

    5. 

      #pwd(print working directory) 명령어를 사용해 현재 위치가 /app라는 것을 알아냈다.

    /app
    /app 디렉토리 상세 정보
    drwxr-xr-x 5 chall chall 4096 Apr 21 2023 app

      위에서 ls -l /로 뽑아낸 정보이다. 일단 나는 root는 아닐 것이다. 개발자가 sudo su를 막아두지 않았을까? 라는 생각이 들기는 하지만 일단 쳐본다.

     

     

     

    6.

      일단 #sudo su를 명령어를 썼다. 결과값이 안나오긴 했는데, 쉘에서 sudo su 다음 비번을 입력하는 단계가 눈에 보이지 않는 것과 비슷한 상황인 것 같기도 해서 소유자 이름인 chall을 쳐봤다.

     

      다음 #whoami 명령어를 사용 한 결과 내가 chall이라는 결과값이 떴다. 음 root가 되지는 못했나보다.

     

      5번에서의 결과에 의하면 /app는 d/ rwx/ r-x/ r-x 상태이다. 소유자는 chall이며 4096?은 뭔지 모르겠다. chall은 root가 아니니 일단 #chown 명령어를 염두에 두자.

     

     

    7.

     

    total 24 
    -rwxr-xr-x 1 root root 884 Apr 21 2023 app.py 
    drwxr-xr-x 3 root root 4096 Apr 21 2023 dream 
    -rw-r--r-- 1 root root 34 Apr 21 2023 hint.txt 
    -rw-r--r-- 1 root root 5 Apr 21 2023 requirements.txt 
    drwxr-xr-x 5 root root 4096 Apr 21 2023 static 
    drwxr-xr-x 2 root root 4096 Apr 21 2023 templates

      /app 디렉토리에 flag.txt는 없는 것 같다.

     

     

      일단 hint.txt라도 열어보자. #cat 명령어로 출력해보았다.

    Where is Flag? ./dream/hack/hello

      주소를 알려주는 것 같다. 절대 경로 상대 경로 할 떄 보았던 . 같기는 하다. root를 의미했던 것 같은데...  그런데 #cd ./dream/hack/hello 명령어를 치면 이동을 안한다. 계속 /app에 위치해있다. 

     

      /app 정보에서 dream은 d로 시작하니 디렉토리가 확실하다. 그래서 #cd /app/dream 을 사용해 봤지만 여전히 계속 /app이다... 아 진짜 짜증난다. 머리 식힌 뒤 생각해보니 일반 사용자인 나는 dream에 접근이 금지되어 있을 지 모른다. 근데 w만 없는걸로 봐서는 문제 없는데...? 그리고 일반 사용자나 소유자인 나는 root권한으로 되어있는 dream에 #chmod 명령어를 사용할 수 없다.

     

     

     

      requirment.txt도 열어보았다.

    flask

     

      flask가 뭔지 검색해보니 웹 프레임워크인 것 같다. 근데 여기서는 필요 없는 정보이지 않을까?

     

     

     

     

     

     

     

     

     

     

     

     

     

    8.

    그리고 문제 파일을 받았다. 

    #!/usr/bin/env python3
    import subprocess
    from flask import Flask, request, render_template
    
    APP = Flask(__name__)
    
    @APP.route('/', methods=['GET', 'POST'])
    def index():
        if request.method == 'POST':
            user_input = request.form.get('user_input')
            cmd = f'echo $({user_input})'
            if 'flag' in cmd:
                return render_template('index.html', result='No!')
    
            try:
                output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
                return render_template('index.html', result=output.decode('utf-8'))
            except subprocess.TimeoutExpired:
                return render_template('index.html', result='Timeout')
            except subprocess.CalledProcessError:
                return render_template('index.html', result='Error')
    
        return render_template('index.html')
    
    if __name__ == '__main__':
        APP.run(host='0.0.0.0', port=8000)

     

     

     

     

     

     

     

    댓글