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

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

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

ping์„ ๋Œ€์‹  ์‹คํ–‰ํ•ด์ฃผ๋Š” ์›น ์„œ๋น„์Šค. ์„œ๋ฒ„๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ๋„ฃ์€ ๊ฐ’์„ ํŒŒ์ด์ฌ ipaddress.ip_address()๋กœ "์ง„์งœ IP ์ฃผ์†Œ์ธ์ง€" ๊ฒ€์ฆํ•œ ๋‹ค์Œ์—์•ผ ์‰˜ ๋ช…๋ น์— ๋ผ์›Œ ๋„ฃ๋Š”๋‹ค โ€” ์–ผํ• ์•ˆ์ „ํ•ด ๋ณด์ด๋Š” ๋ฐฉ์–ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ IPv6 ์ฃผ์†Œ ๋’ค์— ๋ถ™๋Š” %์ธํ„ฐํŽ˜์ด์Šค์ด๋ฆ„(scope id) ๋ถ€๋ถ„์€ ๊ทธ ๋‚ด์šฉ์„ ์ „ํ˜€ ๊ฒ€์ฆํ•˜์ง€ ์•Š๊ณ  ๊ทธ๋Œ€๋กœ ๋ณด์กดํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜๋ฉด์„œ, "์œ ํšจํ•œ IP ์ฃผ์†Œ"์ด๋ฉด์„œ ๋™์‹œ์— ์™„์ „ํ•œ ์‰˜ ์ธ์ ์…˜ ํŽ˜์ด๋กœ๋“œ์ธ ๋ฌธ์ž์—ด์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์œ ์ผํ•œ ๊ฑธ๋ฆผ๋Œ์€ ์ ˆ๋Œ€๊ฒฝ๋กœ์— ๋“ค์–ด๊ฐ€๋Š” ์Šฌ๋ž˜์‹œ ํ•˜๋‚˜ โ€” CIDR ํ‘œ๊ธฐ๋ฒ•๊ณผ ํ—ท๊ฐˆ๋ ค ํŒŒ์‹ฑ์ด ๊ฑฐ๋ถ€๋๋‹ค.

๋ฌธ์ œ: DreamHack โ€” EZ_command_injection ๋ถ„๋ฅ˜: Web ๋‚œ์ด๋„: ๐Ÿฅ‰ Bronze 1 FLAG: DH{EZZZZZ_COMm4Nd_1nJecTiON_ZzZZ}

์ œ๋ชฉ๋ถ€ํ„ฐ "์‰ฌ์šด ๋ช…๋ น์–ด ์ธ์ ์…˜"์ด๋ผ๊ณ  ๋Œ€๋†“๊ณ  ๋งํ•ด์ฃผ๋Š” ๋ฌธ์ œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ์‹ค์ œ๋กœ ์„œ๋ฒ„ ์ฝ”๋“œ๋ฅผ ์—ด์–ด๋ณด๋ฉด ipaddress ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ์ž…๋ ฅ์„ ๊ฒ€์ฆํ•˜๋Š” ์ฝ”๋“œ๊ฐ€ ๋”ฑ ๋ฒ„ํ‹ฐ๊ณ  ์žˆ๋‹ค โ€” "์‰ฌ์šด" ๋ฌธ์ œ๋ผ๊ณ  ํ•ด์„œ ๋ฐฉ์–ด ์ฝ”๋“œ๊นŒ์ง€ ํ—ˆ์ˆ ํ•œ ๊ฑด ์•„๋‹ˆ์—ˆ๋‹ค. ์ด ๊ฒ€์ฆ์„ ๊ทธ๋Œ€๋กœ ๋šซ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ๊ฒ€์ฆ์ด ๋†“์น˜๋Š” ์ง€์ ์„ ์ฐพ์•„์•ผ ํ–ˆ๋‹ค.

๋ช…๋ น์–ด ์ธ์ ์…˜ ์ž์ฒด๋Š” ์ด ์‹œ๋ฆฌ์ฆˆ์—์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ๋‹ค๋ฃฌ ์ต์ˆ™ํ•œ ์ทจ์•ฝ์  ์œ ํ˜•์ด์ง€๋งŒ(;, `, $() ๊ฐ™์€ ์…ธ ๋ฉ”ํƒ€๋ฌธ์ž๋ฅผ ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š๊ณ  ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ๋ช…๋ น์ค„์— ๋ถ™์ด๋Š” ํŒจํ„ด), ์ด ๋ฌธ์ œ๋Š” "ํ•„ํ„ฐ๋ง์„ ์•„์˜ˆ ์•ˆ ํ•œ" ๊ฒŒ ์•„๋‹ˆ๋ผ "ํ•„ํ„ฐ๋ง์„ ๋Œ€์‹ ํ•  ๋งŒํผ ์‹ ๋ขฐ๋„ ๋†’์•„ ๋ณด์ด๋Š” ๊ฒ€์ฆ์„ ์ผ๋Š”๋ฐ๋„ ๋šซ๋ฆฐ๋‹ค"๋Š” ์ ์—์„œ ๊ฒฐ์ด ๋‹ฌ๋ž๋‹ค. ์ •๊ทœ์‹์œผ๋กœ ๋Œ€์ถฉ ํŠน์ˆ˜๋ฌธ์ž๋ฅผ ๊ฑธ๋Ÿฌ๋‚ด๋Š” ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ, RFC ์ŠคํŽ™์„ ๊ทธ๋Œ€๋กœ ๊ตฌํ˜„ํ•œ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฒ€์ฆํ–ˆ๋Š”๋ฐ๋„ ๊ตฌ๋ฉ์ด ์žˆ์—ˆ๋‹ค๋Š” ๊ฒŒ ์ด ๋ฌธ์ œ์˜ ์žฌ๋ฏธ์˜€๋‹ค.


๋ฌธ์ œ ๊ฐœ์š”

VM์„ ๋„์šฐ๋ฉด ๊ทธ๋ƒฅ "Ping Result"๋ผ๋Š” ์ œ๋ชฉ์˜ ๋นˆ ํŽ˜์ด์ง€ ํ•˜๋‚˜๊ฐ€ ๋‚˜์˜จ๋‹ค. ๋ณ„๋„์˜ ์ž…๋ ฅ ํผ๋„ ์—†๋‹ค.

์ฒ˜์Œ ์ ‘์†ํ•œ ํŽ˜์ด์ง€ โ€” ์ฃผ์†Œ์ฐฝ์— host3.dreamhack.games ํฌํŠธ๊ฐ€ ๋ณด์ด๊ณ , ๋ณธ๋ฌธ์—” No result available. ๋ฟ์ธ ๋นˆ Ping Result ํŽ˜์ด์ง€

ํผ์ด ์—†๋‹ค๋Š” ๊ฑด URL์„ ์ง์ ‘ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๋œป์ด๋‹ค. ๋ฌธ์ œ ํŒŒ์ผ๋กœ ์†Œ์Šค๊ฐ€ ํ•จ๊ป˜ ์ œ๊ณต๋๋‹ค.

app.py ์ „์ฒด ์†Œ์Šค โ€” /ping ๋ผ์šฐํŠธ๊ฐ€ host ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ipaddress.ip_address()๋กœ ๊ฒ€์ฆํ•œ ๋’ค f-string์œผ๋กœ ping ๋ช…๋ น์— ๋ผ์›Œ ๋„ฃ์–ด /bin/sh -c ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ฝ”๋“œ

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

host = request.args.get('host', '')
try:
    addr = ipaddress.ip_address(host)
except ValueError:
    ...  # Invalid IP address
 
cmd = f'ping -c 3 {addr}'
output = subprocess.check_output(['/bin/sh', '-c', cmd], timeout=8)

์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ๊ทธ๋Œ€๋กœ ์‰˜์— ๋„˜๊ธฐ๋Š” ๊ฒŒ ์•„๋‹ˆ๋ผ, ์ผ๋‹จ ํŒŒ์ด์ฌ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ipaddress.ip_address()๋กœ "์ด๊ฒŒ ์ง„์งœ IP ์ฃผ์†Œ์ธ๊ฐ€"๋ถ€ํ„ฐ ํ™•์ธํ•œ๋‹ค. ํŒŒ์‹ฑ์— ์‹คํŒจํ•˜๋ฉด(ValueError) ์• ์ดˆ์— ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์ง€๋„ ์•Š๋Š”๋‹ค. ์ด ์ •๋„๋ฉด ํ”ํ•œ ๋ช…๋ น์–ด ์ธ์ ์…˜ ๋ฌธ์ œ๋ณด๋‹ค ๋ฐฉ์–ด๊ฐ€ ํ•œ ๋‹จ๊ณ„ ๋” ์žˆ๋Š” ์…ˆ์ด๋‹ค โ€” ์ง์ ‘ ๋ฌธ์ž์—ด์„ ๊ฒ€์‚ฌํ•˜๋Š” ๋Œ€์‹ , ์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๊ฒ€์ฆ์„ ์œ„์ž„ํ•˜๋Š” ๋ฐฉ์‹์€ ์‹ค๋ฌด์—์„œ๋„ ์ž์ฃผ ๊ถŒ์žฅ๋˜๋Š” ํŒจํ„ด์ด๋‹ค.


โ–ถ๐Ÿ•ณ๏ธ ์‚ฝ์งˆ โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋ถ€ํ„ฐ ์ž˜๋ชป ์งš์–ด์„œ ํ•œ์ฐธ ํ—ค๋งธ๋‹ค

๋ฌธ์ œ ํŒŒ์ผ์„ ์—ด์–ด๋ณด๊ธฐ ์ „์—๋Š” ๊ทธ๋ƒฅ ๋ฌด์ž‘์ • URL์„ ๋‘๋“œ๋ ค๋ดค๋‹ค. ?ip=, ?host=, ?target= ๊ฐ™์€ ํ”ํ•œ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๋“ค๋กœ GET ์š”์ฒญ์„ ๋‚ ๋ ค๋„ ์ „๋ถ€ "No result available"๋งŒ ๋‚˜์™”๊ณ , POST๋กœ ๋ณด๋‚ด๋ฉด ์•„์˜ˆ 405๊ฐ€ ๋–ด๋‹ค. ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์—ด๊ธฐ ์ „๊นŒ์ง€๋Š” ์ด๊ฒŒ ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์ด ํ‹€๋ฆฐ ๊ฑด์ง€, ๋ฉ”์„œ๋“œ๊ฐ€ ํ‹€๋ฆฐ ๊ฑด์ง€, ์—”๋“œํฌ์ธํŠธ๊ฐ€ ํ‹€๋ฆฐ ๊ฑด์ง€ ๊ตฌ๋ถ„์ด ์•ˆ ๋๋‹ค.

app.py๋ฅผ ์—ด์–ด๋ณด๊ณ  ๋‚˜์„œ์•ผ ์„ธ ๊ฐ€์ง€๊ฐ€ ํ•œ ๋ฒˆ์— ํ’€๋ ธ๋‹ค โ€” ์—”๋“œํฌ์ธํŠธ๋Š” /ping(๋ฃจํŠธ /๊ฐ€ ์•„๋‹ˆ๋ผ), ๋ฉ”์„œ๋“œ๋Š” GET๋งŒ ํ—ˆ์šฉ, ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„์€ ์ •ํ™•ํžˆ host. ์ด ์„ธ ๊ฐœ ์ค‘ ํ•˜๋‚˜๋ผ๋„ ํ‹€๋ฆฌ๋ฉด ์„œ๋ฒ„๋Š” ๊ทธ๋ƒฅ ์กฐ์šฉํžˆ ๊ธฐ๋ณธ ํŽ˜์ด์ง€๋งŒ ๋Œ๋ ค์ค„ ๋ฟ ์–ด๋–ค ํžŒํŠธ๋„ ์ฃผ์ง€ ์•Š๋Š”๋‹ค.

/ping?host=abc ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ Invalid IP address ๋ฉ”์‹œ์ง€๊ฐ€ ๋œจ๋Š” ํ™”๋ฉด โ€” ํŒŒ๋ผ๋ฏธํ„ฐ ์ด๋ฆ„๊ณผ ์—”๋“œํฌ์ธํŠธ๋ฅผ ๋งž์ถ˜ ๋’ค์—์•ผ ์ฒ˜์Œ์œผ๋กœ ๋‹ค๋ฅธ ๋ฐ˜์‘์„ ์–ป์€ ์ˆœ๊ฐ„

์ด ํ™”๋ฉด์„ ์ฒ˜์Œ ๋ดค์„ ๋•Œ๊ฐ€ ์‚ฌ์‹ค์ƒ ์ง„์งœ ์‹œ์ž‘์ ์ด์—ˆ๋‹ค โ€” "๊ฐ’์ด ๋ญ๋“  ์ผ๋‹จ ์ด ์š”์ฒญ ์ž์ฒด๋Š” ์„œ๋ฒ„๊ฐ€ ์ œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ๋‹ค"๋Š” ๊ฑธ ํ™•์ธ์‹œ์ผœ์ค€ ๊ฒƒ์ด๋‹ค. ์—ฌ๊ธฐ์„œ๋ถ€ํ„ฐ ip_address() ๊ฒ€์ฆ ๋กœ์ง ์ž์ฒด๋ฅผ ๊ณต๋žตํ•˜๋Š” ๋‹จ๊ณ„๋กœ ๋„˜์–ด๊ฐ”๋‹ค.


๐Ÿ’ฃ ํ•ต์‹ฌ โ€” scope_id๋Š” "์œ ํšจํ•œ IP"์ด๋ฉด์„œ ๋™์‹œ์— "์ž„์˜์˜ ๋ฌธ์ž์—ด"์ด๋‹ค

ipaddress.ip_address()๊ฐ€ ์ •ํ™•ํžˆ ๋ญ˜ ์–ด๋””๊นŒ์ง€ ํ—ˆ์šฉํ•˜๋Š”์ง€ ๋กœ์ปฌ์—์„œ ๋จผ์ € ํ™•์ธํ•ด๋ดค๋‹ค.

ํŒŒ์ด์ฌ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋กœ ipaddress.ip_address()์— IPv6 scope_id๋ฅผ ๋„ฃ์–ด ํŒŒ์‹ฑ๊ณผ ๋ฌธ์ž์—ด ๋ณ€ํ™˜ ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๋Š” ์บก์ณ โ€” ์„ธ๋ฏธ์ฝœ๋ก , ํŒŒ์ดํ”„, ๋ฐฑํ‹ฑ, ๋‹ฌ๋Ÿฌ, ๊ด„ํ˜ธ, ๊ณต๋ฐฑ๊นŒ์ง€ ์ „๋ถ€ ๊ทธ๋Œ€๋กœ ํ†ต๊ณผํ•˜๊ณ  ์Šฌ๋ž˜์‹œ๋งŒ ๊ฑฐ๋ถ€๋จ

IPv6 ์ฃผ์†Œ๋Š” fe80::1%eth0์ฒ˜๋Ÿผ % ๋’ค์— scope id(zone index)๋ฅผ ๋ถ™์—ฌ์„œ "์–ด๋А ๋„คํŠธ์›Œํฌ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•œ ์ฃผ์†Œ์ธ์ง€"๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ๋‹ค. ๋งํฌ๋กœ์ปฌ ์ฃผ์†Œ๋ฅผ ๋‹ค๋ฃฐ ๋•Œ ์‹ค์ œ๋กœ ์“ฐ์ด๋Š” ์ •์ƒ์ ์ธ ๋ฌธ๋ฒ•์ด๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ํŒŒ์ด์ฌ์˜ ipaddress ๋ชจ๋“ˆ์€ ์ด scope id์˜ ๋‚ด์šฉ์„ ์‚ฌ์‹ค์ƒ ๊ฒ€์ฆํ•˜์ง€ ์•Š๋Š”๋‹ค โ€” ๋นˆ ๋ฌธ์ž์—ด์ด ์•„๋‹ˆ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ญ๊ฐ€ ๋“ค์–ด์žˆ๋“  ๊ทธ๋Œ€๋กœ ๋ฐ›์•„๋“ค์ด๊ณ , str(addr)๋กœ ๋‹ค์‹œ ๋ฌธ์ž์—ดํ™”ํ•  ๋•Œ๋„ ์›๋ณธ ๊ทธ๋Œ€๋กœ ๋Œ๋ ค์ค€๋‹ค.

>>> ipaddress.ip_address("::1%$(id)")
IPv6Address('::1%$(id)')
>>> str(ipaddress.ip_address("::1%$(id)"))
'::1%$(id)'

์ฆ‰ "::1%$(id)"๋Š” ํŒŒ์ด์ฌ ์ž…์žฅ์—์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์œ ํšจํ•œ IPv6 ์ฃผ์†Œ์ด๋ฉด์„œ, ๋™์‹œ์— ์…ธ์—์„œ ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•˜๋ฉด id ๋ช…๋ น์„ ์น˜ํ™˜ํ•ด๋ฒ„๋ฆฌ๋Š” ์™„๋ฒฝํ•œ ์ธ์ ์…˜ ํŽ˜์ด๋กœ๋“œ์ด๊ธฐ๋„ ํ•˜๋‹ค. ์„ธ๋ฏธ์ฝœ๋ก (;), ํŒŒ์ดํ”„(|), ์•ฐํผ์ƒŒ๋“œ(&), ๋ฐฑํ‹ฑ, ๋‹ฌ๋Ÿฌ ๊ธฐํ˜ธ, ๊ด„ํ˜ธ, ๊ณต๋ฐฑ๊นŒ์ง€ โ€” ์…ธ์—์„œ ์œ„ํ—˜ํ•˜๋‹ค๊ณ  ์—ฌ๊ฒจ์ง€๋Š” ๋ฌธ์ž ๊ฑฐ์˜ ์ „๋ถ€๊ฐ€ scope id ์•ˆ์—์„œ๋Š” ์•„๋ฌด ์ œ์•ฝ ์—†์ด ํ†ต๊ณผ๋œ๋‹ค. ๋”ฑ ํ•˜๋‚˜, ์Šฌ๋ž˜์‹œ(/)๋งŒ ์˜ˆ์™ธ์˜€๋‹ค โ€” IPv6 ์ฃผ์†Œ ๋’ค์— /๊ฐ€ ์˜ค๋ฉด CIDR ์„œ๋ธŒ๋„ท ํ‘œ๊ธฐ(fe80::/64)๋กœ ํ•ด์„ํ•˜๋ ค๋‹ค ํŒŒ์‹ฑ์— ์‹คํŒจํ•œ๋‹ค.

์ด ๊ฐ€์„ค์ด ๋งž๋Š”์ง€ ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ํ˜•ํƒœ๋กœ ๋จผ์ € ํ™•์ธํ•ด๋ดค๋‹ค. ::1%eth0์ฒ˜๋Ÿผ ์…ธ ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ์ „ํ˜€ ์—†๋Š”, ๊ทธ๋ƒฅ "์กด์žฌํ•˜์ง€ ์•Š๋Š” ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„"๋งŒ ๋ถ™์—ฌ์„œ ์š”์ฒญ์„ ๋ณด๋ƒˆ๋‹ค.

/ping?host=::1%eth0 ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ Invalid IP address๊ฐ€ ์•„๋‹ˆ๋ผ An error occurred while executing the command ์ด ๋œจ๋Š” ํ™”๋ฉด โ€” IP ํŒŒ์‹ฑ ์ž์ฒด๋Š” ํ†ต๊ณผํ–ˆ๋‹ค๋Š” ๋œป

์‘๋‹ต์ด "Invalid IP address"๊ฐ€ ์•„๋‹ˆ๋ผ "An error occurred while executing the command"๋กœ ๋ฐ”๋€ ๊ฒŒ ํ•ต์‹ฌ ์‹ ํ˜ธ์˜€๋‹ค. ์ „์ž๋Š” ipaddress.ip_address() ๋‹จ๊ณ„์—์„œ ๋ง‰ํ˜”๋‹ค๋Š” ๋œป์ด๊ณ , ํ›„์ž๋Š” ๊ทธ ๋‹จ๊ณ„๋Š” ํ†ต๊ณผํ–ˆ์ง€๋งŒ ์‹ค์ œ ping ์‹คํ–‰์ด ์‹คํŒจํ–ˆ๋‹ค๋Š” ๋œป์ด๋‹ค. eth0์ด๋ผ๋Š” ๋ฌธ์ž์—ด์ด scope id๋กœ ๋ฐ›์•„๋“ค์—ฌ์ ธ ํŒŒ์‹ฑ๊นŒ์ง€๋Š” ์„ฑ๊ณตํ–ˆ๊ณ , ๋‹ค๋งŒ ๊ทธ ๊ฐ’์„ ์ธํ„ฐํŽ˜์ด์Šค๋กœ ์“ด ping ๋ช…๋ น ์ž์ฒด๊ฐ€ (๊ทธ๋Ÿฐ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์—†๊ฑฐ๋‚˜ ์ปจํ…Œ์ด๋„ˆ์— ICMP ๊ถŒํ•œ์ด ์—†์–ด์„œ) ์‹คํŒจํ•œ ๊ฒƒ์ด๋‹ค. ์ด ํ•œ ๋ฒˆ์˜ ์š”์ฒญ์œผ๋กœ "scope id ๋ถ€๋ถ„์€ ์ •๋ง๋กœ ๊ฒ€์ฆ๋˜์ง€ ์•Š๋Š”๋‹ค"๋Š” ๊ฐ€์„ค์„ ๋ช…ํ™•ํ•˜๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.


๐ŸŽฏ ์ž์ฒด ์™„๊ฒฐ solve

์ด์ œ ๋‚จ์€ ๊ฑด ๋‘ ๊ฐ€์ง€ ์ œ์•ฝ์„ ๋™์‹œ์— ๋งŒ์กฑํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด์—ˆ๋‹ค.

1. ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์“ธ ์ˆ˜ ์—†๋‹ค. /app/flag.txt์ฒ˜๋Ÿผ ์Šฌ๋ž˜์‹œ๊ฐ€ ๋“ค์–ด๊ฐ„ ๋ฌธ์ž์—ด์€ ๊ทธ ์ž์ฒด๋กœ IP ํŒŒ์‹ฑ์„ ๊นจ๋ฒ„๋ฆฐ๋‹ค.

host=::1%test/foo ๋กœ ์ ‘์†ํ–ˆ์„ ๋•Œ ์Šฌ๋ž˜์‹œ ๋•Œ๋ฌธ์— Invalid IP address๊ฐ€ ๋œจ๋Š” ํ™”๋ฉด โ€” ์ฃผ์†Œ์ฐฝ์— %2F๋กœ ์ธ์ฝ”๋”ฉ๋œ ์Šฌ๋ž˜์‹œ๊ฐ€ ๋ณด์ž„

๋ฌธ์ œ ํŒŒ์ผ์— ํฌํ•จ๋œ Dockerfile์„ ๋ณด๋ฉด WORKDIR /app์œผ๋กœ ์•ฑ์ด ๋ฐฐํฌ๋œ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ฆ‰ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ์‹คํ–‰๋˜๋Š” ํ˜„์žฌ ๋””๋ ‰ํ„ฐ๋ฆฌ๊ฐ€ ์ด๋ฏธ /app์ด๋ผ, ์ ˆ๋Œ€๊ฒฝ๋กœ ์—†์ด flag.txt๋ผ๋Š” ์ƒ๋Œ€๊ฒฝ๋กœ๋งŒ ์จ๋„ ์ถฉ๋ถ„ํ–ˆ๋‹ค.

2. ping์ด ์‹คํŒจํ•ด๋„ ๊ฒฐ๊ณผ๊ฐ€ ํ™”๋ฉด์— ๋‚˜์™€์•ผ ํ•œ๋‹ค. subprocess.check_output()์€ ์‹คํ–‰ํ•œ ๋ช…๋ น์˜ ์ตœ์ข… ์ข…๋ฃŒ ์ฝ”๋“œ๊ฐ€ 0์ด ์•„๋‹ˆ๋ฉด CalledProcessError๋ฅผ ๋˜์ง€๊ณ , ๊ทธ ๊ฒฝ์šฐ ์ฝ”๋“œ๋Š” ์‹ค์ œ ์ถœ๋ ฅ ๋Œ€์‹  "An error occurred while executing the command"๋ผ๋Š” ๊ณ ์ • ๋ฉ”์‹œ์ง€๋งŒ ๋ณด์—ฌ์ค€๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ์ฃผ์ž…ํ•œ ping -c 3 ::1%<ํŽ˜์ด๋กœ๋“œ>์˜ ping ๋ถ€๋ถ„์€ ์• ์ดˆ์— ์ •์ƒ์ ์œผ๋กœ ๋๋‚  ์ˆ˜ ์—†๋Š” ์ฃผ์†Œ๋ผ์„œ ์‹คํŒจํ•  ๊ฒŒ ๋ป”ํ–ˆ๋‹ค โ€” ๊ทธ๋ž˜์„œ ์„ธ๋ฏธ์ฝœ๋ก ์œผ๋กœ ๋ช…๋ น์„ ์ด์–ด๋ถ™์ด๊ณ  ๋งจ ๋์— true๋ฅผ ๋ถ™์—ฌ์„œ, ping์ด ๋ญ๋ผ๊ณ  ํ•˜๋“  ์ตœ์ข… ์ข…๋ฃŒ ์ฝ”๋“œ๋งŒํผ์€ 0์œผ๋กœ ๊ฐ•์ œํ–ˆ๋‹ค.

curl๋กœ ๋‘ ๊ฐ€์ง€ ํŽ˜์ด๋กœ๋“œ๋ฅผ ๋น„๊ตํ•˜๋Š” ์บก์ณ โ€” ์ ˆ๋Œ€๊ฒฝ๋กœ๋ฅผ ์“ด ์ฒซ ๋ฒˆ์งธ ์‹œ๋„๋Š” Invalid IP address, ์ƒ๋Œ€๊ฒฝ๋กœ+์„ธ๋ฏธ์ฝœ๋ก +true๋ฅผ ์“ด ๋‘ ๋ฒˆ์งธ ์‹œ๋„๋Š” flag๋ฅผ ๊ทธ๋Œ€๋กœ ๋ฐ˜ํ™˜

์ตœ์ข… ํŽ˜์ด๋กœ๋“œ:

host=::1%x;cat flag.txt;true

์—ฌ๊ธฐ์„œ scope id ๋ถ€๋ถ„(x;cat flag.txt;true)์„ ๋‹ค์‹œ ๋œฏ์–ด๋ณด๋ฉด, x๋Š” ๊ทธ๋ƒฅ ์ž๋ฆฌ๋ฅผ ์ฑ„์šฐ๋Š” ๋”๋ฏธ ์ธํ„ฐํŽ˜์ด์Šค ์ด๋ฆ„์ด๊ณ (scope id๊ฐ€ ์™„์ „ํžˆ ๋น„์–ด์žˆ์œผ๋ฉด ํŒŒ์‹ฑ์ด ์‹คํŒจํ•˜๋ฏ€๋กœ ๋ญ๋ผ๋„ ์žˆ์–ด์•ผ ํ•œ๋‹ค), ์ง„์งœ ํ•˜๋ ค๋Š” ์ผ์€ ๊ทธ ๋’ค ์„ธ๋ฏธ์ฝœ๋ก ๋ถ€ํ„ฐ ์‹œ์ž‘๋œ๋‹ค. ์„œ๋ฒ„๊ฐ€ ์ตœ์ข…์ ์œผ๋กœ /bin/sh -c์— ๋„˜๊ธฐ๋Š” ๋ช…๋ น์€ ๊ฒฐ๊ตญ ping -c 3 ::1%x;cat flag.txt;true๊ฐ€ ๋˜๊ณ , ์…ธ์€ ์ด๊ฑธ ์„ธ๋ฏธ์ฝœ๋ก  ๊ธฐ์ค€์œผ๋กœ ์„ธ ๊ฐœ์˜ ๋…๋ฆฝ๋œ ๋ช…๋ น์œผ๋กœ ์ชผ๊ฐœ ์ˆœ์„œ๋Œ€๋กœ ์‹คํ–‰ํ•œ๋‹ค โ€” ping -c 3 ::1%x(์‹คํŒจํ•ด๋„ ๋ฌด์‹œ๋จ), cat flag.txt(์ง„์งœ ๋ชฉ์ , ํ‘œ์ค€์ถœ๋ ฅ์œผ๋กœ flag๋ฅผ ์ฐ์Œ), true(ํ•ญ์ƒ ์„ฑ๊ณต, ์…ธ ์ „์ฒด์˜ ๋งˆ์ง€๋ง‰ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ 0์œผ๋กœ ํ™•์ •). subprocess.check_output()์ด ํ™•์ธํ•˜๋Š” ๊ฑด ์˜ค์ง ์ด ๋งˆ์ง€๋ง‰ ๋ช…๋ น์˜ ์ข…๋ฃŒ ์ฝ”๋“œ๋ฟ์ด๋ผ, ์•ž์„  ๋‘ ๋ช…๋ น์ด ๋ญ˜ ํ–ˆ๋“  ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค.

์ด๊ฑธ ๋ธŒ๋ผ์šฐ์ € ์ฃผ์†Œ์ฐฝ์— ์ง์ ‘ ๋„ฃ์–ด ํ™•์ธํ–ˆ๋‹ค.

/ping?host=::1%x;cat+flag.txt;true ๋กœ ์ ‘์†ํ•œ ๊ฒฐ๊ณผ ํŽ˜์ด์ง€ โ€” Ping Result ์•„๋ž˜์— DH{EZZZZZ_COMm4Nd_1nJecTiON_ZzZZ} flag๊ฐ€ ๊ทธ๋Œ€๋กœ ์ถœ๋ ฅ๋จ ์ „์ฒด ํ’€์ด ํ๋ฆ„ ๋‹ค์ด์–ด๊ทธ๋žจ โ€” ip_address ๊ฒ€์ฆ ์šฐํšŒ ์ง€์  ๋ฐœ๊ฒฌ, scope_id๊ฐ€ ๊ฒ€์ฆ ์—†์ด ๋ณด์กด๋จ์„ ํ™•์ธ, ์Šฌ๋ž˜์‹œ ์ œ์•ฝ๊ณผ ์ƒ๋Œ€๊ฒฝ๋กœ ์šฐํšŒ, true๋กœ ์ข…๋ฃŒ์ฝ”๋“œ ๋งž์ถฐ flag ํš๋“๊นŒ์ง€ 4๋‹จ๊ณ„

์ด flag๋ฅผ ๋“œ๋ฆผํ•ต์— ์ œ์ถœํ•ด ์ •๋‹ต์œผ๋กœ ํ™•์ •๋๊ณ  VM ํฌ๋ ˆ๋”ง๋„ ๋ฐ”๋กœ ํ™˜๊ธ‰๋๋‹ค.


๐Ÿ“ ๊ฒฐ๋ก 

์ด ๋ฌธ์ œ๊ฐ€ ์ž˜ ์งš์–ด์ค€ ์ง€์ ์€ "์‹ ๋ขฐํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ๊ฒ€์ฆํ–ˆ๋‹ค"๋Š” ๊ฒƒ๊ณผ "๊ทธ ๊ฒ€์ฆ ๊ฒฐ๊ณผ๊ฐ€ ์•ˆ์ „ํ•˜๋‹ค"๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ™์ง€ ์•Š๋‹ค๋Š” ์‚ฌ์‹ค์ด์—ˆ๋‹ค.

  • ๊ฒ€์ฆ ํ•จ์ˆ˜์˜ "์„ฑ๊ณต ์กฐ๊ฑด"์ด ์ •ํ™•ํžˆ ๋ญ˜ ์˜๋ฏธํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค. ipaddress.ip_address()๊ฐ€ ์„ฑ๊ณตํ•œ๋‹ค๋Š” ๊ฑด "RFC ๋ฌธ๋ฒ•์ƒ ์œ ํšจํ•œ IP ์ฃผ์†Œ ํ‘œํ˜„์ด๋‹ค"๋ผ๋Š” ๋œป์ด์ง€, "์ด ๋ฌธ์ž์—ด์— ์œ„ํ—˜ํ•œ ๋ฌธ์ž๊ฐ€ ์—†๋‹ค"๋Š” ๋œป์ด ์•„๋‹ˆ๋‹ค. IPv6์˜ scope id์ฒ˜๋Ÿผ ํ”„๋กœํ† ์ฝœ ์ŠคํŽ™ ์ž์ฒด๊ฐ€ "์ž„์˜์˜ ๋ฌธ์ž์—ด์„ ํ—ˆ์šฉํ•˜๋Š” ์ž์œ  ํ•„๋“œ"๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค๋ฉด, ๊ทธ ํ•„๋“œ๋ฅผ ํ†ต๊ณผํ•œ ๊ฐ’์ด๋ผ๋„ ํ›„์† ์ฒ˜๋ฆฌ(์ด๋ฒˆ์—” ์‰˜ ๋ช…๋ น ์กฐ๋ฆฝ)์—์„œ๋Š” ์—ฌ์ „ํžˆ ์œ„ํ—˜ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ž…๋ ฅ ๊ฒ€์ฆ๊ณผ ์ถœ๋ ฅ ์‚ฌ์šฉ ์‚ฌ์ด์˜ "๊ฑฐ๋ฆฌ"๋ฅผ ์ข๊ฒŒ ๋ด์•ผ ํ•œ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ip_address()๋กœ ๊ฒ€์ฆํ•œ ๊ฐ’์„ ๊ฒ€์ฆ ๊ทธ ์ž์ฒด(addr ๊ฐ์ฒด)๊ฐ€ ์•„๋‹ˆ๋ผ ๋ฌธ์ž์—ด๋กœ ๋‹ค์‹œ ๋ณ€ํ™˜ํ•ด์„œ(f'{addr}') ์‚ฌ์šฉํ•œ๋‹ค. ๊ฒ€์ฆ์— ํ†ต๊ณผํ•œ ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ๋ฌธ์ž์—ดํ™”ํ•˜๋Š” ์ˆœ๊ฐ„, "์ด ๊ฐ์ฒด๊ฐ€ ๋ญ˜ ๋ณด์žฅํ•˜๋Š”๊ฐ€"์™€ "์ด ๋ฌธ์ž์—ด์ด ๋ญ˜ ๋‹ด๊ณ  ์žˆ๋Š”๊ฐ€"๊ฐ€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์–ด๊ธ‹๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฑธ ์ด ๋ฌธ์ œ๊ฐ€ ์ž˜ ๋ณด์—ฌ์ค€๋‹ค.
  • ๋ช…๋ น ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋กœ ์ˆจ๊ธฐ๋Š” ์ฝ”๋“œ๋Š” ๊ณต๊ฒฉ์ž์—๊ฒŒ๋„ ํžŒํŠธ๊ฐ€ ๋œ๋‹ค. CalledProcessError๋ฅผ ์žก์•„์„œ ์ผ๋ฐ˜ ์—๋Ÿฌ ๋ฉ”์‹œ์ง€๋กœ ๋ญ‰๋šฑ๊ทธ๋ฆฌ๋Š” ๋ฐฉ์–ด์  ์ฝ”๋“œ์˜€์ง€๋งŒ, ๊ฑฐ๊พธ๋กœ "์ข…๋ฃŒ ์ฝ”๋“œ๋ฅผ 0์œผ๋กœ ๋งž์ถ”๊ธฐ๋งŒ ํ•˜๋ฉด ์ถœ๋ ฅ์ด ๊ทธ๋Œ€๋กœ ๋…ธ์ถœ๋œ๋‹ค"๋Š” ์กฐ๊ฑด์„ ๋ช…ํ™•ํ•˜๊ฒŒ ์•Œ๋ ค์ค€ ์…ˆ์ด์—ˆ๋‹ค.

์ด๋ฒˆ ํ’€์ด์—์„œ ์‹ค์ œ๋กœ ๊ฐ’์„ ์žƒ์€ ๋ฌธ์ž๋Š” ์Šฌ๋ž˜์‹œ ํ•˜๋‚˜๋ฟ์ด์—ˆ์ง€๋งŒ, ๋‹ค๋ฅธ ์›น ์„œ๋ฒ„ ํ™˜๊ฒฝ์ด์—ˆ๋‹ค๋ฉด ์ด์•ผ๊ธฐ๊ฐ€ ์กฐ๊ธˆ ๋‹ฌ๋ผ์กŒ์„ ์ˆ˜๋„ ์žˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํ”Œ๋ž˜๊ทธ ๊ฒฝ๋กœ๊ฐ€ ์•ฑ์˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ ๋ฐ”๊นฅ์— ์žˆ์—ˆ๋‹ค๋ฉด ..(์ƒ์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ ์ด๋™)์„ ์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒน์ณ ์จ์„œ ์Šฌ๋ž˜์‹œ ์—†์ด๋„ ์ƒ๋Œ€๊ฒฝ๋กœ๋กœ ์ ‘๊ทผํ•˜๋Š” ์šฐํšŒ๊ฐ€ ํ•„์š”ํ–ˆ์„ ๊ฒƒ์ด๊ณ , ์• ์ดˆ์— WORKDIR๊ฐ€ ์–ด๋””์ธ์ง€ ์•Œ ์ˆ˜ ์—†๋Š” ๋ธ”๋ž™๋ฐ•์Šค ํ™˜๊ฒฝ์ด์—ˆ๋‹ค๋ฉด find . -name flag* ์ฒ˜๋Ÿผ ์Šฌ๋ž˜์‹œ ์—†๋Š” ํƒ์ƒ‰ ๋ช…๋ น์œผ๋กœ ๋จผ์ € ์œ„์น˜๋ถ€ํ„ฐ ์ฐพ์•„์•ผ ํ–ˆ์„ ๊ฒƒ์ด๋‹ค. ์ด๋ฒˆ์—” Dockerfile์ด ์ œ๊ณต๋ผ ์žˆ์–ด์„œ ๊ทธ ํƒ์ƒ‰ ๊ณผ์ •์„ ๊ฑด๋„ˆ๋›ธ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

๋ฐฉ์–ด์ž ๊ด€์ ์—์„œ ๋ณด๋ฉด, ์ด ๋ฌธ์ œ์˜ ์ง„์งœ ๊ตํ›ˆ์€ "์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ ํ˜•์‹์„ ๊ฒ€์ฆํ•˜๋Š” ๊ฒƒ"๊ณผ "์…ธ์— ์•ˆ์ „ํ•˜๊ฒŒ ๊ฐ’์„ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ"์€ ์„œ๋กœ ๋‹ค๋ฅธ ์ฑ…์ž„์ด๋ผ๋Š” ์›์น™์ด๋‹ค. ์• ์ดˆ์— ping ๊ฐ™์€ ์™ธ๋ถ€ ๋ช…๋ น์„ ์‹คํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋ฉด, ๋ฌธ์ž์—ด์„ ์กฐ๋ฆฝํ•ด ์…ธ์— ๋„˜๊ธฐ๋Š” ๋Œ€์‹  subprocess.run(['ping', '-c', '3', str(addr)])์ฒ˜๋Ÿผ ์ธ์ž๋ฅผ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌํ•ด์„œ ๋„˜๊ธฐ๊ณ  shell=True(๋˜๋Š” /bin/sh -c)๋ฅผ ์•„์˜ˆ ์“ฐ์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ›จ์”ฌ ๊ทผ๋ณธ์ ์ธ ํ•ด๊ฒฐ์ฑ…์ด๋‹ค. ์ธ์ž๊ฐ€ ๋ฆฌ์ŠคํŠธ๋กœ ๋ถ„๋ฆฌ๋˜๋ฉด addr ๋ฌธ์ž์—ด ์•ˆ์— ์–ด๋–ค ํŠน์ˆ˜๋ฌธ์ž๊ฐ€ ๋“ค์–ด์žˆ๋“  ์…ธ์ด ๊ทธ๊ฑธ ๋‹ค์‹œ ํ•ด์„ํ•  ๊ธฐํšŒ ์ž์ฒด๊ฐ€ ์‚ฌ๋ผ์ง„๋‹ค โ€” ์ž…๋ ฅ์„ ์•„๋ฌด๋ฆฌ ์ •๊ตํ•˜๊ฒŒ ๊ฒ€์ฆํ•ด๋„ ๊ฒฐ๊ตญ ์…ธ ๋ฌธ์ž์—ด ์กฐ๋ฆฝ์ด๋ผ๋Š” ์œ„ํ—˜ํ•œ ์ง€์ ์„ ๊ฑฐ์นœ๋‹ค๋ฉด, ๊ทธ ๊ฒ€์ฆ์€ ์–ธ์ œ๋“  ์ด๋ฒˆ ๋ฌธ์ œ์ฒ˜๋Ÿผ ์šฐํšŒ๋‹นํ•  ์—ฌ์ง€๋ฅผ ๋‚จ๊ธด๋‹ค.

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

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 +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
[๐Ÿฅ‰ Bronze 2] GET๋งŒ ์—ด์–ด๋‘” Flask ๋ผ์šฐํŠธ๋ฅผ HEAD๋กœ ๋šซ๊ธฐ โ€” DreamHack blind-command ํ’€์ด
blog

[๐Ÿฅ‰ Bronze 2] GET๋งŒ ์—ด์–ด๋‘” Flask ๋ผ์šฐํŠธ๋ฅผ HEAD๋กœ ๋šซ๊ธฐ โ€” DreamHack blind-command ํ’€์ด

Flask ๋ผ์šฐํŠธ์— methods=['GET']๋งŒ ๊ฑธ์–ด๋„ HEAD์™€ OPTIONS๋Š” ์ž๋™์œผ๋กœ ๋”ฐ๋ผ๋ถ™๋Š”๋‹ค. HEAD ์š”์ฒญ์ด๋ฉด request.method๊ฐ€ 'HEAD'๊ฐ€ ๋˜์–ด else ๋ถ„๊ธฐ์˜ os.system(cmd)์ด ์‹คํ–‰๋˜์ง€๋งŒ, HEAD ์‘๋‹ต์—” ๋ณธ๋ฌธ์ด ์—†์–ด ์ถœ๋ ฅ์ด ๋ณด์ด์ง€ ์•Š๋Š”๋‹ค. sleep ์‹œ๊ฐ„์ฐจ๋กœ flag๋ฅผ ํ•œ ๊ธ€์ž์”ฉ ๋นผ๋ƒˆ๋‹ค.
#dreamhack#ctf#web+4
2026-06-28#dreamhack +4