๋ฌธ์ : DreamHack โ Exercise: Docker ๋ถ๋ฅ: Misc ๋์ด๋: ๐ฅ Bronze 3 FLAG:
DH{docker_exercise}
"์ฃผ์ด์ง Dockerfile์ ๋น๋ํด ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์ปจํ ์ด๋๋ฅผ ์คํํด ๋ณด์ธ์"๋ผ๋ ํ ์ค์ง๋ฆฌ ์ค์ต ๋ฌธ์ ๋ค. ์ต์คํ๋ก์์ด ์๋๋ผ Docker๋ก ์ฑ๋ฆฐ์ง๊ฐ ์ด๋ป๊ฒ ๋ฐฐํฌ๋๋์ง ์์ ์ตํ๋ ๊ฒ ๋ชฉ์ ์ด๋ค. ์๋น์ค์ ๋ถ์ด ๋ด์ผ flag๋ ์ ๋์จ๋ค โ flag๊ฐ ์ด๋ ์๋์ง๋ถํฐ ์์์ผ ํ๋ค.
cat -n Dockerfile
๋ฌธ์ ๊ฐ์
| ํญ๋ชฉ | ๋ด์ฉ |
|---|---|
| ๋ฌธ์ ๋ช | Exercise: Docker |
| ๋์ด๋ | ๐ฅ Bronze 3 |
| ๋ถ๋ฅ | Misc |
| ์คํ | Ubuntu 22.04 ยท socat ยท x86-64 ELF |
| ์ ๊ณต | Dockerfile + deploy/chall(๋ฐ์ด๋๋ฆฌ) + deploy/flag |
| ํต์ฌ | flag๋ ์๋น์ค ์ถ๋ ฅ์ด ์๋๋ผ Dockerfile์ด ์ด๋ฏธ์ง๋ก ADD ํ๋ ํ์ผ์ ์๋ค |
ํ์ด ํ๋ฆ์ ์งง๋ค. ๋ฐ์ด๋๋ฆฌ๊ฐ flag๋ฅผ ์ ์ค๋ค๋ ๊ฑธ ํ์ธํ๊ณ , Dockerfile์ ์ฝ์ด flag๊ฐ ์ด๋ฏธ์ง ์์ผ๋ก ๋ณต์ฌ๋๋ค๋ ์ฌ์ค์ ํ์ ํ ๋ค, ๊ฐ์ Dockerfile๋ก ์ด๋ฏธ์ง๋ฅผ ๋น๋ยท์คํํด ๊ทธ ์์ flag๋ฅผ ์ฝ๋๋ค.
๐งฉ ๋ฐฐ๊ฒฝ โ Dockerfile ยท ์ด๋ฏธ์ง ยท ์ปจํ ์ด๋
Docker๋ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ทธ ์คํ ํ๊ฒฝ(OS ํจํค์ง, ํ์ผ, ์ค์ )์ ์ด๋ฏธ์ง(image) ํ๋๋ก ๋ฌถ์ด ๋๊ณ , ๊ทธ ์ด๋ฏธ์ง๋ฅผ ๋์ด ์ธ์คํด์ค๋ฅผ ์ปจํ ์ด๋(container) ๋ก ๋๋ฆฌ๋ ๋๊ตฌ๋ค. ์๊ฒ์ ์๋ฒ๋ ๋ณดํต ์ด๋ ๊ฒ ๋ฐฐํฌ๋๋ค โ "์ด ๋ฐ์ด๋๋ฆฌ๋ฅผ, ์ด ์ฐ๋ถํฌ ํ๊ฒฝ์์, ์ด ๊ถํ์ผ๋ก ๋๋ฆฐ๋ค"๋ฅผ ํ ํ์ผ์ ์ ์ด ๋๋ ๊ฒ์ด๋ค.
๊ทธ ์ค๊ณ๋๊ฐ Dockerfile ์ด๋ค. ๋ช ๋ น ํ ์ค์ด ์ด๋ฏธ์ง์ ํ ๋ ์ด์ด(layer) ๊ฐ ๋๋ค.
FROMโ ๋ฒ ์ด์ค ์ด๋ฏธ์ง(์ฌ๊ธฐ์ubuntu:22.04)RUNโ ๋น๋ ์ค ์คํํ ๋ช ๋ น(ํจํค์ง ์ค์น, ์ฌ์ฉ์ ์ถ๊ฐ ๋ฑ)ADD/COPYโ ํธ์คํธ์ ํ์ผ์ ์ด๋ฏธ์ง ์์ผ๋ก ๋ณต์ฌUSERโ ์ดํ ๋จ๊ณ์ ์ปจํ ์ด๋ ์คํ ์์ ๊ธฐ๋ณธ ์ฌ์ฉ์CMDโ ์ปจํ ์ด๋๊ฐ ๋ด์ ๋ ์คํํ ๋ช ๋ น
์ฌ๊ธฐ์ ํต์ฌ์ ADD ๋ค. ๋น๋ ์์ ์ ํธ์คํธ์ ์๋ ํ์ผ์ด ์ด๋ฏธ์ง ์์ ํต์งธ๋ก ๋ค์ด๊ฐ๋ค. ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง ์ฌ๋์ ๊ทธ ํ์ผ์ ๊ทธ๋๋ก ๊บผ๋ผ ์ ์๋ค โ ์ด๊ฒ ์ด๋ฒ ๋ฌธ์ ์ ์ ๋ถ๋ค.
๐ฌ ์ ์ฐฐ โ ๋ฐ์ ํ์ผ๊ณผ ๋ฐ์ด๋๋ฆฌ
๋ฐ์ ํ์ผ์ ์ ์ด๋ค.
Dockerfile
deploy/
โโโ chall # ์๋ฒ์์ socat์ผ๋ก ๋
ธ์ถ๋๋ ๋ฐ์ด๋๋ฆฌ
โโโ flag # ์ด๋ฏธ์ง๋ก ๋ค์ด๊ฐ flag ํ์ผ๋จผ์ ๋ฐ์ด๋๋ฆฌ๋ถํฐ. file๋ก ์ข
๋ฅ๋ฅผ ๋ณด๊ณ ์ง์ ์คํํด ๋ณด๋ฉด, ๊ทธ๋ฆฌ๊ณ main์ ๋์ค์ด์
๋ธํด ๋ณด๋ฉด ํ๋ ์ผ์ด ๋ฑ ํ๋๋ค โ puts๋ก ๋ฌธ์์ด ํ๋ ์ถ๋ ฅํ๊ณ ๋.

main:
lea rax, [rip+0xeac] ; "Hello Beginners!"
mov rdi, rax
call puts
mov eax, 0
retflag๋ฅผ ์ฝ๋ ์ฝ๋๋, ์
๋ ฅ์ ๋ฐ๋ ์ฝ๋๋ ์๋ค. ๊ทธ๋ฌ๋ ๋ผ์ด๋ธ ์๋ฒ์ ์ ์ํด๋ ๊ฒฐ๊ณผ๋ ๋๊ฐ๋ค. ์๋ฒ๋ socat ... EXEC:/home/chall/chall ๋ก ์ด ๋ฐ์ด๋๋ฆฌ๋ฅผ ๊ทธ๋๋ก ์คํํ ๋ฟ์ด๋ผ, ๋คํธ์ํฌ๋ก ๋์ด์ค๋ ๊ฑด "Hello Beginners!" ํ ์ค์ด ์ ๋ถ๋ค.

์ ๋ฆฌํ๋ฉด ์๋น์ค(๋ฐ์ด๋๋ฆฌ)๋ flag๋ก ๊ฐ๋ ๊ธธ์ด ์๋๋ค. flag๋ ๋ค๋ฅธ ๊ณณ์ ์๋ค.
๐ฃ ํต์ฌ โ flag๋ ์ด๋ฏธ์ง ์์ผ๋ก ADD ๋๋ค
Dockerfile์ ๋ค์ ๋ณธ๋ค. ๊ฐ์ด๋ฐ ๋ ์ค๊ณผ ๊ถํ ์ค์ ์ด ์ ๋ถ๋ค.
ENV user chall
ADD ./deploy/flag /home/$user/flag # flag ํ์ผ์ ์ด๋ฏธ์ง ์์ผ๋ก ๋ณต์ฌ
ADD ./deploy/$user /home/$user/$user # ๋ฐ์ด๋๋ฆฌ๋ ๋ณต์ฌ
RUN chown root:$user /home/$user/flag
RUN chmod 440 /home/$user/flag # root์ chall ๊ทธ๋ฃน๋ง ์ฝ๊ธฐ
USER chall
CMD socat -T 30 TCP-LISTEN:$chall_port,reuseaddr,fork EXEC:/home/$user/$userflag ํ์ผ์ด ์ด๋ฏธ์ง์ /home/chall/flag ๋ก ๋ค์ด๊ฐ๊ณ , ๊ถํ์ 440 root:chall ์ด ๋๋ค. ์ฆ chall ๊ทธ๋ฃน์ ์ํ ์ฌ์ฉ์๋ผ๋ฉด ์ฝ์ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ์ปจํ
์ด๋๋ USER chall ๋ก ๋์๊ฐ๋ค โ ๋ฐ์ด๋๋ฆฌ(chall ์ฌ์ฉ์, chall ๊ทธ๋ฃน)๋ ๊ทธ flag๋ฅผ ์ฝ์ ๊ถํ์ด ์์ง๋ง, ์ ์ flag๋ฅผ ์ถ๋ ฅํ๋ ์ฝ๋๊ฐ ์์ ๋ฟ์ด๋ค.
์๋ pwnable ๋ฌธ์ ๋ผ๋ฉด ์ฌ๊ธฐ์ ๋ฐ์ด๋๋ฆฌ์ ๋ฒ๊ทธ๋ฅผ ์ฐพ์ ์
ธ์ ๋ฐ๊ณ cat /home/chall/flag ๋ฅผ ํ์ ๊ฒ์ด๋ค. ํ์ง๋ง ์ด ๋ฐ์ด๋๋ฆฌ์ ๋ฒ๊ทธ๊ฐ ์๋ค. ๋์ ๋ฌธ์ ์ค๋ช
์ด ๊ธธ์ ์๋ ค ์ค๋ค โ "Dockerfile์ ๋น๋ํด์ ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค๊ณ ์คํํด ๋ณด๋ผ." ๊ทธ ์ด๋ฏธ์ง ์์๋ ์ฐ๋ฆฌ๊ฐ ๋ฐ์ deploy/flag ๊ฐ ๊ทธ๋๋ก ๋ค์ด ์๋ค.

โถ๐ ์ฝ์ง โ ๋ฐ์ด๋๋ฆฌ์์ ์ทจ์ฝ์ ๋ถํฐ ์ฐพ์ผ๋ ค ํ๋ค
misc์ง๋ง socat์ผ๋ก ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋
ธ์ถํ๋ ๋ชจ์์๊ฐ pwnable๊ณผ ๋๊ฐ์์, ๋ฐ์ฌ์ ์ผ๋ก chall ์์ ๋ฒ๊ทธ๋ถํฐ ์ฐพ์๋ค. file โ PIE์ NX, objdump๋ก main์ ๊น ๋ณด๋ puts ํ ์ค. ์
๋ ฅ๋, ํฌ๋งท ์คํธ๋ง๋, ์ค๋ฒํ๋ก์ฐ ์ง์ ๋ ์๋ค. ํ์ค ์
๋ ฅ์ ์ค ๋ด๋ ๋ฐ์์ด ์๋ค.
$ ./chall
Hello Beginners!
$ echo AAAA | ./chall
Hello Beginners!๋ฐ์ด๋๋ฆฌ์ ๊ณต๊ฒฉ๋ฉด์ด 0์ด๋ผ๋ ๊ฑธ ๋ฐ์๋ค์ด๊ณ ๋ฌธ์ ์ค๋ช ("Dockerfile์ ๋น๋ํ๋ผ")์ ๋ค์ ์ฝ๊ณ ๋์์ผ, ์ด ๋ฌธ์ ๊ฐ ์ต์คํ๋ก์์ด ์๋๋ผ ๋ฐฐํฌ ๊ตฌ์กฐ๋ฅผ ์ดํดํ๋ ์ค์ต์ด๋ผ๋ ๊ฑธ ์์๋ค. flag๋ฅผ ์ค ์ฃผ์ฒด๋ ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋๋ผ ์ด๋ฏธ์ง์๋ค.
๐ฏ ํ์ด โ ์ง์ ๋น๋ํด์ flag ๊บผ๋ด๊ธฐ
๋ฐฉ๋ฒ์ Dockerfile์ด ์ํค๋ ๊ทธ๋๋ก๋ค. ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๋ค.
docker build -t exercise-docker .๋น๋ ๋ก๊ทธ๋ฅผ ๋ณด๋ฉด Dockerfile์ ๊ฐ ์ค์ด ๋ ์ด์ด๋ก ์์ด๋ ๊ฒ ๊ทธ๋๋ก ๋ณด์ธ๋ค โ apt-get install socat, adduser chall, ๊ทธ๋ฆฌ๊ณ ADD ./deploy/flag /home/chall/flag ๋ก flag๊ฐ ์ด๋ฏธ์ง ์์ผ๋ก ๋ค์ด๊ฐ๋ค.

์ด์ ์ปจํ
์ด๋๋ฅผ ๋์ด๋ค. ์๋น์ค(socat)์ ๋ถ์ผ๋ฉด ์๋ฒ์ ๋๊ฐ์ด "Hello Beginners!"๋ง ๋์ค์ง๋ง, ์ปจํ
์ด๋ ์์์ chall ์ฌ์ฉ์๋ก flag ํ์ผ์ ์ง์ ์ฝ์ผ๋ฉด ๋์ด๋ค. chall ์ chall ๊ทธ๋ฃน์ด๋ผ 440 root:chall ํ์ผ์ ์ฝ์ ์ ์๋ค.
docker run -d --rm --name exdoc -p 2222:2222 exercise-docker
# ์๋น์ค๋ก๋ ์ธ์ฌ๋ง๋ง
nc 127.0.0.1 2222 # โ Hello Beginners!
# ์ด๋ฏธ์ง ์์ ๊ตฌ์์ง flag๋ฅผ chall ์ฌ์ฉ์๋ก ์ฝ๊ธฐ
docker exec -u chall exdoc cat /home/chall/flag
DH{docker_exercise}ls -l ๋ก ํ์ธ๋๋ฏ flag๋ -r--r----- root chall ๊ถํ์ด๊ณ , id ๋ก ๋ณด๋ฉด ์ฐ๋ฆฌ๊ฐ uid=1000(chall) groups=1000(chall) ์ด๋ผ ๊ทธ๋ฃน ์ฝ๊ธฐ ๊ถํ์ผ๋ก ํต๊ณผํ๋ค. ๋ผ์ด๋ธ ์๋ฒ๋ ๊ฐ์ Dockerfile๋ก ๋น๋๋ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋๋ฆฌ๋ฏ๋ก, ์ด๋ฏธ์ง ์์ flag๊ฐ ๊ณง ๋ต์ด๋ค.
๐ ๊ฒฐ๋ก
์ปจํ
์ด๋ ์ด๋ฏธ์ง์ ๋ฃ์ ํ์ผ์ "์จ๊ธด ๊ฒ"์ด ์๋๋ค. ์ด๋ฒ ๋ฌธ์ ๋ ํ์ต์ฉ์ด๋ผ flag๋ฅผ ๊ทธ๋๋ก ๋ฐ์ ๋น๋๋ง ํ๋ฉด ๋์ง๋ง, ๊ฐ์ ์๋ฆฌ๊ฐ ์ค๋ฌด์์๋ ์ฌ๊ณ ๋ก ์ด์ด์ง๋ค. ์ด๋ฏธ์ง์ ํ ๋ฒ ADD/COPY๋ ๋น๋ฐ์ ๋ ์ด์ด์ ๋ฐ์ ๋์ด, ์ด๋ฏธ์ง๋ฅผ ๊ฐ์ง ์ฌ๋์ด๋ผ๋ฉด docker save๋ก ๋ ์ด์ด tar๋ฅผ ํ๊ฑฐ๋ docker history๋ก ๋น๋ ๋จ๊ณ๋ฅผ ๋ค์ถฐ ๊ทธ๋๋ก ๊บผ๋ผ ์ ์๋ค. ์ค๊ฐ์ RUN rm ์ผ๋ก ์ง์๋ ์ ๋ ์ด์ด์ ๋จ๋๋ค.
์ ๋ฆฌํ๋ฉด,
- ๋น๋ฐ์ ์ด๋ฏธ์ง์ ๊ตฝ์ง ์๋๋ค. API ํคยท์ธ์ฆ์ยทflag ๊ฐ์ ๋ฏผ๊ฐ ํ์ผ์ ๋น๋ ํ์
ADD/COPY๋์ ๋ฐํ์์ ์ฃผ์ ํ๋ค โ ๋ณผ๋ฅจ ๋ฐ์ธ๋ ๋ง์ดํธ, ๋ฐํ์ ํ๊ฒฝ๋ณ์, BuildKit--secret๋ง์ดํธ(๋ ์ด์ด์ ๋จ์ง ์์), ๋๋ ์ค์ผ์คํธ๋ ์ดํฐ์ ์ํฌ๋ฆฟ ๊ธฐ๋ฅ. - ์ด๋ฏธ์ง๋ ๋ฐฐํฌ๋ฌผ์ด๋ผ๊ณ ์๊ฐํ๋ค. ๋๊ตฐ๊ฐ ์ด๋ฏธ์ง๋ฅผ ์์ ๋ฃ์ผ๋ฉด ๊ทธ ์์ ๋ชจ๋ ๋ ์ด์ด๋ฅผ ๋ค์ฌ๋ค๋ณผ ์ ์๋ค๋ ์ ์ ๋ก ๋ฌด์์ ๋ฃ์์ง ์ ํ๋ค.
- ์ฑ๋ฆฐ์ง ๋ฐฐํฌ ๊ตฌ์กฐ๋ฅผ ์ฝ๋ ์ต๊ด. ์๊ฒ์์
Dockerfile์ "๋ฐ์ด๋๋ฆฌ๊ฐ ์ด๋ค ๊ถํยทํ๊ฒฝ์์ ๋๋์ง"๋ฅผ ๊ทธ๋๋ก ๋ณด์ฌ ์ค๋ค. ๋ก์ปฌ์์ ๊ฐ์ ์ด๋ฏธ์ง๋ฅผ ๋น๋ํด ๋๋ฉด ์ต์คํ๋ก์์ ์๋ฒ์ ์๊ธฐ ์ ์ ๋์ผ ํ๊ฒฝ์์ ์์ ํ๊ฒ ๊ฒ์ฆํ ์ ์๋ค โ ์ด ์ค์ต์ด ๊ฐ๋ฅด์น๋ ค๋ ์ง์ง ๋๊ตฌ๋ค.
Comments
๋๊ธ
๋๊ธ์ ๋จ๊ธฐ๋ ค๋ฉด ๋ก๊ทธ์ธ์ด ํ์ํด์. (๋ค์ด๋ฒ ยท ๊ตฌ๊ธ ๊ณ์ )
๋๊ธ ๋ถ๋ฌ์ค๋ ์คโฆ