1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ ์ธ์ , ๋๊ฐ, ์ ์ ๋ช ํ๊ฐ
๋ชจ๋ฆฌ์ค ์(Morris Worm)์ 1988๋ 11์ 2์ผ, ๋ฏธ๊ตญ ์ฝ๋ฌ๋ ๋ํ์์ ๋ก๋ฒํธ ํํ ๋ชจ๋ฆฌ์ค(Robert Tappan Morris, ๋น์ 24์ธ)๊ฐ ์ธํฐ๋ท์ ํ์ด๋์, ์ญ์ฌ์ ์ฒ์์ผ๋ก ๋๊ท๋ชจ๋ก ํผ์ง ์๊ธฐ๋ณต์ ํ ์ปดํจํฐ ์์ด๋ค. '์(worm)'์ด๋ผ๋ ๊ฐ๋ ์ 1982๋ ์ ๋ก์ค PARC์ ์กด ์ํฌ(John Shoch)์ ์กด ํํผ(Jon Hupp)๊ฐ ์ ๋ฆฌํ์ง๋ง, ๊ทธ๊ฒ์ ์ค์ ์ธํฐ๋ท ์ ์ฒด ๊ท๋ชจ์์ ์ฒ์์ผ๋ก ๋์ฌ์์ผ๋ก ๋ง๋ ์ฌ๊ฑด์ด ๋ฐ๋ก ์ด ์์ด์๋ค. ์ ์์๋ ์ถ์ฒ๋ฅผ ์จ๊ธฐ๋ ค ์ฝ๋ฌ์ด ์๋ MIT์์ ์์ ์คํํ์ง๋ง, ํ๊ธ์ ์ธํฐ๋ท์ ๋ฉฐ์น ๊ฐ ์ฌ์ค์ ๋ง๋น์์ผฐ๋ค.
- ๋ฌด์์ ๋ ธ๋ ธ๋: ๋ชจ๋ฆฌ์ค์ ์ง์ ์ ๋ฐ๋ฅด๋ฉด ํ๊ดด๊ฐ ๋ชฉ์ ์ด ์๋๋ผ "์ธํฐ๋ท์ ์ค์ ๋ก ์ทจ์ฝํ ํธ์คํธ๊ฐ ์ผ๋ง๋ ์๋์ง ์กฐ์ฉํ ์ธก์ "ํ๋ ค๋ ์คํ์ด์๋ค. ๊ทธ๋ฌ๋ ์ค๊ณ์ ๊ฒฐํจ์ด ์์ด ์ธก์ ํ๋ ค๋ ์ ์์ฒด๊ฐ ํต์ ๋ฅผ ๋ฒ์ด๋ ์ธํฐ๋ท์ ๋ฉ์ถฐ ์ธ์ ๋ค.
- ๊ท๋ชจ: ๋น์ ์ธํฐ๋ท์ ์ฐ๊ฒฐ๋ ์ปดํจํฐ๋ ์ฝ 6๋ง ๋ ์์ค์ด์๋ค. ์์ ๊ทธ์ค ์ฝ 6,000๋(์ฝ 10%)๋ฅผ ๊ฐ์ผ์์ผฐ๋ค(MITยทํ๋ฒ๋ยทํ๋ฆฐ์คํดยท์คํ ํผ๋, NASA ์์์ค, ๋ก๋ ์ค ๋ฆฌ๋ฒ๋ชจ์ด ๊ตญ๋ฆฝ์ฐ๊ตฌ์, ๊ตฐ ์์ค ๋ฑ).
- ์ ์ ๋ช ํ๊ฐ: โ '์ต์ด์ ์ธํฐ๋ท ์'์ด์ ๋๊ท๋ชจ ์ฌ์ด๋ฒ ์ฌ๊ณ ์ ์ํ โก ํผํด ๋์์ ํ์์ฑ ๋๋ฌธ์ CERT/CC(ํ CISA ๊ณ์ด, ์นด๋ค๊ธฐ๋ฉ๋ฐ SEI)๊ฐ ์ฐฝ์ค๋จ โข 1986๋ ์ ์ ๋ ์ปดํจํฐ ๋ถ์ ์ฌ์ฉ ๋ฐ ๋จ์ฉ ๋ฐฉ์ง๋ฒ(CFAA)์ด ์ฒ์์ผ๋ก ์ ์ฉ๋ ์ ์ฃ ํ๊ฒฐ(1990) โฃ ์ดํ ๋ชจ๋ ์ยท๋ด๋ทยท๋์ฌ์จ์ด ์ ํ ์ฐ๊ตฌ์ ๊ต๊ณผ์๊ฐ ๋จ.
- ๋ฒ์ ๊ฒฐ๋ง: ๋ชจ๋ฆฌ์ค๋ 1990๋ CFAA ์๋ฐ์ผ๋ก ์ ์ฃ ํ๊ฒฐ์ ๋ฐ์ ์งํ์ ์ 3๋ , ๋ฒ๊ธ 10,050๋ฌ๋ฌ, ์ฌํ๋ด์ฌ 400์๊ฐ์ ์ ๊ณ ๋ฐ์๋ค. (์ง๊ธ์ MIT CSAIL ๊ต์๋ก ์ฌ์ง ์ค์ด๋ผ๋ ์ฌ์ค๋ ์ด ์ฌ๊ฑด์ ์์ด๋ฌ๋๋ก ์์ฃผ ํ์๋๋ค.)
- ์๋ ๋ฐฐ๊ฒฝ: 1988๋ ์ ์ธํฐ๋ท์ ๋ํยท์ฐ๊ตฌ์ยท์ ๋ถ๊ฐ ๋์จํ๊ฒ ์ฐ๊ฒฐ๋ ์ ๋ขฐ ๊ธฐ๋ฐ ๋คํธ์ํฌ์๋ค. ์ธ์ฆยท์ํธํยทํจ์น ๊ด๋ฆฌ ๊ฐ๋ ์ด ์ฌ์ค์ ์์๊ณ , ์ด๋ฉ์ผยท์๊ฒฉ ๋ก๊ทธ์ธ ์๋น์ค๊ฐ ๋ฌด๋ฐฉ๋น๋ก ์ด๋ ค ์์๋ค โ ์์๊ฒ๋ ์ต์ ์ ํ๊ฒฝ์ด์๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ์ด๋ป๊ฒ ํผ์ก๋
๋ชจ๋ฆฌ์ค ์์ ํต์ฌ์ "ํ๋์ ์ทจ์ฝ์ ์ ๋ ธ๋ฆฐ ์"์ด ์๋๋ผ, ์๋ก ๋ค๋ฅธ ์ธ ๊ฐ์ง ์นจํฌ ๊ฒฝ๋ก๋ฅผ ๋์์ ์๋ํ๋ ๋ฉํฐ๋ฒกํฐ ์"์ด์๋ค๋ ์ ์ด๋ค. ์ธ ๊ฒฝ๋ก๋ ๋ชจ๋ ๋น์ ๋๋ฆฌ ์ฐ์ด๋ ์ธํฐ๋ท ์๋น์ค(๋ฉ์ผยทfingerยท์๊ฒฉ ์ ธ)์ ํ์ ์ ์ฐ๋ ๊ณ , ํ๋๋ผ๋ ์ด๋ ค ์์ผ๋ฉด ๊ฐ์ผ๋๋ค.
- ๊ฒฝ๋ก A โ sendmail DEBUG ๋ช
๋ น ์ฃผ์
: ๋น์ sendmail์๋ ๋ฌธ์ ์ง๋จ์ฉ
DEBUG๋ชจ๋๊ฐ ์์๋๋ฐ, ์ด ๋ชจ๋๋ก ๋์ ์ค์ธ sendmail์ ํน์ํ SMTP ๋ช ๋ น(DEBUGโRCPT/RSET)์ ๋ณด๋ด๋ฉด ์์์ ์ ธ ๋ช ๋ น์ ์คํ์ํฌ ์ ์์๋ค. ์์ ์ด ํต๋ก๋ก ์ฝ๋๋ฅผ ์ ์กํ๊ณ ๋ถํธ์คํธ๋ฉ ์คํฌ๋ฆฝํธ๋ฅผ ์คํ์์ผฐ๋ค. - ๊ฒฝ๋ก B โ fingerd ๋ฒํผ ์ค๋ฒํ๋ก์ฐ: ์๊ฒฉ ์ฌ์ฉ์ ์ ๋ณด๋ฅผ ์๋ ค์ฃผ๋ fingerd๋ ์
๋ ฅ์ ๋ฐ์ ๋ ๊ฒฝ๊ณ ๊ฒ์ฌ๊ฐ ์๋
gets()๋ฅผ ์ฌ์ฉํ๋ค. ์์ ์ฝ 536๋ฐ์ดํธ๊ฐ ๋๋ ์์ฒญ์ ๋ณด๋ด ์คํ์ ๋ฐํ ์ฃผ์๋ฅผ ๋ฎ์ด์ฐ๊ณ , ์์ ์ ธ์ฝ๋๋ฅผ ์คํ์์ผ ์๊ฒฉ ์ ธ์ ์ป์๋ค. (1971๋ ์ต์ด์ ์ ์คํ๋gets()๋ฅ์ ์ ๋ ฅ ๋ฌธ์ ์ ๋ฎ์ ์๋ค.) - ๊ฒฝ๋ก C โ rsh/rexec + ๋น๋ฐ๋ฒํธ ํฌ๋ํน: ์์
/etc/hosts.equivยท.rhosts๋ก ๋งบ์ด์ง ์ ๋ขฐ ๊ด๊ณ๋ฅผ ๋ฐ๋ผ ๋ฌด์ธ์ฆ์ผ๋ก rsh/rexec๋ฅผ ์คํํ๋ ค ์๋ํ๋ค. ๋ ๋์๊ฐ ๊ฐ์ผ๋ ํธ์คํธ์/etc/passwd(๋น์ ์ํธ ํด์๊ฐ ์ ์ ์ฝ๊ธฐ ๊ฐ๋ฅ)๋ฅผ ํ์ณ, ํํ ๋จ์ดยท์ฌ์ฉ์ ์ด๋ฆ ๋ชฉ๋ก์ผ๋ก ์คํ๋ผ์ธ ์ฌ์ ๊ณต๊ฒฉ์ ์ํํ ๋ค ๋ซ๋ฆฐ ๊ณ์ ์ผ๋ก ๋ค์ ํธ์คํธ์ ๋ก๊ทธ์ธํ๋ค. - ์ฐ์ ํ์ฐ: ํ ํธ์คํธ๊ฐ ๊ฐ์ผ๋๋ฉด ๊ทธ ํธ์คํธ์ ์ ๋ขฐ ๊ด๊ณยท๋ผ์ฐํ ์ ๋ณด๋ฅผ ์ด์ฉํด ์ด์ ํธ์คํธ๋ก ์ฆ์ ๋ณต์ ๋๋ค. MIT์์ ์์๋ ๊ฐ์ผ์ ๋ถ๊ณผ ๋ช ์๊ฐ ๋ง์ ์ ๊ตญ ์ฐ๊ตฌ๋ง์ผ๋ก ํผ์ ธ, ๊ฐ ๊ธฐ๊ด์ด ๋คํธ์ํฌ๋ฅผ ๋์ด๋ฒ๋ฆฌ๋ '์๋ ๊ฒฉ๋ฆฌ'๋ก ๊ฒจ์ฐ ์งํํ๋ค.
- ๊ฐ์ผ ํ์์ ํ์ง: ์์ ์ ํธ์คํธ์์ ๋์ํ๊ธฐ ์ ์ ์ ๊ธ(lock) ํ์ผ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๋ด ํ์์ผ๋ก '์ด๋ฏธ ๊ฐ์ผ๋จ'์ ํ์ธํ๋ ค ํ์ง๋ง, ๋ค์์ ์ค๋ช ํ ๊ฒฐํจ ๋๋ฌธ์ ์ ๋๋ก ๋์ํ์ง ์์๋ค.
3. ๋์ ์๋ฆฌ ์์ธ ๋ถ์ โ ์ฝ๋/๊ตฌ์กฐ ๋ ๋ฒจ์์
๋ชจ๋ฆฌ์ค ์์ ํฌ๊ฒ โ ๊ฐ๊ณ ๋ฆฌ(bootstrap) โก ๋ณธ์ฒด(main worm) ๋ก ๋๋ 2๋จ ๊ตฌ์กฐ์๋ค. ์ด์์ฑ๊ณผ ์๋ฐ์ฑ์ ๋์์ ๋ ธ๋ฆฐ ์ค๊ณ์์ง๋ง, '์ฌ๊ฐ์ผ ํ๋ฅ ' ๋ก์ง ํ๋๊ฐ ์์ ์๋ฉธ๋ก ๋ชฐ๊ณ ๊ฐ ๊ฒ์ด ๊ฐ์ฅ ์ ๋ช ํ ๊ธฐ์ ์ ๊ตํ์ด๋ค.
- 1๋จ๊ณ โ '๊ฐ๊ณ ๋ฆฌ(grappling hook)': ์์ ๋ถํธ์คํธ๋ฉ์ ์ฝ 99์ค์ ์งง์ C ํ๋ก๊ทธ๋จ(
l1.c)์ด์๋ค. ์ธ ๊ฐ์ง ๊ฒฝ๋ก ์ค ํ๋๋ก ๋์ ํธ์คํธ์์ ์ ธ ๋ช ๋ น์ ์คํํ ์ ์๊ฒ ๋๋ฉด, ๊ฐ์ง ํ์ผ๋ช ์ผ๋ก ์์ฅํด ์ปดํ์ผยท์คํํ ๋ค ๋ณธ์ฒด๋ฅผ ํต์งธ๋ก ๋์ด์(pull) ์ค์นํ๋ค. '๊ฐ๊ณ ๋ฆฌ'๋ผ๋ ์ด๋ฆ ๊ทธ๋๋ก, ๋ณธ์ฒด๋ฅผ ๋งค๋ฌ์ ๋์ด์ฌ๋ฆฌ๋ ์ญํ ์ด๋ค. - 2๋จ๊ณ โ ์ด์ข (็ฐ็จฎ) ์ํคํ ์ฒ ๋์: ์ ๋ณธ์ฒด๋ VAX/BSD์ Sun 3 ๋ฑ ์ฌ๋ฌ ์ํคํ ์ฒ์ฉ์ผ๋ก ๊ฐ๊ฐ ์ปดํ์ผ๋ ๋ฐ์ด๋๋ฆฌ์, ์์ค๊ฐ ์๋ ํ๊ฒฝ์์๋ ์ค์ค๋ก๋ฅผ ์ปดํ์ผยท๋งํฌํด ์คํํ๋ ๋ก์ง์ ํฌํจํ๋ค. ์ฆ ๋์ ์์คํ ์ CPUยทOS์ ๋ง์ถฐ ์์ ์ ์ฌ๋น๋ํ ์ ์์๋ค.
- 3๋จ๊ณ โ ๋น๋ฐ๋ฒํธ ํฌ๋ํน: ์์ ํ์น
/etc/passwd์ ์ํธ์ ํด์์ ๋ํด ์ฝ 432๊ฐ์ ํํ ๋จ์ด + ์ฌ์ฉ์ ์ด๋ฆ์ ํ๋ณด๋ก ํ ์คํ๋ผ์ธ ์ฌ์ ๊ณต๊ฒฉ์ ๋๋ ธ๋ค. ํ๋ ๊ธฐ์ค์ผ๋ก ์๋ฐํ ๋ชฉ๋ก์ด์ง๋ง, ๋น์์ ์ด๊ฒ๋ง์ผ๋ก๋ ์๋ง์ ๊ณ์ ์ด ๋ซ๋ ธ๋ค. - 4๋จ๊ณ โ '์ฌ๊ฐ์ผ ํ๋ฅ '์ด๋ผ๋ ์น๋ช ์ ๋ฒ๊ทธ (ํต์ฌ): ์์ ์ด๋ฏธ ๊ฐ์ผ๋ ํธ์คํธ๋ฅผ ๋ง๋๋ฉด ๋ฌด์กฐ๊ฑด ๋ฌผ๋ฌ๋๋ ๋์ , 1/7 ํ๋ฅ ๋ก ๋ค์ ๊ฐ์ผ์ํค๋๋ก ์ค๊ณ๋๋ค. ์ค๊ณ์์ ์๋๋ "๊ฐ๋ ๋ค์ ์ฌ์ด์ผ ๊ด๋ฆฌ์๊ฐ ๋ฐฑ์ (ํจ์น)์ ๋์์ ๋๋ ์ด์๋จ๋๋ค"์๋ค. ๊ทธ๋ฌ๋ ์ด ํ๋ฅ ๋ก์ง์ ํ ํธ์คํธ๊ฐ ์์ญ~์๋ฐฑ ๊ฐ์ ์ ๋ณต์ ๋ณธ์ ๋ ์๊ฒ ๋ง๋ค์๊ณ , ๊ทธ ๊ฒฐ๊ณผ CPUยท๋ฉ๋ชจ๋ฆฌยทํ๋ก์ธ์ค ํ ์ด๋ธ์ด ๊ณ ๊ฐ๋ผ ์์คํ ์ด ๋ค์ด๋๋ค. ์์ด ํผ์ง ๊ฒ ์๋๋ผ ์์ด ๋ง๋ ๋ถํ๊ฐ ์์คํ ์ ์ฃฝ์ธ ๊ฒ์ด๋ค.
- 5๋จ๊ณ โ ์๋ฐ์ฑ๊ณผ ์คํจ: ์์ ๋์ ํธ์คํธ๊ฐ ์ด๋ฏธ ๊ฐ์ผ๋๋์ง ํ์ธํ๋ ค ์ ๊ธ ํ์ผ์ ์ผ์ง๋ง, ๋ฒ๊ทธ์ ๊ฒฝ์ ์กฐ๊ฑด(race)์ผ๋ก ํ์ธ์ด ์์ฃผ ์คํจํ๋ค. ๋ ๋ก๊ทธยท์๋ฌ ๋ฉ์์ง๋ฅผ ๋จ๊ธฐ์ง ์์ผ๋ ค ํ ์๋๋ ์คํ๋ ค ์ง๋จ์ ์ด๋ ต๊ฒ ๋ง๋ค์ด, ๊ด๋ฆฌ์๋ค์ด ์์ธ์ ํ์ ํ๊ธฐ๊น์ง ์๊ฐ์ด ๊ฑธ๋ ธ๋ค.
- ์ค๊ณ ์๋ vs ์ค์ ๊ฒฐ๊ณผ: "์ทจ์ฝ์ ์ ์ธ์ด๋ณด๋ ค๋" ์ฝ๋๊ฐ ์ค์ค๋ก ํต์ ๋ถ๋ฅ์ ๋ถํ๋ฅผ ๋ง๋ค์ด ๋คํธ์ํฌ๋ฅผ ๋ง๋น์์ผฐ๋ค. ์ด ์ฌ๊ฑด์ "์์ ํ๋ค๊ณ ๋ฏฟ๋ ์คํ ์ฝ๋๋ ์ด์๋ง์์ ์คํํ๋ฉด ์์ด ๋ ์ ์๋ค"๋ ๊ตํ์ ์ํ์ด๋ค. (PoC 2์์ ์ฌํ)
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ค์ ์ฌ๋ก ์์น
- ๊ฐ์ผ ํธ์คํธ โ ์ฝ 6,000๋: ๋น์ ์ธํฐ๋ท ์ฐ๊ฒฐ ์ฝ 6๋ง ๋์ ์ฝ 10%๊ฐ ๊ฐ์ผ๋๋ค(๋ชจ๋ฆฌ์ค ๋ณธ์ธ์ ์ถ์ฐ์ด์ ๊ฐ์ฅ ๋๋ฆฌ ์ธ์ฉ๋๋ ์์น). ๊ฐ์ผ ๊ธฐ๊ด์๋ MIT, ํ๋ฒ๋, ํ๋ฆฐ์คํด, ์คํ ํผ๋, NASA ์์์ค ์ฐ๊ตฌ์ผํฐ, ๋ก๋ ์ค ๋ฆฌ๋ฒ๋ชจ์ด ๊ตญ๋ฆฝ์ฐ๊ตฌ์, ๋ฏธ๊ตฐ ์์ค ๋ฑ์ด ํฌํจ๋๋ค.
- ๋ณต๊ตฌ ๋น์ฉ โ ๋ฏธ ํ๊ณ๊ฐ์ฌ์(GAO) ์ถ์ 10๋ง~1,000๋ง ๋ฌ๋ฌ: ์ถ์ ํธ์ฐจ๊ฐ ๋งค์ฐ ์ปธ๋๋ฐ, ์ด๋ '์ง์ ์ ๋ฆฌ ๋น์ฉ'๊ณผ '๋คํธ์ํฌ ์ค๋จ ์์ค'์ ์ด๋ป๊ฒ ๊ณ์ฐํ๋๋์ ๋ฐ๋ผ ๊ฐ๋ ธ๊ธฐ ๋๋ฌธ์ด๋ค. ์ปดํจํ ์ญ์ฌ์ ์ฒ์์ผ๋ก '์ฌ์ด๋ฒ ์ฌ๊ณ ์ ๋น์ฉ'์ด ๊ณต์์ ์ผ๋ก ์ถ์ ๋ ์ฌ๋ก ์ค ํ๋๋ค.
- ์ธํฐ๋ท ๋ง๋น: ์ด๋ฉ์ผ์ด ๋ฉฐ์น ๊ฐ ์ง์ฐยท์ ์ค๋๊ณ , ๊ฐ์ผ๋ ์์คํ ์ ๋ฐ์ ์์ด ๋ฉ์ท๋ค. ๊ฐ ๊ธฐ๊ด์ ํผํด ํ์ฐ์ ๋ง์ผ๋ ค ๋คํธ์ํฌ ์ฐ๊ฒฐ์ ๋ฌผ๋ฆฌ์ ์ผ๋ก ๋๋ ๊ฒ ์ธ์ ๋ฐฉ๋ฒ์ด ์์๋ค.
- ์ ๋์ ์ํฅ โ CERT ์ฐฝ์ค: ์ฌ๊ณ ์งํ ๋ฏธ๊ตญ DARPA์ ์ง์์ผ๋ก CERT/CC(Computer Emergency Response Team Coordination Center)๊ฐ ์นด๋ค๊ธฐ๋ฉ๋ฐ๋ SEI์ ์ค๋ฆฝ๋๋ค. ๊ตญ๊ฐ ๋จ์ ์ฌ์ด๋ฒ ์ฌ๊ณ ๋์ ์กฐ์ง์ ์ถ๋ฐ์ ์ด๋ค.
- ๋ฒยท์ ๋์ ์ํฅ: CFAA๊ฐ ์ฒ์ ์ ์ฉ๋ ๋ํ ์ฌ๊ฑด์ด ๋๋ฉฐ, '์๋๊ฐ ์์ด๋ ํผํด๋ฅผ ๋ด๋ฉด ์ฒ๋ฒ๋๋ค'๋ ํ๋ก๋ฅผ ๋จ๊ฒผ๋ค. ์ดํ ์ฌ์ด๋ฒ ๋ณด์ ๋ฒ์ ยท์ฐ๊ตฌ ์ค๋ฆฌ ๋ ผ์์ ๊ธฐ์ค์ ์ด ๋๋ค.
- ๊ธฐ์ ์ฌ์ ์ํฅ: ์์ ์ ํ ๋ฒกํฐ(sendmailยทfingerdยทrsh)๋ฅผ ๋ฐ๋ผ ์๋น์ค๋ณ ์ ๋ ฅ ๊ฒ์ฆยท์ธ์ฆ ๊ฐํยท์ ๋ขฐ ๊ด๊ณ ์ต์ํ๊ฐ ๋ณด์์ ๊ธฐ๋ณธ ์์น์ผ๋ก ์๋ฆฌ ์ก์๊ณ , ์ดํ NimdaยทCode RedยทSlammerยทConficker ๋ฑ์ผ๋ก ์ด์ด์ง๋ '์์ ๊ณ๋ณด'์ ์์กฐ๊ฐ ๋๋ค.
5. PoC โ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋๋ก ๋์ ์๋ฆฌ ์ฌํ
PoC 1 โ '3๋ ์ ํ ๋ฒกํฐ' ๊ตฌ์กฐ: ํ๋์ ์์ด ์๋ก ๋ค๋ฅธ ์ธ ํ์ (sendmail DEBUG, fingerd gets() ์ค๋ฒํ๋ก์ฐ, rsh+ํฌ๋ํน๋ ์ํธ)์ ๋์์ ๋
ธ๋ ค
"์ด๋ ํ๋๋ง ์ด๋ ค ์์ด๋ ๊ฐ์ผ"๋๋ ๊ตฌ์กฐ๋ฅผ ์ฌํํ๋ค. ๋จ์ผ ํจ์น๋ก ์์ ๋ฉ์ถ ์ ์๋ ์ด์ ๋ฅผ ๋ณด์ฌ์ค๋ค.
#!/usr/bin/env python3
"""
PoC 1 โ ๋ชจ๋ฆฌ์ค ์์ '3๋ ์ ํ ๋ฒกํฐ' ๊ตฌ์กฐ ๋ชจ์ (๊ต์ก์ฉ)
1988๋
11์ 2์ผ, ๋ชจ๋ฆฌ์ค ์์ ์๋ก ๋ค๋ฅธ ์ธ ์ทจ์ฝ์ ์ ์กฐํฉํด ํผ์ก๋ค:
A) sendmail DEBUG ๋ช
๋ น ์ฃผ์
โ ๋๋ฒ๊ทธ ๋ชจ๋๋ก ๋ ์๋ sendmail์
'DEBUG' ๋ช
๋ น์ ๋ณด๋ด ์์ ๋ช
๋ น์ ์คํ์ํค๊ณ ์ฝ๋๋ฅผ ์ ์ก
B) fingerd ๋ฒํผ ์ค๋ฒํ๋ก์ฐ โ gets()๊ฐ ์
๋ ฅ ๊ธธ์ด๋ฅผ ๊ฒ์ฌํ์ง ์๋
๊ณ ์ ์ ๋ฒ๊ทธ๋ฅผ ์ด์ฉํด finger ์๋น์ค์ ์
ธ์ฝ๋๋ฅผ ์ฃผ์
C) rsh/rexec + ๋น๋ฐ๋ฒํธ ํฌ๋ํน โ /etc/passwd(๋น์์ ์ ์ ์ฝ๊ธฐ ๊ฐ๋ฅ)๋ฅผ
ํ์ณ ์ฝํ ์ํธ๋ฅผ ์คํ๋ผ์ธ ํฌ๋ํนํ ๋ค rsh/rexec๋ก ์ด๋
์๋ ์ฝ๋๋ ์ค์ ๋คํธ์ํฌ/์๋น์ค ํธ์ถ ์์ด '๊ฐ์์ ํธ์คํธ' ๊ฐ์ฒด์ ๋ํด
๊ฐ ๋ฒกํฐ์ ์ฑ๋ฆฝ ์กฐ๊ฑด๋ง ์ฌํํ๋ค. ์ค์ ์์คํ
์ ์ ํ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
"""
from dataclasses import dataclass
@dataclass
class FakeHost:
"""์ค์ต์ฉ ๊ฐ์ ํธ์คํธ(์ค์ ์ปดํจํฐ๊ฐ ์๋)."""
name: str
sendmail_debug: bool # sendmail์ด DEBUG ๋ชจ๋๋ก ์คํ ์ค์ธ๊ฐ
fingerd_gets: bool # fingerd๊ฐ ๊ฒฝ๊ณ๊ฒ์ฌ ์๋ gets()๋ฅผ ์ฐ๋๊ฐ
rsh_open: bool # rsh/rexec ์ ๋ขฐ ๊ด๊ณ๊ฐ ์ด๋ ค ์๋๊ฐ
weak_password: bool # ๋น๋ฐ๋ฒํธ๊ฐ ์ฌ์ ๊ณต๊ฒฉ์ ๋ซ๋ฆฌ๋๊ฐ
infected: bool = False
def vector_sendmail(h: FakeHost) -> bool:
"""A) sendmail DEBUG ๋ชจ๋๋ก ํ ๋ฒ์ SMTP ์ธ์
์์ ์๊ฒฉ ์คํ."""
return h.sendmail_debug
def vector_fingerd(h: FakeHost) -> bool:
"""B) fingerd gets() ์ค๋ฒํ๋ก์ฐ๋ก ์
ธ ํ๋(512๋ฐ์ดํธ ์ด๊ณผ ์
๋ ฅ)."""
return h.fingerd_gets
def vector_rsh(h: FakeHost) -> bool:
"""C) rsh/rexec + ํฌ๋ํน๋ ์ํธ๋ก ๋ฌด์ธ์ฆ/์ํธ ๊ธฐ๋ฐ ์คํ."""
return h.rsh_open and h.weak_password
if __name__ == "__main__":
hosts = [
FakeHost("smtp-gw", sendmail_debug=True, fingerd_gets=False, rsh_open=False, weak_password=False),
FakeHost("cs-lab-3", sendmail_debug=False, fingerd_gets=True, rsh_open=True, weak_password=True),
FakeHost("db-old", sendmail_debug=False, fingerd_gets=False, rsh_open=True, weak_password=True),
FakeHost("bastion", sendmail_debug=True, fingerd_gets=True, rsh_open=True, weak_password=False),
FakeHost("hardened", sendmail_debug=False, fingerd_gets=False, rsh_open=False, weak_password=False),
]
print("== ๋ชจ๋ฆฌ์ค ์: ํธ์คํธ๋ณ ์ฑ๋ฆฝ ๊ฐ๋ฅํ ์ ํ ๋ฒกํฐ ==")
total = 0
for h in hosts:
paths = []
if vector_sendmail(h):
paths.append("A: sendmail DEBUG")
if vector_fingerd(h):
paths.append("B: fingerd gets() ์ค๋ฒํ๋ก์ฐ")
if vector_rsh(h):
paths.append("C: rsh + ํฌ๋ํน๋ ์ํธ")
h.infected = bool(paths)
total += h.infected
tag = ", ".join(paths) if paths else "์ ํ ๋ถ๊ฐ"
print(f" {h.name:9s} -> ๊ฐ์ผ={h.infected} ({tag})")
print()
print(f"๊ฒฐ๋ก : 5๋ ์ค {total}๋๊ฐ '์๋ก ๋ค๋ฅธ ์ด์ '๋ก ๊ฐ์ผ๋จ "
"-> ๋จ์ผ ์ทจ์ฝ์ ํจ์น๋ก๋ ์์ ๋ฉ์ถ ์ ์๋ค.")
# ์คํ ๊ฒฐ๊ณผ
== ๋ชจ๋ฆฌ์ค ์: ํธ์คํธ๋ณ ์ฑ๋ฆฝ ๊ฐ๋ฅํ ์ ํ ๋ฒกํฐ ==
smtp-gw -> ๊ฐ์ผ=True (A: sendmail DEBUG)
cs-lab-3 -> ๊ฐ์ผ=True (B: fingerd gets() ์ค๋ฒํ๋ก์ฐ, C: rsh + ํฌ๋ํน๋ ์ํธ)
db-old -> ๊ฐ์ผ=True (C: rsh + ํฌ๋ํน๋ ์ํธ)
bastion -> ๊ฐ์ผ=True (A: sendmail DEBUG, B: fingerd gets() ์ค๋ฒํ๋ก์ฐ)
hardened -> ๊ฐ์ผ=False (์ ํ ๋ถ๊ฐ)
๊ฒฐ๋ก : 5๋ ์ค 4๋๊ฐ '์๋ก ๋ค๋ฅธ ์ด์ '๋ก ๊ฐ์ผ๋จ -> ๋จ์ผ ์ทจ์ฝ์ ํจ์น๋ก๋ ์์ ๋ฉ์ถ ์ ์๋ค.
PoC 2 โ '์ฌ๊ฐ์ผ ํ๋ฅ '๊ณผ ๊ณผ์ ๋ณต์ : ๋ชจ๋ฆฌ์ค ์์ ์๋ฉธ์ํจ 1/7 ์ฌ๊ฐ์ผ ๋ก์ง์ ๊ฐ์์ ๋คํธ์ํฌ ๊ทธ๋ํ์์ '์ฌ๊ฐ์ผ ์์'๊ณผ ๋์กฐํ๋ค. ๊ฐ์ '๊ฐ์ผ ๋์'๋ผ๋ ๋ณต์ ๋ณธ ์ด๋ยทํธ์คํธ๋น ๋ถํ๊ฐ ์ผ๋ง๋ ํญ์ฆํ๋์ง ํ์ธํ๋ค.
#!/usr/bin/env python3
"""
PoC 2 โ '์๊ฐ ๋ณต์ + ์ฌ๊ฐ์ผ' ์ ํ ๋์ญํ ๋ชจ์ (๊ต์ก์ฉ)
๋ชจ๋ฆฌ์ค ์์ ์น๋ช
์ ๊ตฌํ ์ค์๋ '์ด๋ฏธ ๊ฐ์ผ๋ ํธ์คํธ๋ ํ๋ฅ ์ ์ผ๋ก ๋ค์
๊ฐ์ผ์ํค๋' ๋ก์ง์ด์๋ค. ์ค๊ณ์๋ "๊ฐ๋ ๋ค์ ์ฌ์ด์ผ ๋ฐฑ์ ์ ์ฐํํ๋ค"๊ณ
ํ๋จํด 1/7 ํ๋ฅ ๋ก ์ฌ๊ฐ์ผ์ ์๋ํ๋๋ฐ, ์ด ๋๋ฌธ์ ํ ํธ์คํธ๊ฐ ์์ญ~์๋ฐฑ
๊ฐ์ ์ ํ๋ก์ธ์ค๋ฅผ ๋ ์์ ๋ฉ๋ชจ๋ฆฌยทCPU๊ฐ ๊ณ ๊ฐ๋๊ณ ์์คํ
์ด ๋ค์ด๋๋ค.
(์ ์์ ์ด ๋ง๋ '๋ถํ'๊ฐ ์์ ๊ฐ์ฅ ํฐ ํผํด์๋ค๋ ์ ์ด ์์ด๋ฌ๋.)
์๋ ์ฝ๋๋ '๊ฐ์์ ๋คํธ์ํฌ ๊ทธ๋ํ'์์
(a) ์ฌ๊ฐ์ผ ์์ (์ฌ๋ฐ๋ฅธ ์ค๊ณ)
(b) 1/7 ํ๋ฅ ์ฌ๊ฐ์ผ (๋ชจ๋ฆฌ์ค ์)
์ ๋์กฐํด, ๊ฐ์ '๊ฐ์ผ ํธ์คํธ ์'๋ผ๋ '๋ณต์ ๋ณธ ์ด๋'์ด ์ผ๋ง๋ ๋ฌ๋ผ์ง๋์ง ๋ณธ๋ค.
"""
import random
# ๊ฐ์์ ๋คํธ์ํฌ: ๋
ธ๋ -> ์ด์ ๋ชฉ๋ก (์ค์ ์ปดํจํฐ ์๋)
NET = {
"host-01": ["host-02", "host-03", "host-04"],
"host-02": ["host-01", "host-03", "host-05"],
"host-03": ["host-02", "host-04", "host-05"],
"host-04": ["host-01", "host-03", "host-05"],
"host-05": ["host-02", "host-03", "host-04", "host-06"],
"host-06": ["host-05", "host-07"],
"host-07": ["host-05", "host-06"],
}
def simulate(reinfect_prob, steps=10, seed=42):
rng = random.Random(seed)
copies = {h: 0 for h in NET} # ํธ์คํธ๋ณ ์ ๋ณต์ ๋ณธ ์
copies["host-01"] = 1 # ์ต์ด ๊ฐ์ผ ์ง์
attempts = 0
for _ in range(steps):
for h in list(NET):
if copies[h] == 0:
continue
for nb in NET[h]:
attempts += 1
if copies[nb] == 0 or rng.random() < reinfect_prob:
copies[nb] += 1
infected = sum(1 for v in copies.values() if v > 0)
return copies, infected, attempts
if __name__ == "__main__":
for label, prob in (("์ฌ๊ฐ์ผ ์์ (์ฌ๋ฐ๋ฅธ ์ค๊ณ)", 0.0),
("1/7 ํ๋ฅ ์ฌ๊ฐ์ผ (๋ชจ๋ฆฌ์ค ์)", 1 / 7)):
copies, infected, attempts = simulate(prob)
total = sum(copies.values())
print(f"[{label}] {10}์คํ
")
print(f" ๊ฐ์ผ ํธ์คํธ: {infected}/{len(NET)} | ์ด ๊ฐ์ผ ์๋: {attempts}")
print(f" ์ ๋ณต์ ๋ณธ ์ด๋: {total}")
heaviest = max(copies.items(), key=lambda kv: kv[1])
print(f" ์ต๋ค ์ค๋ณต ํธ์คํธ: {heaviest[0]} ({heaviest[1]}๊ฐ ๋ณต์ ๋ณธ)")
print(f" -> ํธ์คํธ๋น ํ๊ท ๋ถํ: {total / max(infected, 1):.1f}")
print()
print("๊ฒฐ๋ก : ์ฌ๊ฐ์ผ ํ๋ฅ ๋ก์ง ํ๋๊ฐ '๊ฐ์ผ ๋์'๋ ๋น์ทํด๋")
print(" '๋ณต์ ๋ณธ ์ด๋'๊ณผ 'ํธ์คํธ๋น ๋ถํ'๋ฅผ ํญ์ฆ์ํจ๋ค. ์์")
print(" ํผ์ง๋ ๊ฒ๋ณด๋ค '๊ณผ์ ๋ณต์ '๋ก ์์คํ
์ ๋จผ์ ์ฃฝ์๋ค.")
# ์คํ ๊ฒฐ๊ณผ
[์ฌ๊ฐ์ผ ์์ (์ฌ๋ฐ๋ฅธ ์ค๊ณ)] 10์คํ
๊ฐ์ผ ํธ์คํธ: 7/7 | ์ด ๊ฐ์ผ ์๋: 200
์ ๋ณต์ ๋ณธ ์ด๋: 7
์ต๋ค ์ค๋ณต ํธ์คํธ: host-01 (1๊ฐ ๋ณต์ ๋ณธ)
-> ํธ์คํธ๋น ํ๊ท ๋ถํ: 1.0
[1/7 ํ๋ฅ ์ฌ๊ฐ์ผ (๋ชจ๋ฆฌ์ค ์)] 10์คํ
๊ฐ์ผ ํธ์คํธ: 7/7 | ์ด ๊ฐ์ผ ์๋: 200
์ ๋ณต์ ๋ณธ ์ด๋: 36
์ต๋ค ์ค๋ณต ํธ์คํธ: host-02 (10๊ฐ ๋ณต์ ๋ณธ)
-> ํธ์คํธ๋น ํ๊ท ๋ถํ: 5.1
๊ฒฐ๋ก : ์ฌ๊ฐ์ผ ํ๋ฅ ๋ก์ง ํ๋๊ฐ '๊ฐ์ผ ๋์'๋ ๋น์ทํด๋
'๋ณต์ ๋ณธ ์ด๋'๊ณผ 'ํธ์คํธ๋น ๋ถํ'๋ฅผ ํญ์ฆ์ํจ๋ค. ์์
ํผ์ง๋ ๊ฒ๋ณด๋ค '๊ณผ์ ๋ณต์ '๋ก ์์คํ
์ ๋จผ์ ์ฃฝ์๋ค.
PoC 3 โ ์ฝํ ์ํธ ์คํ๋ผ์ธ ํฌ๋ํน: ์์ด /etc/passwd๋ฅผ ํ์ณ ํํ ๋จ์ด์ ์ฌ์ฉ์ ์ด๋ฆ๋ง์ผ๋ก
๊ณ์ ์ ๋ซ๊ณ ๋ค์ ํธ์คํธ๋ก ์ด๋ํ๋ ๊ตฌ์กฐ๋ฅผ, ๊ฐ์ passwd ๋ ์ฝ๋์ ๋ํ ์ฌ์ ๊ณต๊ฒฉ์ผ๋ก ์ฌํํ๋ค(์ค์ crypt ๋์ ์ฌํ์ฉ ํด์ ์ฌ์ฉ).
#!/usr/bin/env python3
"""
PoC 3 โ '์ฝํ ์ํธ ์คํ๋ผ์ธ ํฌ๋ํน' ์ ํ ๋ฒกํฐ ๋ชจ์ (๊ต์ก์ฉ)
๋ชจ๋ฆฌ์ค ์์ ๊ฐ์ผ๋ ํธ์คํธ์์ /etc/passwd๋ฅผ ์ฝ์ด(๋น์ ์ํธ ํด์๊ฐ ์ ์
์ฝ๊ธฐ ๊ฐ๋ฅํ ํ์ผ์ ์์๋ค) ํํ ๋จ์ดยท์ฌ์ฉ์ ์ด๋ฆ ๊ธฐ๋ฐ ํ๋ณด๋ก '์คํ๋ผ์ธ
์ฌ์ ๊ณต๊ฒฉ'์ ์ํํ๊ณ , ๋ซ๋ฆฐ ๊ณ์ ์ผ๋ก rsh/rexec๋ฅผ ํ๊ณ ๋ค๋ฅธ ํธ์คํธ๋ก
์ด๋ํ๋ค. ์ฆ ์ฝํ ์ํธ ํ๋๊ฐ '๋ค์ ํธ์คํธ๋ก ๊ฐ๋ ์ด์ '์๋ค.
์๋ ์ฝ๋๋ ์ค์ ์์คํ
์ํธ๊ฐ ์๋๋ผ, ๊ฐ์์ passwd ๋ ์ฝ๋์ ๋ํด
'์ํธ + ์ฝํ ๋น๋ฐ๋ฒํธ'๊ฐ ์ด๋ป๊ฒ ์ฌ์ ๊ณต๊ฒฉ์ ๋ฌด๋์ง๋์ง ์ฌํํ๋ค.
์ค์ crypt(3) ๋์ ์ฌํ์ฉ ๋จ์ ํด์๋ฅผ ์ด๋ค(๊ต์ก ๋ชฉ์ ).
"""
import hashlib
def mock_crypt(password: str, salt: str) -> str:
"""์ค์ crypt(3) ๋์ ์ฐ๋ ์ฌํ์ฉ ๋จ์ ํด์(๊ต์ก ๋ชฉ์ )."""
return hashlib.sha256((salt + password).encode()).hexdigest()[:16]
# ์ค์ ๋ฑ๋ก๋ (๊ฐ์์) ๋น๋ฐ๋ฒํธ
REAL_PW = {
"root": "password",
"alice": "qwerty",
"bob": "Zx9!pLm2#vQ",
"carol": "carol",
}
SALTS = {"root": "aa", "alice": "bb", "bob": "cc", "carol": "dd"}
# ์์ด ์ฐ๋ ๊ฒ์ผ๋ก ์๋ ค์ง ํ๋ณด๊ตฐ: ํํ ๋จ์ด + ์ฌ์ฉ์ ์ด๋ฆ(+๋ณํ)
WORDLIST = ["password", "admin", "letmein", "dragon", "monkey",
"secret", "123456", "qwerty"]
def crack(username, salt, target):
candidates = WORDLIST + [username, username + "123", username.capitalize()]
for c in candidates:
if mock_crypt(c, salt) == target:
return c
return None
if __name__ == "__main__":
print("== ๊ฐ์ /etc/passwd ๋์ ์คํ๋ผ์ธ ์ฌ์ ๊ณต๊ฒฉ ==")
print(f"{'user':6s} {'salt':4s} {'ํฌ๋ํน ๊ฒฐ๊ณผ':14s} ์ด๋ ๊ฐ๋ฅ?")
cracked = 0
for user, salt in SALTS.items():
target = mock_crypt(REAL_PW[user], salt)
pw = crack(user, salt, target)
if pw:
cracked += 1
print(f"{user:6s} {salt:4s} {str(pw):14s} {'์' if pw else '์๋์ค'}")
print()
print(f"๊ฒฐ๊ณผ: 4๊ณ์ ์ค {cracked}๊ฐ๊ฐ ํํ ๋จ์ด/์ด๋ฆ๋ง์ผ๋ก ํฌ๋ํน๋จ")
print("๊ฒฐ๋ก : 'ํด์ ํ์ผ์ ๋น๋ฐ์ด ์๋๋ค' + '์ฝํ ์ํธ๋ ๊ณง ์๊ฒฉ ์คํ'์์")
print(" ๋ณด์ฌ์ค๋ค. ์ํธ๊ฐ ์์ด๋ ์ฌ์ ๊ณต๊ฒฉ์๋ ๋ฌด๋ ฅํ๋ค.")
# ์คํ ๊ฒฐ๊ณผ
== ๊ฐ์ /etc/passwd ๋์ ์คํ๋ผ์ธ ์ฌ์ ๊ณต๊ฒฉ ==
user salt ํฌ๋ํน ๊ฒฐ๊ณผ ์ด๋ ๊ฐ๋ฅ?
root aa password ์
alice bb qwerty ์
bob cc None ์๋์ค
carol dd carol ์
๊ฒฐ๊ณผ: 4๊ณ์ ์ค 3๊ฐ๊ฐ ํํ ๋จ์ด/์ด๋ฆ๋ง์ผ๋ก ํฌ๋ํน๋จ
๊ฒฐ๋ก : 'ํด์ ํ์ผ์ ๋น๋ฐ์ด ์๋๋ค' + '์ฝํ ์ํธ๋ ๊ณง ์๊ฒฉ ์คํ'์์
๋ณด์ฌ์ค๋ค. ์ํธ๊ฐ ์์ด๋ ์ฌ์ ๊ณต๊ฒฉ์๋ ๋ฌด๋ ฅํ๋ค.
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ โ ์ด๋ป๊ฒ ๋ง์๊ณ , ๋ฌด์์ ๋ฐฐ์ฐ๋
- ์
๋ ฅ ๊ฒฝ๊ณ ๊ฒ์ฌ (gets() โ fgets()): fingerd ์ฌ๊ณ ์ ์ง์ ์์ธ์ ๊ฒฝ๊ณ ๊ฒ์ฌ ์๋
gets()์๋ค. ๋ชจ๋ ์ธ๋ถ ์ ๋ ฅ์ ๊ธธ์ด๋ฅผ ์ ํํ๊ณ ๋ฒ์๋ฅผ ๊ฒ์ฆํด์ผ ํ๋ค. ์ค๋๋ ์ ๋ฒํผ ์ค๋ฒํ๋ก์ฐยท๋ฉ๋ชจ๋ฆฌ ์์ ์ธ์ด(์: Rust) ๋ ผ์๋ก ์ด์ด์ง๋ ์ถ๋ฐ์ ์ด๋ค. - ๋ถํ์ํ ๊ธฐ๋ฅยท๋๋ฒ๊ทธ ๋ชจ๋ ์ ๊ฑฐ: sendmail์
DEBUG๋ชจ๋๋ ์ง๋จ์ฉ ํธ์ ๊ธฐ๋ฅ์ด์์ง๋ง ์๊ฒฉ ๋ช ๋ น ์คํ ํต๋ก๊ฐ ๋๋ค. ์ด์ ํ๊ฒฝ์์๋ ์ต์ ๊ธฐ๋ฅ ์์น์ผ๋ก ๋๋ฒ๊ทธยท๊ด๋ฆฌ ์ธํฐํ์ด์ค๋ฅผ ๋๊ฑฐ๋ ์ธ๊ฐ๋ ์ ๊ทผ๋ง ํ์ฉํด์ผ ํ๋ค. - ์ ๋ขฐ ๊ด๊ณ์ ์ต์ํ (rsh/.rhosts ํ๊ธฐ): ๋น๋ฐ๋ฒํธ ์์ด ํต๊ณผ์ํค๋
.rhostsยทhosts.equiv์ ๋ขฐ ๊ด๊ณ๋ ์์ '๊ณ ์๋๋ก'์๋ค. ์ค๋๋ SSH ํค + ๊ฐ๋ณ ์ธ์ฆ์ผ๋ก ๋์ฒด๋๊ณ , ์ ๋ก ํธ๋ฌ์คํธ(Zero Trust) ์์น์ ์ ์ ์ผ๋ก ๋ณผ ์ ์๋ค. - ์ํธ ํด์์ ๋ณดํธ (shadow): ์ํธ ํด์๊ฐ ์ ์ ์ฝ๊ธฐ ๊ฐ๋ฅํ
/etc/passwd์ ์๋ ์์ ์๋ ํ ๋๋ง ๋ซ๋ ค๋ ์คํ๋ผ์ธ ํฌ๋ํน์ผ๋ก ๊ณ์ ์ด ๋๋ ํ์ทจ๋๋ค. ํด์๋ฅผ/etc/shadow๋ก ๋ถ๋ฆฌํ๊ณ (๊ทธ๋ฆผ์ ์ํธ) ๊ฐํ ์ํธ ์ ์ฑ ยท๋ค์ค ์ธ์ฆ์ ์ ์ฉํด์ผ ํ๋ค. - ๋ค์ธต ๋ฐฉ์ด์ ์ ์ ํจ์น: ์ธ ๋ฒกํฐ ์ค ํ๋๋ง ๋ง์๋ ์์ ์ฃฝ์ง ์์๋ค. '๋จ์ผ ํต์ ๋ก ์์ '์ ๊ฐ์ ํ์ง ๋ง๊ณ , ํจ์น ๊ด๋ฆฌยท์๋น์ค ์ต์ํยท๋คํธ์ํฌ ๋ถ๋ฆฌ๋ฅผ ๊ฒน๊ฒน์ด ์์์ผ ํ๋ค. (PoC 1์ 'hardened' ํธ์คํธ๊ฐ ๊ทธ ์๋ค.)
- ์์ ์์ง(๋ถํ)์ ๊ฒฌ๋๋ ์ค๊ณ: ๋ชจ๋ฆฌ์ค ์์ ์ต๋ ํผํด๋ ์ทจ์ฝ์ ์์ฒด๊ฐ ์๋๋ผ ์์ด ์ ๋ฐํ ๊ณผ์ ๋ณต์ ๋ถํ์๋ค. ์๋น์ค ์ค๊ณ ์ ํ๋ก์ธ์คยท๋ฉ๋ชจ๋ฆฌยท์ฐ๊ฒฐ ์ ์ํ๊ณผ ๋ ์ดํธ ๋ฆฌ๋ฏธํ ์ ๋์ด ์๊ธฐ ์ฆ์ํ ๋ถํ๋ฅผ ๊ฒฌ๋์ผ ํ๋ค. (PoC 2์ ๊ตํ)
- ์ฌ๊ณ ๋์ ์ฒด๊ณ (CERT์ ํ์): ์ด ์ฌ๊ฑด์ '๋ฌธ์ ๋ฅผ ๋น ๋ฅด๊ฒ ๊ณต์ ํ๊ณ ํ๋ ฅํด ๋์ํ๋ ์กฐ์ง'์ผ๋ก์ CERT๋ฅผ ๋ณ์๋ค. ์ค๋๋ ์ ์ทจ์ฝ์ ๊ณต๊ฐ(coordinated disclosure)ยทCISA KEVยทISAC ์ ๋ณด ๊ณต์ ์ ๋ฟ๋ฆฌ๋ค.
- ๊ตํ ์์ฝ:
- "์๋"๋ ํผํด๋ฅผ ๋ฉด์ ํ์ง ์๋๋ค: ํ๊ดด๋ฅผ ์์น ์์๋ ์คํ์ด ์ธํฐ๋ท์ ๋ฉ์ท๋ค. ์ํํ ์ฝ๋๋ ๊ฒฉ๋ฆฌ๋ ์ค์ต ํ๊ฒฝ์์๋ง ๊ฒ์ฆํด์ผ ํ๋ค.
- ์๊ฐ ๋ณต์ ์ฝ๋์๋ ๋ฐ๋์ '์ ์ง ์กฐ๊ฑด'์: ์ฌ๊ฐ์ผ ํ๋ฅ ํ๋๊ฐ ํต์ ๋ถ๋ฅ์ ๋ณ์๋ค. ์๊ธฐ ์ฆ์ ๋ก์ง์ ์ ํ ์๋ยท๋ณต์ ์ํ์ ๋ช ์์ ์ผ๋ก ์ ํํด์ผ ํ๋ค. (PoC 2)
- ์์ ๊ณ๋ณด๊ฐ ์ฌ๊ธฐ์ ์์๋๋ค: Morris(1988) โ Code Red(2001) โ Slammer(2003) โ Conficker(2008) โ WannaCry/NotPetya(2017). ์ ํ ์๋ฆฌ๋ 30๋ ๋๊ฒ ๋ฐ๋ณต๋๊ณ , ์ง๊ธ๋ ๋ฐ๋ณต๋๊ณ ์๋ค.
์ถ์ฒ
- Wikipedia โ Morris worm โ https://en.wikipedia.org/wiki/Morris_worm
- RFC 1135 โ The Helminthiasis of the Internet (IETF, 1989) โ https://www.rfc-editor.org/rfc/rfc1135.html
- Eugene H. Spafford โ The Internet Worm Program: An Analysis (Purdue, 1988) โ https://docs.lib.purdue.edu/cstech/213/
- Donn Seeley โ A Tour of the Worm (USENIX Winter 1989) โ A Tour of the Worm
- FBI โ The Morris Worm: 30 Years Since First Major Attack on the Internet โ https://www.fbi.gov/news/stories/morris-worm-30-years-since-first-major-attack
- Wikipedia โ Robert Tappan Morris โ https://en.wikipedia.org/wiki/Robert_Tappan_Morris
ํจ๊ป ์ฝ๊ธฐ: ๐ชฑ Conficker (2008) โ SMB ์ทจ์ฝ์ ์์ ๊ณ ์ ยท ๐ฆ Mirai (2016) โ IoT๋ฅผ ๋ฌด๊ธฐ๋ก ์ผ์ ๋ด๋ท ยท ๐ WannaCry (2017) โ EternalBlue๋ก ์ ์ธ๊ณ๋ฅผ ๊ฐํํ ์๊ฐ์ ํํ ์