2024. 11. 18. 17:14ㆍInformation Security 정보보안/DreamHack
배울내용 :
dreamhack,
web hacking,
개발자도구,
dreamhack 풀이,
dreamhack what-is-my-ip 문제,
dreamhack web 풀이 ,
burfsuite,
X-Forwarded-For,
request.access_route
문제
문제를 보면 나의 ip 는 무엇인가 라는 제목으로 설명으로는 그들은 감히 어떻게 벽 뒤의 우리를 인식 할것인가?
라는 느낌의 설명이 있다. 문제를 열어보면 아래와 같이 IP address 가 뜨는걸 볼수있다
이 이후에는 다른 힌트가 안보여 코드를 확인해봤다
#!/usr/bin/python3
import os
from subprocess import run, TimeoutExpired
from flask import Flask, request, render_template
app = Flask(__name__)
app.secret_key = os.urandom(64)
@app.route('/')
def flag():
user_ip = request.access_route[0] if request.access_route else request.remote_addr
try:
result = run(
["/bin/bash", "-c", f"echo {user_ip}"],
capture_output=True,
text=True,
timeout=3,
)
return render_template("ip.html", result=result.stdout)
except TimeoutExpired:
return render_template("ip.html", result="Timeout!")
app.run(host='0.0.0.0', port=3000)
여기에서 자세히 보면 request.access_route 라는 생소한 함수를 볼수있다
@app.route('/')
def flag():
user_ip = request.access_route[0] if request.access_route else request.remote_addr
return render_template("ip.html", result=user_ip)
필자도 잘 모르니 검색을 해서 알아보니
werkzeug의 문서에 따르면, request.access_route요청의 전달된 헤더를 보고 계산된다고 하는데 악의적인 사용자는 X-Forwarded-For어떤 값이든 요청을 제출할 수 있으므로 리미터를 쉽게 우회할 수 있다고 한다.
request.access_route란?
Flask의 request.access_route는 클라이언트가 서버에 요청을 보낼 때, 요청이 어떤 경유지(IP 주소들)를 통해 왔는지에 대한 정보를 담고 있는 속성입니다. 일반적으로 이는 요청의 HTTP 헤더에 포함된 X-Forwarded-For 헤더를 기반으로 채워집니다.
- 목적: 클라이언트의 실제 IP 주소를 확인하거나 요청이 어떤 프록시 서버를 거쳐 도달했는지 파악.
- 데이터 형식: 리스트로 반환되며, 첫 번째 항목이 가장 원격에 있는 클라이언트의 IP입니다.
- 사용 예: 보안, 로깅, 사용자의 위치 추적 등에 활용됩니다.
request.access_route의 작동 방식
- 클라이언트의 요청 흐름:
- 클라이언트 → 프록시 서버 → 애플리케이션 서버로 요청이 전달될 때, 각 프록시가 원본 클라이언트의 IP를 X-Forwarded-For 헤더에 추가합니다.
출처
https://developer.mozilla.org/ko/docs/Web/HTTP/Headers/X-Forwarded-For
X-Forwarded-For - HTTP | MDN
X-Forwarded-For (XFF) 헤더는 HTTP 프록시나 로드 밸런서를 통해 웹 서버에 접속하는 클라이언트의 원 IP 주소를 식별하는 사실상의 표준 헤더다. 클라이언트와 서버 중간에서 트래픽이 프록시나 로드
developer.mozilla.org
위에 내용을 종합하자면 HTTP 헤더에 X-Forwarded-For 헤더를 추가하고 그 헤더안에 flag 를 찾는 요청을 추가하면 flag 를 찾을수있을거다
X-Forwaded-For : 1 ; cat /flag 를 넣어서 Forward 시켜주자
그러면 최종 식이 f"echo 1; cat /flag" 이 되기때문에 1 를 출력하고 cat /flag를 수행하게 될것이다.
그러면 성공적으로 성공플레그를 뛰울수있게 된다
추가적으로 아래처럼 코드를 추가하면 아마 이러한 공격을 막을수있지않을까?
@app.route('/')
def index_secure():
# X-Forwarded-For 헤더 값 가져오기
user_ip = request.headers.get('X-Forwarded-For', '127.0.0.1')
# 사용자 입력 검증 (IP 주소 형식만 허용)
if not user_ip.replace('.', '').isdigit():
return "Invalid IP address"
return f"Your IP: {user_ip}"
'Information Security 정보보안 > DreamHack' 카테고리의 다른 글
[DreamHack] [web] [LEVEL 1] baby-union 풀이 (1) | 2024.11.20 |
---|---|
[DreamHack] [web] [LEVEL 1] BypassIF 풀이 (2) | 2024.11.19 |
[DreamHack] [web] [LEVEL 1] access-log 풀이 (1) | 2024.11.17 |
[DreamHack] [web] [LEVEL 1] simple-phparse 풀이 (2) | 2024.11.17 |
[DreamHack] [web] [LEVEL 1] baby-Case 풀이 (2) | 2024.11.16 |