HackTheBox에서 제공하는
쉬운 난이도의 웹해킹 문제이다.
문제페이지에 처음 접속했을 때 화면이다.
토끼가 춤추고 있고, 아래에는 URL을 입력하는 창이 보인다.
시험삼아 네이버 주소를 입력해 봤더니
이렇게 아래쪽에 네이버 메인화면 스크린샷을 가져와서 표시해준다.
문제 제목 그대로
사용자가 입력한 URL에 방문해서 해당 페이지를 Caching 하는 기능의 웹페이지이다.
일단 주어진 문제파일을 통해서 flag 라는 사진파일이 서버 내에 있다는것을 알았다.
@api.route('/cache', methods=['POST'])
def cache():
print("Cache")
if not request.is_json or 'url' not in request.json:
return abort(400)
return cache_web(request.json['url'])
@web.route('/flag')
@is_from_localhost
def flag():
return send_file('flag.png')
제공된 routes.py 의 내용이다.
/flag 라는 경로가 있는것을 알 수 있고,
해당 페이지에 접근하면 아까봤던 flag.png 파일을 불러오는것을 알 수 있다.
그런데 중간에 @is_from_localhost 라는 문자열이 보인다.
def cache_web(url):
scheme = urlparse(url).scheme
domain = urlparse(url).hostname
if scheme not in ['http', 'https']:
return flash('Invalid scheme', 'danger')
def ip2long(ip_addr):
return unpack("!L", socket.inet_aton(ip_addr))[0]
def is_inner_ipaddress(ip):
print("IP (1): %s"%ip)
ip = ip2long(ip)
return ip2long('127.0.0.0') >> 24 == ip >> 24 or \
ip2long('10.0.0.0') >> 24 == ip >> 24 or \
ip2long('172.16.0.0') >> 20 == ip >> 20 or \
ip2long('192.168.0.0') >> 16 == ip >> 16 or \
ip2long('0.0.0.0') >> 24 == ip >> 24
try:
if is_inner_ipaddress(socket.gethostbyname(domain)):
return flash('IP not allowed', 'danger')
return serve_screenshot_from(url, domain)
except Exception as e:
print(e)
return flash('Invalid domain', 'danger')
def is_from_localhost(func):
@functools.wraps(func)
def check_ip(*args, **kwargs):
if request.remote_addr != '127.0.0.1':
return abort(403)
return func(*args, **kwargs)
return check_ip
is_from_localhost 는 util.py 에 정의되어 있다.
말 그대로 로컬호스트에서 접근했는지 검증하는 함수인데,
요청 패킷의 remote_addr 이 127.0.0.1 인지 검증하고
아니라면 403 에러를 발생시킨다.
그래서 아까 URL 입력하는 창에 http://{서버주소}/flag 라고 입력해도
요청 자체는 내 PC에서 한 것이기 때문에
remote_addr 이 127.0.0.1 이 아니게 되어 flag.png 파일을 가져오지 못한다.
from flask import Flask, redirect
app = Flask(__name__)
@app.route('/')
def main():
return redirect('http://localhost:80/flag')
if __name__ == '__main__':
app.run(host='0.0.0.0', port=1234)
그래서 내 PC에서 flask 를 이용해 서버를 하나 구동시켜 줬다.
기능은 아주 단순하게
서버에 접근하면 바로 http://localhost:80/flag 주소로 리다이렉트 시켜버리는 것이다.
그럼 만약 문제사이트에서 내 URL 주소를 입력하게 된다면
문제사이트 -> 내 서버 -> http://localhost:80/flag 이런식으로 방문해서
flag.png 파일을 가져올 수 있을 것이다.
내 서버는 공유기를 이용해 외부에서 접근이 가능토록 설정해주면 된다.
URL창에 내 주소를 넣어주면
성공적으로 flag.png 파일을 가져올 수 있고
스펀지밥과 뚱이가 플래그를 알려준다.
'워게임 > HackTheBox' 카테고리의 다른 글
[HackTheBox] LoveTok - 웹해킹 / Command Injection (57) | 2022.11.15 |
---|---|
[HackTheBox] Gunship - 웹해킹 / Prototype Pollution / RCE (55) | 2022.11.07 |
[HackTheBox] misDIRection - MISC / Shell script (43) | 2022.10.21 |
[HackTheBox] Phonebook - 웹해킹 / LDAP Injection / Python (67) | 2022.10.10 |
[HackTheBox] Pusheen Loves Graphs - MISC / IDA (46) | 2022.10.05 |