๋ฌธ์ : DreamHack โ EZ_command_injection ๋ถ๋ฅ: Web ๋์ด๋: ๐ฅ Bronze 1 FLAG:
DH{EZZZZZ_COMm4Nd_1nJecTiON_ZzZZ}
์ ๋ชฉ๋ถํฐ "์ฌ์ด ๋ช
๋ น์ด ์ธ์ ์
"์ด๋ผ๊ณ ๋๋๊ณ ๋งํด์ฃผ๋ ๋ฌธ์ ๋ค. ๊ทธ๋ฐ๋ฐ ์ค์ ๋ก ์๋ฒ ์ฝ๋๋ฅผ ์ด์ด๋ณด๋ฉด ipaddress ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ์
๋ ฅ์ ๊ฒ์ฆํ๋ ์ฝ๋๊ฐ ๋ฑ ๋ฒํฐ๊ณ ์๋ค โ "์ฌ์ด" ๋ฌธ์ ๋ผ๊ณ ํด์ ๋ฐฉ์ด ์ฝ๋๊น์ง ํ์ ํ ๊ฑด ์๋์๋ค. ์ด ๊ฒ์ฆ์ ๊ทธ๋๋ก ๋ซ๋ ๊ฒ ์๋๋ผ, ๊ฒ์ฆ์ด ๋์น๋ ์ง์ ์ ์ฐพ์์ผ ํ๋ค.
๋ช
๋ น์ด ์ธ์ ์
์์ฒด๋ ์ด ์๋ฆฌ์ฆ์์ ์ฌ๋ฌ ๋ฒ ๋ค๋ฃฌ ์ต์ํ ์ทจ์ฝ์ ์ ํ์ด์ง๋ง(;, `, $() ๊ฐ์ ์
ธ ๋ฉํ๋ฌธ์๋ฅผ ํํฐ๋งํ์ง ์๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ ๊ทธ๋๋ก ๋ช
๋ น์ค์ ๋ถ์ด๋ ํจํด), ์ด ๋ฌธ์ ๋ "ํํฐ๋ง์ ์์ ์ ํ" ๊ฒ ์๋๋ผ "ํํฐ๋ง์ ๋์ ํ ๋งํผ ์ ๋ขฐ๋ ๋์ ๋ณด์ด๋ ๊ฒ์ฆ์ ์ผ๋๋ฐ๋ ๋ซ๋ฆฐ๋ค"๋ ์ ์์ ๊ฒฐ์ด ๋ฌ๋๋ค. ์ ๊ท์์ผ๋ก ๋์ถฉ ํน์๋ฌธ์๋ฅผ ๊ฑธ๋ฌ๋ด๋ ์์ค์ด ์๋๋ผ, RFC ์คํ์ ๊ทธ๋๋ก ๊ตฌํํ ํ์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ก ๊ฒ์ฆํ๋๋ฐ๋ ๊ตฌ๋ฉ์ด ์์๋ค๋ ๊ฒ ์ด ๋ฌธ์ ์ ์ฌ๋ฏธ์๋ค.
๋ฌธ์ ๊ฐ์
VM์ ๋์ฐ๋ฉด ๊ทธ๋ฅ "Ping Result"๋ผ๋ ์ ๋ชฉ์ ๋น ํ์ด์ง ํ๋๊ฐ ๋์จ๋ค. ๋ณ๋์ ์ ๋ ฅ ํผ๋ ์๋ค.
ํผ์ด ์๋ค๋ ๊ฑด URL์ ์ง์ ๋ง๋ค์ด์ผ ํ๋ค๋ ๋ป์ด๋ค. ๋ฌธ์ ํ์ผ๋ก ์์ค๊ฐ ํจ๊ป ์ ๊ณต๋๋ค.
ํต์ฌ์ /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. ์ด ์ธ ๊ฐ ์ค ํ๋๋ผ๋ ํ๋ฆฌ๋ฉด ์๋ฒ๋ ๊ทธ๋ฅ ์กฐ์ฉํ ๊ธฐ๋ณธ ํ์ด์ง๋ง ๋๋ ค์ค ๋ฟ ์ด๋ค ํํธ๋ ์ฃผ์ง ์๋๋ค.

์ด ํ๋ฉด์ ์ฒ์ ๋ดค์ ๋๊ฐ ์ฌ์ค์ ์ง์ง ์์์ ์ด์๋ค โ "๊ฐ์ด ๋ญ๋ ์ผ๋จ ์ด ์์ฒญ ์์ฒด๋ ์๋ฒ๊ฐ ์ ๋๋ก ์ฒ๋ฆฌํ๊ณ ์๋ค"๋ ๊ฑธ ํ์ธ์์ผ์ค ๊ฒ์ด๋ค. ์ฌ๊ธฐ์๋ถํฐ ip_address() ๊ฒ์ฆ ๋ก์ง ์์ฒด๋ฅผ ๊ณต๋ตํ๋ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
๐ฃ ํต์ฌ โ scope_id๋ "์ ํจํ IP"์ด๋ฉด์ ๋์์ "์์์ ๋ฌธ์์ด"์ด๋ค
ipaddress.ip_address()๊ฐ ์ ํํ ๋ญ ์ด๋๊น์ง ํ์ฉํ๋์ง ๋ก์ปฌ์์ ๋จผ์ ํ์ธํด๋ดค๋ค.
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์ฒ๋ผ ์
ธ ํน์๋ฌธ์๊ฐ ์ ํ ์๋, ๊ทธ๋ฅ "์กด์ฌํ์ง ์๋ ์ธํฐํ์ด์ค ์ด๋ฆ"๋ง ๋ถ์ฌ์ ์์ฒญ์ ๋ณด๋๋ค.
์๋ต์ด "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 ํ์ฑ์ ๊นจ๋ฒ๋ฆฐ๋ค.
๋ฌธ์ ํ์ผ์ ํฌํจ๋ 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์ผ๋ก ๊ฐ์ ํ๋ค.
์ต์ข ํ์ด๋ก๋:
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()์ด ํ์ธํ๋ ๊ฑด ์ค์ง ์ด ๋ง์ง๋ง ๋ช
๋ น์ ์ข
๋ฃ ์ฝ๋๋ฟ์ด๋ผ, ์์ ๋ ๋ช
๋ น์ด ๋ญ ํ๋ ์ ๊ฒฝ ์ฐ์ง ์๋๋ค.
์ด๊ฑธ ๋ธ๋ผ์ฐ์ ์ฃผ์์ฐฝ์ ์ง์ ๋ฃ์ด ํ์ธํ๋ค.
์ด 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
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ