문제정보
특정 Host에 ping 패킷을 보내는 서비스입니다.
Command Injection을 통해 플래그를 획득하세요. 플래그는 flag.py에 있습니다.
chatGPT와 함께 풀어보세요!
Keypoint
Basic Command Injection (논리 연산자)
app.py
#!/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)
메인화면
해당 문제는 Command Injection을 이용한 문제이다.
코드에서 친절하게 command를 입력 할 위치를 알려주었으니, 해당 위치에 값을 입력하면 된다.
먼저 cmd에는 논리연산자 'AND', 'OR'이 있다. 이는 각각 '&', '|' 으로 해당 기능을 이용하여
' | ls ' 값을 입력하게 되면 아래와 같이 파일 목록을 확인할 수 있다.
이제 ' | cat flag.py ' 구문을 통해 FLAG 파일을 읽을 수 있다.
FLAG
'DreamHack > web' 카테고리의 다른 글
[wargame] CSRF Advanced (0) | 2023.07.16 |
---|---|
[wargame] out of money (0) | 2023.07.15 |
[wargame] simple_sqli_chatgpt (0) | 2023.07.15 |
[wargame] 🌱 simple-web-request (0) | 2023.07.15 |
[wargame] ex-reg-ex (0) | 2023.07.15 |