1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ ์ธ์ , ๋๊ฐ, ์ ์ ๋ช ํ๊ฐ
Conficker(๋ค์ด์ Downupยท๋ค์ด์ด๋ต Downadupยทํค๋ Kido๋ก๋ ๋ถ๋ฆผ)๋ 2008๋ 11์ ์ฒ์ ๋ชจ์ต์ ๋๋ฌ๋ด 2009๋ 1์๊น์ง ์ ์ธ๊ณ 900๋ง~1,500๋ง ๋๋ฅผ ๊ฐ์ผ์ํค๋ฉฐ 2003๋ SQL Slammer ์ดํ ์ต๋ ๊ท๋ชจ์ ์ ๊ฐ์ผ์ผ๋ก ๊ธฐ๋ก๋ Windows ๋์ ์์ด๋ค. 190๊ฐ๊ตญ ์ด์์ ์ ๋ถยท๊ธฐ์ ยท๊ฐ์ PC๋ฅผ ๊ฐ์ผ์์ผฐ๊ณ , "๋ง์ด ํผ๋จ๋ฆฐ ๊ฒ"๋ฟ ์๋๋ผ ๋ฐฑ์ ์ ์ฃฝ์ด๊ณ , ์ ๋ฐ์ดํธ๋ฅผ ๋๊ณ , ์์ ์ ํ์ผ์ ์ ๊ทธ๋ '์๊ฐ ๋ฐฉ์ดํ' ์ค๊ณ๋ก ์ ๊ฑฐ๋ฅผ ๊ทน๋๋ก ์ด๋ ต๊ฒ ๋ง๋ ์ต์ด์ ๋ํ ์ฌ๋ก๋ค.
- ์ด๋ฆ์ ์ ๋: ๋ ๊ฐ์ง ์ค์ด ์ ๋ช
ํ๋ค. โ ์๋จ์ด configure(์ค์ )์ ๋
์ผ์ด ์์ค Ficker์ ํฉ์ฑ์ด โก ์ด๊ธฐ C2(๋ช
๋ น์ ์ด) ๋๋ฉ์ธ์ด์๋
trafficconverter.biz์ ์ฒ ์๋ฅผ ์ฌ๋ฐฐ์ดํ๋ค๋ ์ค(๋ง์ดํฌ๋ก์ํํธ ๋ถ์๊ฐ Joshua Phillips ์ฃผ์ฅ). ์ ์์๋ ์ง๊ธ๊น์ง ๊ณต์์ ์ผ๋ก ํน์ ๋์ง ์์๋ค. - ๊ฒฐ์ ์ ์์ โ ํจ์น ํ 1๊ฐ์ ๋ง์ ์ ์ฉ: Conficker๋ ๋ง์ดํฌ๋ก์ํํธ๊ฐ 2008๋ 10์ 23์ผ ๊ธด๊ธ ํจ์นํ MS08-067(CVE-2008-4250) ์ทจ์ฝ์ ์ ๋ถ๊ณผ ์ฝ ํ ๋ฌ ๋ค์ธ 11์๋ถํฐ ๋๊ท๋ชจ๋ก ์ ์ฉํ๋ค. "ํจ์น์ ์ ์ฉ์ ๊ฐ๊ฒฉ"์ด ๋น์ ๊ธฐ์ค์ผ๋ก ๊ทน๋๋ก ์งง์๋ ์ฌ๊ฑด์ผ๋ก, ํจ์น ๊ด๋ฆฌ์ ์ค์์ฑ์ ๊ฐ์ธ์์ผฐ๋ค.
- ๋ฐ๊ฒฌ ํ์๋ผ์ธ: ๋ณ์ข A(2008-11-21) โ B(2008-12-29) โ C(2009-02-20) โ D(2009-03-04) โ E(2009-04-07). ๋ณ์ข ๋ง๋ค ์ ํยท๊ฐฑ์ ยท์๊ฐ ๋ฐฉ์ด ์ ๋ต์ ๋ฐ๊ฟ๊ฐ๋ฉฐ ๋์์ ํํผํ๋ค. (Conficker Working Group์ B++/C ๋ฑ ๋ค๋ฅธ ๋ช ๋ช ์ ์ฐ๊ธฐ๋ ํ๋ค.)
- ์ ์ ๋ช ํ๊ฐ: โ SQL Slammer ์ดํ ์ต๋ ๊ฐ์ผ ๊ท๋ชจ(์ต๋ 1,500๋ง ๋ ์ถ์ ) โก DGA(๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ) + P2P + ์๋ช ๋ ์ ๋ฐ์ดํธ๋ผ๋ 3์ค C2 ๊ตฌ์กฐ๋ก "์ฃฝ์ง ์๋ ๋ด๋ท"์ ๊ต๊ณผ์๊ฐ ๋จ โข ๋ฐฑ์ ํ๋ก์ธ์ค ์ข ๋ฃยท๋ณด์ ๋๋ฉ์ธ DNS ์ฐจ๋จยทํ์ผ ์ ๊ธ ๋ฑ ์๊ฐ ๋ฐฉ์ด(self-defense) ๊ธฐ๋ฒ์ ์์ด โฃ 2009๋ 2์ ๋ง์ดํฌ๋ก์ํํธ๊ฐ 25๋ง ๋ฌ๋ฌ ํ์๊ธ์ ๊ฑธ๊ณ , Conficker Working Group(MSยทICANNยทVeriSignยทNeustarยทAfiliasยท๋ณด์์ ์ฒด ๋ฑ)์ด ๊ฒฐ์ฑ๋์ด ์ธํฐ๋ท ๋ ์ง์คํธ๋ฆฌ ์ ์ฒด๊ฐ ํ ์ ์ฑ์ฝ๋์ ์ฐํฉ ๋์ํ ์ต์ด์ ์ฌ๋ก.
- ์ฑ ์์ ์์ฌ: 2011๋ FBI์ ์ฐํฌ๋ผ์ด๋ ๊ฒฝ์ฐฐ์ด ์ฐํฌ๋ผ์ด๋์ธ 3๋ช ์ ์ฒดํฌํ์ผ๋ ๊ธฐ์ ๊ธฐ๋ก์ ์๋ค. ์ค์จ๋ด์ธ Mikael Sallnert๋ ๋ฏธ๊ตญ์์ ์ ์ฃ๋ฅผ ์ธ์ ํ๊ณ 48๊ฐ์(4๋ )ํ์ ์ ๊ณ ๋ฐ์๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ์ด๋ป๊ฒ ํผ์ก๋
Conficker๋ "์๊ฒฉ ์ฝ๋ ์คํ ์ทจ์ฝ์ โ ๊ด๋ฆฌ์ ๊ณ์ ์ฌ์ ๋์ โ ์ด๋์ ๋ฏธ๋์ด โ P2P"์ 4๊ฐ ์ ํ ์ถ์ ๋ณ์ข ๋ณ๋ก ์กฐํฉํด, ํจ์น ์ ๋ PCยท์ฝํ ๊ณ์ ยทUSB ์ฌ์ฉ ์กฐ์ง์ ๊ฐ๋ฆฌ์ง ์๊ณ ๋ด๋ถ๋ง ๊น์์ด ํ๊ณ ๋ค์๋ค.
- 1์ถ โ MS08-067 ์๊ฒฉ ์ฝ๋ ์คํ (๋ชจ๋ ๋ณ์ข
): Windows Server ์๋น์ค๊ฐ ํน์ํ๊ฒ ์กฐ์๋ RPC ์์ฒญ์ ์ฒ๋ฆฌํ ๋ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ผ๋ก,
NetpwPathCanonicalize(๊ฒฝ๋ก ์ ๊ทํ ํจ์)์ ์คํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด ์ฝ๋๋ฅผ ์คํํ๋ค. Windows 2000ยทXPยทServer 2003์์๋ ์ธ์ฆ ์์ด ์๊ฒฉ ์ฝ๋ ์คํ์ด ๊ฐ๋ฅํ "์๋จธ๋ธ(wormable)" ์ทจ์ฝ์ ์ด๋ผ, ๊ฐ์ผ PC๊ฐ SMB(445)/NetBIOS(139) ํฌํธ๋ฅผ ํตํด ๋ค์ PC๋ฅผ ์ฐ์ ๊ฐ์ผ์์ผฐ๋ค. (๊ฐ์ ์ทจ์ฝ์ ์ ์ดํ Stuxnet๋ ๋ณด์กฐ ์ ํ ์๋จ์ผ๋ก ์ฌ์ฉ โ ์ด ์ฌ์ดํธ์ Stuxnet ํฌ์คํธ ์ฐธ๊ณ ) - 2์ถ โ ๊ด๋ฆฌ์ ๊ณต์ ์ฌ์ ๋์ (B ๋ณ์ข +): ๊ฐ์ผ PC๋ ๋ด๋ถ๋ง์ ๋ค๋ฅธ PC์ ์๋ ADMIN$ยทC$ ๊ฐ์ ๊ด๋ฆฌ์ ๊ณต์ ๋ฅผ ๋์์ผ๋ก ์ฌ์ฉ์๋ช ยท๋น๋ฐ๋ฒํธ ์ฌ์ ๋์ (dictionary attack)์ ์๋ํ๋ค. "administrator / 123456"๋ฅ์ ์ฝํ ๊ณ์ ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ํจ์น ์ฌ๋ถ์ ๋ฌด๊ดํ๊ฒ ๊ทธ PC๋ฅผ ์ ๋ นํด ์์ผ๋ก ์ด๋ํ๋ค. (PoC 2์์ ์ฌํ)
- 3์ถ โ USB ์ด๋์ ๋ฏธ๋์ด (B ๋ณ์ข +): USB ๋ฉ๋ชจ๋ฆฌ ๋ฑ ์ด๋์ ๋๋ผ์ด๋ธ์ DLL ๊ธฐ๋ฐ AutoRun ํธ๋ก์ด๋ชฉ๋ง๋ฅผ ๋ชฐ๋ ๋ณต์ฌํ๋ค. ๋น์ Windows XP์ AutoRun(์๋ ์คํ)์ ๊ธฐ๋ณธ ํ์ฑํ ์ํ์๊ณ , ๊ฐ์ผ USB๋ฅผ ๊ฝ๊ธฐ๋ง ํด๋ ์ถ๊ฐ ์กฐ์ ์์ด ์ฌ๊ฐ์ผยทํ์ฐ์ด ์ด๋ค์ก๋ค. ์ค์ ๋ก ๋งจ์ฒด์คํฐ ์์ํ(Manchester City Council)๋ USB๊ฐ ์ต์ด ์นจํฌ ๊ฒฝ๋ก๋ก ์ง๋ชฉ๋์ USB ์ฌ์ฉ์ ์ ๋ฉด ๊ธ์งํ๋ค.
- 4์ถ โ LAN ๋ด URL ํธ์ + P2P ๊ฐฑ์ (C/D/E ๋ณ์ข ): C ๋ณ์ข ์ ๊ฐ์ LAN์ ๋ค๋ฅธ ๊ฐ์ผ ํธ์คํธ์ ๋ค์๋ ํ์ดํ๋ก ํ์ด๋ก๋ URL์ ๋ฐ์ด๋ฃ์ด ๋ค์ด๋ก๋๋ฅผ ์ ๋ํ๋ค. D/E ๋ณ์ข ์ UDP๋ก ๊ฐ์ผ ํผ์ด๋ฅผ ํ์ํ ๋ค TCP ๊ธฐ๋ฐ ์ปค์คํ ํ๋กํ ์ฝ๋ก ํ์ผ์ ์ฃผ๊ณ ๋ฐ๋ P2P ๋ง์ ๊ตฌ์ฑํด, C2 ๋๋ฉ์ธ์ด ์ ๋ถ ์ฐจ๋จ๋ผ๋ ๋ด๋ท ๋ด๋ถ์์ ์์ฒด์ ์ผ๋ก ์ ๋ฐ์ดํธ๋ฅผ ์ ํฌํ ์ ์์๋ค.
- C2 โ DGA(๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ): A ๋ณ์ข ์ ๋งค์ผ 250๊ฐ์ ์์ฌ๋์ ๋๋ฉ์ธ์ 5๊ฐ TLD์ ๊ฑธ์ณ ์์ฑํ๊ณ , C/D ๋ณ์ข ์ ํ๋ฃจ 50,000๊ฐ(110๊ฐ TLD) ํ ์ค 500๊ฐ์ ์ ์์ ์๋ํ๋ค. ๋ชจ๋ ๊ฐ์ผ ํธ์คํธ๊ฐ ๊ฐ์ ๋ ์ง ์๋๋ฅผ ๊ณต์ ํ๋ฏ๋ก ๊ฐ์ ๋ชฉ๋ก์ ๊ณ์ฐํ๊ณ , ๊ณต๊ฒฉ์๋ ๊ทธ์ค ํ๋์๋ง ์๋ช ๋ ์ ๋ฐ์ดํธ๋ฅผ ์ฌ๋ ค๋๋ฉด ๋๋ค. (PoC 1์์ ์ฌํ)
3. ๋์ ์๋ฆฌ ์์ธ ๋ถ์ โ ์ฝ๋/๊ตฌ์กฐ ๋ ๋ฒจ์์
Conficker์ ๊ตฌ์กฐ์ ํน์ง์ "๋ฒ์(DGAยทP2P) โ ์๊ฐ ๋ฐฉ์ด(๋ฐฑ์ ํฌยทDNS ์ฐจ๋จยทํ์ผ ์ ๊ธ) โ ์๋ช ๋ ๊ฐฑ์ "์ 3์ธต ์ค๊ณ๋ค. ๋จ์ํ ํผ์ง๋ ์์ด ์๋๋ผ, "ํ์งยท๋ถ์ยท์ ๊ฑฐ" ๊ฐ ๋จ๊ณ๋ฅผ ๊ฒจ๋ฅํ ๋์์ฑ ์ ๋ด์ฅํ ์ต์ด์ ๋ํ ์์ผ๋ก ํ๊ฐ๋๋ค.
- DGA์ ์๋ฆฌ โ ๋ชจ๋๊ฐ ๊ฐ์ '์ถ์๋ถ'๋ฅผ ๊ณต์ ํ๋ค: ๋ณ์ข A๋ ํ์ฌ ๋ ์ง๋ฅผ ์๋๋ก ํ ์์ฌ๋์ ์์ฑ๊ธฐ(PRNG)๋ก ๋งค์ผ 250๊ฐ ๋๋ฉ์ธ์ ๋ง๋ ๋ค(๊ธธ์ด 8~11์, 5๊ฐ TLD). ๋ ์ง๊ฐ ๊ฐ์ผ๋ฉด ๋ชจ๋ ๊ฐ์ผ ํธ์คํธ๊ฐ ๋์ผํ ๋ชฉ๋ก์ ์ป์ผ๋ฏ๋ก, ๊ณต๊ฒฉ์๋ ํ๋ฃจ ์ ์ ํด๋น ๋๋ฉ์ธ ํ๋๋ฅผ ๋ฑ๋กยทํธ์คํ ํด ๋๊ธฐ๋ง ํ๋ฉด ๊ฐ์ผ PC๊ฐ ์ค์ค๋ก ์ฐพ์์จ๋ค. C ๋ณ์ข ์ ๋๋ฉ์ธ ๊ธธ์ด๋ฅผ 4~9์๋ก ์ค์ฌ ์๊ทธ๋์ฒ/ํด๋ฆฌ์คํฑ ํ์ง๋ฅผ ํผํ๊ณ , ํ๋ฃจ 150~200๊ฐ์ ๊ธฐ์กด ์ ์ ๋๋ฉ์ธ๊ณผ ์ถฉ๋ํด ์คํ DDoS๋ฅผ ์ ๋ฐํ ์ํ๊น์ง ์๊ฒผ๋ค.
- ์๋ช ๋ ์ ๋ฐ์ดํธ โ ๋ฐฉ์ด์๋ '๊ฐ์ง ๊ฐฑ์ '์ ๋ชป ๋ฃ๋๋ค: Conficker๊ฐ ๋ฐ์๋ค์ด๋ ํ์ด๋ก๋๋ ์ ๋ถ ์ ์์๋ง ๊ฐ์ง ํค๋ก ์๋ช ๋ผ ์์๋ค. ์ฐ๊ตฌ์๋ค์ด C2 ๋๋ฉ์ธ์ ์ฑํฌํ(๋นผ์์) ์ฒ๋ฆฌํด๋, ๊ทธ ์๋ฆฌ์ ๊ฐ์ง ์ ๋ฐ์ดํธ๋ฅผ ์ฌ๋ ค ๋ด๋ท์ ์ญ์ด์ฉํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํ๋ค. "ํต๋ก๋ฅผ ๋ง๋ ๊ฒ"๋ง์ด ์ ์ผํ ๋ฐฉ์ด์๊ณ , ์ด๊ฒ์ด ๊ตญ์ ๋ ์ง์คํธ๋ฆฌ ์ฐํฉ(์๋ 6์ฅ)์ด ํ์ํ๋ ์ด์ ๋ค.
- ์๊ฐ ๋ฐฉ์ด(self-defense) 3์ข
:
- ๋ฐฑ์ ํ๋ก์ธ์ค ํฌ (D): ๋ฐฑ์ ยทํจ์นยท์ง๋จ ์ ํธ๋ฆฌํฐ ์ด๋ฆ๊ณผ ์ผ์นํ๋ ํ๋ก์ธ์ค๋ฅผ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ํ์งยท์ข ๋ฃํ๋ค.
- ๋ณด์ ๊ธฐ๋ฅ ๋ฌด๋ ฅํ (B/C/D): Windows ์๋ ์ ๋ฐ์ดํธ(AutoUpdate)ยท๋ณด์ ์ผํฐ๋ฅผ ๋นํ์ฑํํ๊ณ , D ๋ณ์ข ์ ์ธ์ดํ ๋ชจ๋ ๋ถํ ์ต์ ๊น์ง ์ ๊ฑฐํ๋ค. B/C/E ๋ณ์ข ์ NetBIOS ๊ด๋ จ DLL์ ์ธ๋ฉ๋ชจ๋ฆฌ ํจ์นํด MS08-067 ๊ตฌ๋ฉ์ ์ ์ (๋ค๋ฅธ ์์ ์ฌ๊ฐ์ผ ์ฐจ๋จ)ํ๋ฉด์ ์์ ๋ง์ ์ฌ์ง์ ํต๋ก๋ฅผ ์ ์งํ๋ค.
- ๋ณด์ ์
์ฒด DNS ์ฐจ๋จ (B/C/D): ๋ณด์ ์
์ฒด ๋๋ฉ์ธ์ ๋ํ DNS ์กฐํ ์์ฒด๋ฅผ ์ฐจ๋จํ๋ค. D ๋ณ์ข
์
DNSAPI.DLL์ ์ธ๋ฉ๋ชจ๋ฆฌ ํจ์นํด ๋ฐฑ์ ์ ๋ฐ์ดํธ ์๋ฒ๋ฅผ '์๋ ๋๋ฉ์ธ'์ฒ๋ผ ๋ณด์ด๊ฒ ๋ง๋ค์๋ค โ ์๊ทธ๋์ฒ๊ฐ ์ต์ ์ผ๋ก ๊ฐฑ์ ๋์ง ์๊ฒ ํ๋ ์ง๋ฅ์ ํํผ๋ค. (PoC 3์์ ์ฌํ)
- ํ์ผ ์ ๊ธ โ ์คํ ์ค ์ญ์ ๋ถ๊ฐ: Conficker๋ ์์ ์ ํ์ผ์ ์๋น์ค๋ก ๋ฑ๋กํด ์คํ ์ค์ธ ๋์ ์ญ์ ๋ฅผ ์ ๊ทธ๊ณ (๊ณต์ ์๋ฐ), ๋ ์ง์คํธ๋ฆฌ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฌ๋ก ์์ ์ ์ค์ ์ด ์ง์์ง๋ฉด ์ค์ค๋ก ๋ณต๊ตฌํ๋ค. ๋ฐ๋ผ์ ์ผ๋ฐ์ ์ธ "ํ์ผ ์ญ์ " ๋ฐฉ์์ ์ ๊ฑฐ๊ฐ ๋ถ๊ฐ๋ฅํ๊ณ , ๋ถํ ์์ ๋๋ ์ธ๋ถ ์์คํ ์์์ ์ฒญ์๊ฐ ํ์ํ๋ค. (๋ง์ดํฌ๋ก์ํํธ๋ MSRT ์ ์ฑ ์ํํธ์จ์ด ์ ๊ฑฐ ๋๊ตฌ์ ๋ถํ ์์ ์ ๊ฑฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ค.)
- ๋ณ์ข E โ ์ฒ์์ผ๋ก '๋์ ๋ฒ๊ธฐ ์์ํ' ํ์ด๋ก๋: 2009๋ 4์ 7์ผ๊ฒฝ ์ฐํฌ๋ผ์ด๋์ ์น ์๋ฒ์์ Waledac ์คํธ๋ด๊ณผ SpyProtect 2009(๊ฐ์ง ๋ฐฑ์ scareware)๋ฅผ ๋ด๋ ค๋ฐ์ ์ค์นํ๋ค. 2009๋ 5์ 3์ผ ์ค์ค๋ก๋ฅผ ์ ๊ฑฐํ์ง๋ง, ์ด๋ฏธ ์ค์น๋ D ๋ณ์ข ์ ๋จ์ ๋ด๋ท์ ์ ์งํ๋ค. E๋ Conficker๊ฐ ๋จ์ '์ ์ '๋ฅผ ๋์ด ์ค์ ์์ตํ ๋ฒ์ฃ(์คํธยท์ฌ๊ธฐ ๋ฐฑ์ ํ๋งค)์ ๋ด๋ท์ ํ์ฉํ ์ฒซ ์ฌ๋ก๋ค.
- 2009๋ 4์ 1์ผ โ '๋ง์ฐ์ ๋๊ณต๊ฒฉ' ๋ฃจ๋จธ์ ์ค์ฒด: ๋ฏธ๋์ด๋ 4์ 1์ผ ๋๊ท๋ชจ ๊ณต๊ฒฉ์ค์ ์๋คํ ๋ณด๋ํ์ง๋ง, ์ค์ ๋ก๋ C ๊ณ์ด์ DGA ํ ๊ฐฑ์ ๋ฉ์ปค๋์ฆ์ด ์๋์ ์์ํ๊ณ (4/1) ๊ณง E ํ์ด๋ก๋(4/7~9)๊ฐ ์ ํฌ๋๋ ์์ค์ด์๋ค. ์ฌ์ ์ DGA ๋๋ฉ์ธ ๋ฑ๋ก์ ๋๋ถ๋ถ ์ฐจ๋จํ Conficker Working Group์ ์ฑ๊ณผ๋ก ๋ํ ์ฌ๊ณ ๋ ๋ฐ์ํ์ง ์์๋ค.
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ค์ ์ฌ๋ก ์์น
- ๊ฐ์ผ ๊ท๋ชจ: 2009๋ 1์ ๊ธฐ์ค ๊ฐ์ผ PC ์ถ์ ์น๊ฐ ์ ์ฒด๋ณ๋ก ์ฝ 900๋ง ๋(F-Secure ๋ฑ) ~ 1,500๋ง ๋์ ๋ฌํด, "2003๋ SQL Slammer ์ดํ ์ต๋ ์ ๊ฐ์ผ"์ผ๋ก ๊ธฐ๋ก๋๋ค(190๊ฐ๊ตญ ์ด์). ๋ค๋ง ์ค์ ํ์ฑ ๋ด๋ท ๊ท๋ชจ๋ ์ด๋ณด๋ค ์์๋ค๋ ๋ถ์๋ ์๋ค.
- '์ฃฝ์ง ์๋ ์': ๋ง์ดํฌ๋ก์ํํธ๋ ์์ฌ ๋ฐฑ์ ์ ํ์ด ๊ฒ์ถํ ๊ฐ์ผ ์๊ฐ 2010๋ ์ค๋ฐ~2011๋ ์ค๋ฐ๊น์ง ์ ์ฝ 170๋ง ๋๋ก ๊พธ์คํ ์ ์ง๋๋ค๊ณ ๋ณด๊ณ ํ๋ค. ์๋ ์ด ์ง๋๋ ์๋ฐฑ๋ง ๋๊ฐ ๊ฐ์ผ ์ํ๋ก ๋จ์ ์๋, ์ ๊ฑฐ๊ฐ ๊ทน๋๋ก ์ด๋ ค์ด ์์์ ๋ณด์ฌ์ค๋ค.
- ํ๋์ค ํด๊ตฐ Intramar๋ง (2009-01-15): ํด๊ตฐ ์ปดํจํฐ๋ง์ด ๊ฐ์ผยท๊ฒฉ๋ฆฌ๋๋ฉด์ ๋นํ ๊ณํ์ ๋ด๋ ค๋ฐ์ง ๋ชปํด ์ฌ๋ฌ ๊ธฐ์ง์ ์ ํฌ๊ธฐ ์ถ๊ฒฉ์ด ์ ์ง๋๋ค.
- ์๊ตญ ๊ตญ๋ฐฉ๋ถยท๊ตฐยท๋ณ์: ๊ตญ๋ฐฉ๋ถ ์ฃผ์ ์์คํ ๊ณผ ํ์ ๋ง, ์๋ฆฝํด๊ตฐ ํจ์ ยท์ ์ํจ์ NavyStar/N* ๋ฐ์คํฌํฑ๊น์ง ๊ฐ์ผ๋๊ณ , ์ ฐํ๋(Sheffield)์ ๋ณ์๋ค์ 800๋ ์ด์์ ์ปดํจํฐ ๊ฐ์ผ์ ๋ณด๊ณ ํ๋ค. ๋ ์ผ ์ฐ๋ฐฉ๊ตฐ(Bundeswehr)๋ ์ฝ 100๋(2009-02-02)๊ฐ ๊ฐ์ผ๋๋ค.
- ๋งจ์ฒด์คํฐ ์์ํ: 2009๋ 2์ IT ์์คํ ๊ฐ์ผ์ผ๋ก ์ฝ 150๋ง ํ์ด๋(๋น์ ํํ ์ฝ 25์ต ์ ์๋น)์ ์ ๋ฌด ์ค๋จ ํผํด๊ฐ ๋ฐ์ํ๊ณ , USB ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ต์ด ์นจํฌ ๊ฒฝ๋ก๋ก ์ง๋ชฉ๋์ด ์ ๋ฉด ์ฌ์ฉ ๊ธ์ง ์กฐ์น๊ฐ ๋ด๋ ค์ก๋ค.
- ํผํด์ ์ฑ๊ฒฉ: Conficker๋ ๋ฐ์ดํฐ๋ฅผ ํ๊ดดํ๊ฑฐ๋ ๊ธ์ ์ ์๊ตฌํ๋ ๋์ฌ์จ์ด๊ฐ ์๋์๋ค. ํผํด๋ ๋๋ถ๋ถ ๊ฐ์ฉ์ฑ ๋ง๋น(ํญ๊ณต๊ธฐ ์ถ๊ฒฉ ์ ์ง, ํ์ ๋ง ๋ง๋น)์ ๋์ยท๋ณต๊ตฌยท์ฒญ์ ๋น์ฉ์ ํํ๋ก ๋ฐ์ํ๋ค. ๋ค๋ง 190๊ฐ๊ตญ ์ ๋ถ๋งยท๊ตฐ๋ง์ ์๊ฐ์๊ฐ ์ฅ์ ํ ์ฌ๊ฑด ์์ฒด๊ฐ ๊ตญ๊ฐ ์๋ณด ์ฐจ์์ ๊ฒฝ๊ฐ์ฌ์ ๋ถ๋ฌ์ผ์ผ์ผฐ๋ค.
- ์ ์ฐ โ DGA์ ํ์คํ: Conficker๊ฐ ์ ๋ณด์ธ ๋ ์ง ์๋ DGA๋ ์ดํ CryptoLocker(2013), Torpig, GameOver Zeus ๋ฑ ์๋ง์ ๋์ฌ์จ์ดยท๋ด๋ท์ด ์ฑํํ๋ฉฐ "C2 ์ฐจ๋จ ํํผ์ ํ์ค ๊ธฐ๋ฒ"์ด ๋๋ค. ๋ฐฉ์ด ์ธก์์๋ DGA ๋๋ฉ์ธ ์ ์ ๋ฑ๋กยท์ฐจ๋จ, ๊ทธ๋ฆฌ๊ณ 2009๋ ์ Conficker Working Group ๋ชจ๋ธ์ ์ดํ ๊ตญ์ ๊ณต์กฐ ์์ (์: 2021๋ Emotet ์ธํ๋ผ ํ์ทจ ์์ )์ ์ ๋ก๊ฐ ๋๋ค.
5. PoC โ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋๋ก ๋์ ์๋ฆฌ ์ฌํ
PoC 1 โ DGA(๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ)์ ํต์ฌ ๊ตฌ์กฐ: "๋ชจ๋ ๊ฐ์ผ ํธ์คํธ๊ฐ ๋ ์ง ์๋๋ก ๊ฐ์ ๋๋ฉ์ธ ๋ชฉ๋ก์ ๊ณ์ฐํ๋ค"๋ ์๋ฆฌ๋ฅผ ์ฌํํ๋ค. ์ค์ Conficker์ PRNG ๊ท์น๊ณผ๋ ๋ฌด๊ดํ๋ฉฐ, ์ค์ C2 ๋๋ฉ์ธ๋ ์์ฑํ์ง ์๋๋ค.
#!/usr/bin/env python3
"""
PoC 1 โ Conficker DGA(๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ) ๊ตฌ์กฐ ๋ชจ์ ์คํ (๊ต์ก์ฉ)
์ค์ Conficker A๋ '๋งค์ผ 250๊ฐ์ ์์ฌ๋์ ๋๋ฉ์ธ์ 5๊ฐ TLD์ ๊ฑธ์ณ ์์ฑ'ํ๊ณ ,
์ ์ธ๊ณ์ ๋ชจ๋ ๊ฐ์ผ ํธ์คํธ๊ฐ ๊ฐ์ ๋ ์ง ์๋๋ฅผ ๊ณต์ ํ๋ฏ๋ก ๊ฐ์ ๋ชฉ๋ก์ ๊ณ์ฐํ๋ค.
๊ณต๊ฒฉ์๋ ๊ทธ์ค ํ๋์ ํ์ด๋ก๋๋ฅผ ์ฌ๋ ค๋๊ธฐ๋ง ํ๋ฉด ๊ฐ์ผ ํธ์คํธ๊ฐ ์ค์ค๋ก ์ฐพ์์จ๋ค.
๋ฐฉ์ด์(Conficker Working Group)๋ ๊ทธ ๋๋ฉ์ธ๋ค์ ์ ์ ๋ฑ๋ก/์ฐจ๋จํด ๊ฐฑ์ ํต๋ก๋ฅผ ๋์๋ค.
์๋ ์ฝ๋๋ ๊ทธ '๋์ ์๋ฆฌ(๋ ์ง ์๋ -> ๊ฒฐ์ ์ ๋๋ฉ์ธ ๋ชฉ๋ก)'๋ง ๋ชจ์ฌํ๋ค.
์ค์ Conficker์ PRNG/๋ฌธ์ ์์ฑ ๊ท์น๊ณผ๋ ๋ฌด๊ดํ๋ฉฐ, ์ค์ C2 ๋๋ฉ์ธ๋ ๋ง๋ค์ง ์๋๋ค.
"""
import random
import datetime
TLDS = [".com", ".net", ".org", ".info", ".biz"] # A ๋ณ์ข
: 5๊ฐ TLD
def generate_domains(seed_date: datetime.date, count: int = 250) -> list:
# ๋งค ๊ฐ์ผ ํธ์คํธ๊ฐ ๊ฐ์ ๋ชฉ๋ก์ ๋ง๋ค๋๋ก '๋ ์ง'๋ก๋ง ์๋ ๊ณ ์
rng = random.Random(seed_date.strftime("%Y%m%d"))
alphabet = "abcdefghijklmnopqrstuvwxyz0123456789"
domains = []
for _ in range(count):
length = rng.randint(8, 11) # A ๋ณ์ข
์ 8~11์ ์์ฑ
name = "".join(rng.choice(alphabet) for _ in range(length))
tld = rng.choice(TLDS)
domains.append(name + tld)
return domains
if __name__ == "__main__":
day = datetime.date(2009, 1, 15) # ํ๋์ค ํด๊ตฐ Intramar๋ง ๊ฐ์ผ์ผ
# ํธ์คํธ A์ ํธ์คํธ B(๋ค๋ฅธ ๋คํธ์ํฌ)๊ฐ ๊ฐ์ ๋ ์ง๋ก ๊ฐ์ ๊ณ์ฐ
host_a = generate_domains(day)
host_b = generate_domains(day)
print(f"[{day}] ํธ์คํธ A๊ฐ ์์ฑํ ์ค๋์ ํ๋ณด ๋๋ฉ์ธ: {len(host_a)}๊ฐ")
print(" ์ฒ์ 10๊ฐ:", ", ".join(host_a[:10]))
print(f"[{day}] ํธ์คํธ B๋ ๋์ผํ ๋ชฉ๋ก์ ๊ณ์ฐํ๋๊ฐ? {host_a == host_b}")
print(" B์ 10๋ฒ์งธ ๋๋ฉ์ธ:", host_b[9])
print(" -> ์๋๊ฐ ๊ฐ์ผ๋ฉด ์ ์ธ๊ณ ๊ฐ์ผ PC๊ฐ ๋งค์ผ ๊ฐ์ '์ถ์๋ถ'๋ฅผ ๊ณต์ ํ๋ค")
print(" -> ๋ฐฉ์ด์๊ฐ ์ด ๋ชฉ๋ก์ ๋ฑ๋ก์ ์ ์ ์ฐจ๋จํ๋ฉด ๊ฐฑ์ ํต๋ก๊ฐ ๋๊ธด๋ค")
# ์คํ ๊ฒฐ๊ณผ
[2009-01-15] ํธ์คํธ A๊ฐ ์์ฑํ ์ค๋์ ํ๋ณด ๋๋ฉ์ธ: 250๊ฐ
์ฒ์ 10๊ฐ: xezu4dwf.org, pcdtmqtr7bk.com, 4ecse9sz.net, vohym2sot.com, oqc4c0x2.biz, x6kfx8jhme.org, 9rvbcaaap.net, 37qe6wfp.biz, k288ox9u0j.info, y8fh4d7v0d.com
[2009-01-15] ํธ์คํธ B๋ ๋์ผํ ๋ชฉ๋ก์ ๊ณ์ฐํ๋๊ฐ? True
B์ 10๋ฒ์งธ ๋๋ฉ์ธ: y8fh4d7v0d.com
-> ์๋๊ฐ ๊ฐ์ผ๋ฉด ์ ์ธ๊ณ ๊ฐ์ผ PC๊ฐ ๋งค์ผ ๊ฐ์ '์ถ์๋ถ'๋ฅผ ๊ณต์ ํ๋ค
-> ๋ฐฉ์ด์๊ฐ ์ด ๋ชฉ๋ก์ ๋ฑ๋ก์ ์ ์ ์ฐจ๋จํ๋ฉด ๊ฐฑ์ ํต๋ก๊ฐ ๋๊ธด๋ค
PoC 2 โ ADMIN$ ์ฌ์ ๋์ ๊ณต๊ฒฉ๊ณผ ๊ณ์ ์ ๊ธ ์ ์ฑ ์ ํจ๊ณผ: ๋คํธ์ํฌ ํธ์ถ ์์ด ๊ฐ์ ๊ณต์ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก "์ฝํ ๋น๋ฐ๋ฒํธ๊ฐ ๋ด๋ถ๋ง ์ด๋์ ํ์ฉํ๋ ๊ณผ์ "๊ณผ "์ ๊ธ ์ ์ฑ ยท๊ฐํ ๋น๋ฐ๋ฒํธ๊ฐ ์ด๋ฅผ ๋ฌด๋ ฅํํ๋ ๊ณผ์ "์ ๋์กฐํ๋ค.
#!/usr/bin/env python3
"""
PoC 2 โ Conficker B์ ADMIN$ ๊ณต์ '์ฌ์ ๋์
๊ณต๊ฒฉ' ๋์ ๊ตฌ์กฐ ๋ชจ์ (๊ต์ก์ฉ)
Conficker B๋ MS08-067 ์ธ์, ๊ฐ์ผ PC์์ ๋ด๋ถ๋ง์ ๋ค๋ฅธ PC๋ก
๊ด๋ฆฌ์ ๊ณต์ (ADMIN$/C$)์ ๋ํ ์ฌ์ฉ์๋ช
+๋น๋ฐ๋ฒํธ ์ฌ์ ๋์
์ ์๋ํด
'ํจ์น ์ ๋ ๊ณ์ '์ ํต์งธ๋ก ์ ๋ นํ๋ ๋ฐฉ์์ผ๋ก ์์ผ๋ก ํผ์ก๋ค.
์๋ ์ฝ๋๋ ๋คํธ์ํฌ ํธ์ถ ์์ด '๊ฐ์์ ๋ก์ปฌ ์ค์ต ๋์' ๊ฐ์ฒด์ ๋ํด
โ ๋ฌด์์ ๋์
(์คํ๋ ์ด) โก ๊ณ์ ์ ๊ธ ์ ์ฑ
์ ํจ๊ณผ๋ฅผ ์ฌํํ๋ค.
์ค์ ์๊ฒฉ ๊ณต์ /์ค์ ์์คํ
์ ๋์์ผ๋ก ํ์ง ์๋๋ค.
"""
from dataclasses import dataclass
@dataclass
class FakeShareTarget:
"""์ค์ต์ฉ ๊ฐ์ ๋์: ์ค์ ์์คํ
์ด ์๋๋ผ ๋ฉ๋ชจ๋ฆฌ ์ ๊ฐ์ฒด๋ค."""
hostname: str
username: str
password: str
lockout_threshold: int = 5 # Nํ ์คํจ ์ ๊ณ์ ์ ๊ธ (์ ์ฑ
์ค์ ๊ฐ)
failed: int = 0
locked: bool = False
# 2008~2009๋
๋น์ ์ค์ ๋ก ๋๋ฆฌ ์ฐ์ด๋ '์ฝํ ๊ด๋ฆฌ์ ๋น๋ฐ๋ฒํธ' ์ ํ
PASSWORD_LIST = ["", "password", "123456", "admin", "administrator",
"P@ssw0rd", "letmein", "changeme", "test", "root"]
USERNAMES = ["administrator", "admin", "guest"]
def try_credential(target: FakeShareTarget, user: str, pwd: str) -> bool:
if target.locked:
return False
if user == target.username and pwd == target.password:
return True
target.failed += 1
if target.failed >= target.lockout_threshold:
target.locked = True # ์ ๊ธ ์ ์ฑ
๋ฐ๋
return False
def spray(target: FakeShareTarget):
print(f"[*] ๋์ {target.hostname} ({target.username}) โ ์ฌ์ ๋์
์์ "
f"(์ ๊ธ ์๊ณ {target.lockout_threshold}ํ)")
for user in USERNAMES:
for pwd in PASSWORD_LIST:
if target.locked:
print(f" ! {target.failed}ํ ์คํจ -> ๊ณ์ LOCKED. ๋ ์ด์ ์๋ ๋ถ๊ฐ "
f"(๋จ์ ํ๋ณด {len(PASSWORD_LIST)*len(USERNAMES) - (USERNAMES.index(user)*len(PASSWORD_LIST) + PASSWORD_LIST.index(pwd))}๊ฐ ํฌ๊ธฐ)")
return False
if try_credential(target, user, pwd):
print(f" + ์ฑ๊ณต: {user} / '{pwd or '(๋น ์ํธ)'}' "
f"({target.failed}ํ ์คํจ ํ) -> ๊ณต์ ์ ๋ น = ๋ด๋ถ๋ง ์ด๋ ์๋ฃ")
return True
print(" - ์คํจ: ๋ชฉ๋ก ์ ์ฒด๋ฅผ ์๋ํ์ผ๋ ์ฑ๊ณต ์์")
return False
if __name__ == "__main__":
print("== ์๋๋ฆฌ์ค 1: ๊ณ์ ์ ๊ธ ์ ์ฑ
์์ (์๊ณ๊ฐ 999) ==")
weak = FakeShareTarget("PC-07", "administrator", "P@ssw0rd", lockout_threshold=999)
spray(weak)
print()
print("== ์๋๋ฆฌ์ค 2: ์ ๊ธ ์ ์ฑ
์์ (5ํ) ==")
hardened = FakeShareTarget("PC-42", "administrator", "Kj9#xQ2!vL", lockout_threshold=5)
spray(hardened)
print(" -> ๊ฐํ ๋น๋ฐ๋ฒํธ + ์ ๊ธ ์ ์ฑ
= ์ฌ์ ๋์
์ด '์๋น์ค ๊ฑฐ๋ถ'๋ง ๋จ๊ธฐ๊ณ ์คํจ")
# ์คํ ๊ฒฐ๊ณผ
== ์๋๋ฆฌ์ค 1: ๊ณ์ ์ ๊ธ ์ ์ฑ
์์ (์๊ณ๊ฐ 999) ==
[*] ๋์ PC-07 (administrator) โ ์ฌ์ ๋์
์์ (์ ๊ธ ์๊ณ 999ํ)
+ ์ฑ๊ณต: administrator / 'P@ssw0rd' (5ํ ์คํจ ํ) -> ๊ณต์ ์ ๋ น = ๋ด๋ถ๋ง ์ด๋ ์๋ฃ
== ์๋๋ฆฌ์ค 2: ์ ๊ธ ์ ์ฑ
์์ (5ํ) ==
[*] ๋์ PC-42 (administrator) โ ์ฌ์ ๋์
์์ (์ ๊ธ ์๊ณ 5ํ)
! 5ํ ์คํจ -> ๊ณ์ LOCKED. ๋ ์ด์ ์๋ ๋ถ๊ฐ (๋จ์ ํ๋ณด 25๊ฐ ํฌ๊ธฐ)
-> ๊ฐํ ๋น๋ฐ๋ฒํธ + ์ ๊ธ ์ ์ฑ
= ์ฌ์ ๋์
์ด '์๋น์ค ๊ฑฐ๋ถ'๋ง ๋จ๊ธฐ๊ณ ์คํจ
PoC 3 โ ์๊ฐ ๋ฐฉ์ด ๋ฃจํด์ ๋ก์ง: ๊ฐ์ ์์คํ ๊ฐ์ฒด๋ฅผ ๋์์ผ๋ก โ ๋ฐฑ์ ํ๋ก์ธ์ค ํ์งยท์ข ๋ฃ โก ๋ณด์ ์๋น์ค ๋นํ์ฑํ โข ๋ณด์ ์ ์ฒด ๋๋ฉ์ธ DNS ์ฐจ๋จ(DNSAPI ํจ์น์ ๋์๋ง ๋ชจ์)์ ์์๋๋ก ๋ณด์ฌ์ค๋ค. ์ค์ ์์คํ ์๋ ์๋ฌด ์ํฅ๋ ์ฃผ์ง ์๋๋ค.
#!/usr/bin/env python3
"""
PoC 3 โ Conficker C/D์ '์๊ฐ ๋ฐฉ์ด(self-defense)' ๊ตฌ์กฐ ๋ชจ์ (๊ต์ก์ฉ)
C/D ๋ณ์ข
์ ๊ฐ์ผ PC์์ ๋ฐ๊ฐยท์ ๊ฑฐ๋ฅผ ์ด๋ ต๊ฒ ๋ง๋๋ ๋ฐฉ์ด ๋ฃจํด์ ๋๋ ธ๋ค:
1) 1์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฑ์ /์ง๋จ ๋๊ตฌ ํ๋ก์ธ์ค๋ฅผ ํ์งยท์ข
๋ฃ
2) Windows ์๋ ์
๋ฐ์ดํธ(wuauserv) ๋ฑ ๋ณด์ ๊ด๋ จ ์๋น์ค ๋นํ์ฑํ
3) DNSAPI.DLL์ ์ธ๋ฉ๋ชจ๋ฆฌ ํจ์นํด ๋ณด์ ์
์ฒด ๋๋ฉ์ธ ์กฐํ ์์ฒด๋ฅผ ์ฐจ๋จ
์๋ ์ฝ๋๋ ๊ฐ์์ ํ๋ก์ธ์ค ํ
์ด๋ธ/์๋น์ค ๋ชฉ๋ก/DNS ํด์๊ธฐ๋ฅผ ๋์์ผ๋ก
๊ทธ '๋ก์ง'๋ง ์ฌํํ๋ค. ์ค์ ํ๋ก์ธ์ค ์ข
๋ฃยท์ค์ DLL ํจ์น๋ ์ผ์ ํ์ง ์๋๋ค.
"""
import time
BLOCKED_PROCESSES = {"avguard.exe", "avgnt.exe", "msmpeng.exe",
"ekrn.exe", "bdagent.exe", "savservice.exe"}
BLOCKED_DOMAINS = ("update.antivirus.example", "defender.example",
"malware-scanner.example")
SERVICES_TO_DISABLE = {"wuauserv": "Windows Update", "BITS": "Background Intelligent Transfer",
"ERSvc": "Error Reporting", "WinDefend": "Windows Defender"}
class FakeSystem:
"""์ค์ต์ฉ ๊ฐ์ ์์คํ
(์ค์ OS ์๋)."""
def __init__(self):
self.procs = {"lsass.exe": 1, "explorer.exe": 2, "avguard.exe": 3,
"svchost.exe": 4, "msmpeng.exe": 5, "wuauclt.exe": 6}
self.services = dict(SERVICES_TO_DISABLE)
self.dns_cache = {}
def resolve(self, hostname: str) -> str:
if any(hostname.endswith(b) for b in BLOCKED_DOMAINS):
return None # DNS ์กฐํ ์์ฒด๋ฅผ ์คํจ๋ก ์์ฅ
return "1.2.3.4"
def self_defense_sweep(sys: FakeSystem):
# 1) 1์ด ๊ฐ๊ฒฉ '๋ฐฑ์ ํ๋ก์ธ์ค ํฌ' ๋ฃจํ (์ฌ๊ธฐ์๋ 1ํ ์ค์์ผ๋ก ํํ)
killed = [p for p in sys.procs if p.lower() in BLOCKED_PROCESSES]
for p in killed:
del sys.procs[p]
print(f"[1] ํ๋ก์ธ์ค ์ค์: {killed or '๋ฐ๊ฒฌ ์์'}")
print(f" ์ด์๋จ์ ํ๋ก์ธ์ค: {sorted(sys.procs)}")
# 2) ๋ณด์ ๊ด๋ จ ์๋น์ค ๋นํ์ฑํ
for svc in list(sys.services):
sys.services[svc] = "DISABLED"
print(f"[2] ์๋น์ค ๋นํ์ฑํ: { {k: v for k, v in sys.services.items()} }")
# 3) ๋ณด์ ์
์ฒด ๋๋ฉ์ธ DNS ์ฐจ๋จ (DNSAPI ์ธ๋ฉ๋ชจ๋ฆฌ ํจ์น์ ๋์๋ง ๋ชจ์)
probes = ["www.google.com", "update.antivirus.example", "defender.example", "www.bbc.co.uk"]
results = {h: sys.resolve(h) for h in probes}
print(f"[3] DNS ํด์ ๋ชจ์: {results}")
print(" -> ๋ฐฑ์ ์
๋ฐ์ดํธ ์๋ฒ๊ฐ '์๋ ๋๋ฉ์ธ'์ฒ๋ผ ๋ณด์ฌ ์ต์ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ์ง ๋ชปํจ")
if __name__ == "__main__":
print("๊ฐ์ผ PC์ ์๊ฐ ๋ฐฉ์ด ๋ฃจํด 1ํ ์ค์ (๊ฐ์ ์์คํ
๋์):")
self_defense_sweep(FakeSystem())
# ์คํ ๊ฒฐ๊ณผ
๊ฐ์ผ PC์ ์๊ฐ ๋ฐฉ์ด ๋ฃจํด 1ํ ์ค์ (๊ฐ์ ์์คํ
๋์):
[1] ํ๋ก์ธ์ค ์ค์: ['avguard.exe', 'msmpeng.exe']
์ด์๋จ์ ํ๋ก์ธ์ค: ['explorer.exe', 'lsass.exe', 'svchost.exe', 'wuauclt.exe']
[2] ์๋น์ค ๋นํ์ฑํ: {'wuauserv': 'DISABLED', 'BITS': 'DISABLED', 'ERSvc': 'DISABLED', 'WinDefend': 'DISABLED'}
[3] DNS ํด์ ๋ชจ์: {'www.google.com': '1.2.3.4', 'update.antivirus.example': None, 'defender.example': None, 'www.bbc.co.uk': '1.2.3.4'}
-> ๋ฐฑ์ ์
๋ฐ์ดํธ ์๋ฒ๊ฐ '์๋ ๋๋ฉ์ธ'์ฒ๋ผ ๋ณด์ฌ ์ต์ ์๊ทธ๋์ฒ๋ฅผ ๋ฐ์ง ๋ชปํจ
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ โ ์ด๋ป๊ฒ ๋ง์๊ณ , ๋ฌด์์ ๋ฐฐ์ฐ๋
- ํจ์น ์๋๊ฐ ์ ๋ถ๋ค: MS08-067์ 2008๋ 10์ 23์ผ ํจ์น๊ฐ ๋์๊ณ Conficker๋ ํ ๋ฌ ๋ค ์ด๋ฅผ ์ ์ฉํ๋ค. "ํจ์น ๊ณต๊ฐ ํ N์ผ ์์ ์ ์ฉ๋๋ค"๋ ๋ฒ์น์ ์ด๊ธฐ ๊ต๊ณผ์ ์ฌ๋ก. ์ทจ์ฝํ ๊ตฌํ Windows(ํนํ XP)๊ฐ ๋จ์ ์๋ ํ๊ฒฝ์ ์ค๋๋ ์๋ ๊ฐ์ ์ํ์ ์๊ณ ์๋ค.
- ์ฝํ ๊ด๋ฆฌ์ ๊ณ์ ์ฐจ๋จ: ์ฌ์ ๋์ ๊ณต๊ฒฉ์ โ ๊ฐํ ๋น๋ฐ๋ฒํธ โก ๊ณ์ ์ ๊ธ ์ ์ฑ (5ํ ์คํจ ์ ์ ๊ธ) โข ๋ถํ์ํ ๊ด๋ฆฌ์ ๊ณต์ (ADMIN$) ์ ๊ฑฐยท ์ต์ ๊ถํ์ผ๋ก ๋ง์ ์ ์๋ค. PoC 2์ ์๋๋ฆฌ์ค ๋์กฐ๊ฐ ๊ทธ๋๋ก ์ค๋ฌด ์์น์ด๋ค.
- AutoRunยทUSB ํต์ : XP์ ์๋ ์คํ ๊ธฐ๋ณธ๊ฐ์ ๋นํ์ฑํํ๊ณ , ์ด๋์ ๋ฏธ๋์ด ์ ์ฑ (ํ์ฉ ๋ชฉ๋ก, ์ํธํ, ๊ฒ์ญ ์ค์บ)์ ์ธ์ด๋ค. "USB ํ๋๊ฐ ๋ด๋ถ๋ง ์ ์ฒด๋ฅผ ๋ฌด๋๋จ๋ฆฌ๋" ๊ฒฝ๋ก๋ Conficker ์ดํ ์ง๊ธ๊น์ง๋ ๊ฐ์ฅ ํํ ์นจํฌ ์๋ฒ์ด๋ค.
- SMB ๋ ธ์ถ ์ต์ํ: ์ธํฐ๋ทยท๋น์ ๋ขฐ ๊ตฌ๊ฐ์ 445/139 ํฌํธ๋ฅผ ์ด์ด๋์ง ๋ง๊ณ , ๋ด๋ถ๋ง๋ ์ธ๊ทธ๋จผํธ๋ก ๋๋ ํก์ ์ด๋(lateral movement) ๋ฐ๊ฒฝ์ ์ค์ธ๋ค. MS08-067๋ฅ์ ๊ตฌํ ํ๋กํ ์ฝ์ ๊ฐ๋ฅํ๋ฉด ์ฐจ๋จยท๋์ฒดํ๋ค.
- DGA ๋์ โ '๋ฑ๋ก ์ ์ ์ฐจ๋จ' ์ฐํฉ: Conficker Working Group์ DGA ๋๋ฉ์ธ ๋ชฉ๋ก์ ๊ณ์ฐํด ICANNยท๊ฐ๊ตญ ๋ ์ง์คํธ๋ฆฌ(.cl, .ca, .pa, .ch/.li, .pl ๋ฑ)๊ฐ ํด๋น ๋๋ฉ์ธ์ ๋ฑ๋ก ์์ฒด๋ฅผ ์ ์ ์ฐจ๋จํ๊ฒ ํ๋ค. ๋จ์ผ ์กฐ์ง์ด ์๋๋ผ ์ธํฐ๋ท ์ธํ๋ผ ์ ์ฒด๊ฐ ํ๋ ฅํด์ผ ๋ด๋ท C2๋ฅผ ๋ง์ฌ์ํฌ ์ ์๋ค๋ ๊ตํ์ ๋จ๊ฒผ๋ค.
- ์๋ํฌ์ธํธ ํ๋ ํ์ง์ ๋ถํ ์์ ์ฒญ์: "ํ๋ก์ธ์ค๊ฐ 1์ด ๊ฐ๊ฒฉ์ผ๋ก ๋ฐฑ์ ์ ์ข ๋ฃํ๋ค", "๋ณด์ ์ ์ฒด DNS๊ฐ ์กฐํ ์คํจํ๋ค", "์๋น์ค๊ฐ ๋๋ ๋นํ์ฑํ๋๋ค" ๊ฐ์ ํ๋ ํจํด์ ํ์งํ๊ณ , ํ์ผ ์ ๊ธํ ๋ฉ์จ์ด๋ ๋ถํ ์์ /์ธ๋ถ ์ค์บ ๋๊ตฌ๋ก ์ ๊ฑฐํ๋ค.
- ๊ตํ:
- "์์ง ์๋ฌด ์ง๋ ์ ํ์ผ๋ ๊ด์ฐฎ๋ค"๋ ์ฐฉ๊ฐ: E ๋ณ์ข ์ด ๋ฑ์ฅํ๊ธฐ ์ ๊น์ง Conficker๋ '์ ์ ๋ง ํ๋ ์'์ด์๋ค. ๊ทธ๋ฌ๋ 900๋ง ๋ ๊ท๋ชจ์ ๋ด๋ท ์์ฒด๊ฐ ์ธ์ ๋ ๋ฌด๊ธฐํ๋ ์ ์๋ ์ ๋ต ์์ฐ์ด๋ค. C2 ํต์ ๊ถ์ ๊ฐ์ง ๊ฐ์ผ ๊ธฐ๊ธฐ = ์ ์ฌ ๊ณต๊ฒฉ ํ๋ซํผ์ด๋ค.
- ์๋ช ๋ ๊ฐฑ์ ์ฑ๋์ ์คํธํ์ด ๋ถ๊ฐ๋ฅํ๋ค: ์ ๋ฐ์ดํธ์ ์๋ช ์ ์๊ตฌํ ์ค๊ณ ๋์ ์ฐ๊ตฌ์๋ค์ ๋ด๋ท์ ์ญ์ด์ฉํ์ง ๋ชปํ๊ณ , ์ค์ง "๋ฌผ๋ฆฌ์ ํต๋ก ์ฐจ๋จ"(๋๋ฉ์ธ ์ ์ ยท๋ ์ง์คํธ๋ฆฌ ์ฐํฉ)๋ง์ด ์ ํจํ๋ค. ๊ณต๊ฒฉ์์ ์ํธํ ์ค๊ณ๊ฐ ๋ฐฉ์ด ์ต์ ์ ์ ํํ ์ ์๋ค๋ ๊ฒ ์์ฒด๊ฐ ๊ตํ์ด๋ค.
- ๊ณผ์ฅ๋ ์ํ ๊ณตํฌ๋ ํผํด๋ค: 2009๋ 4์ 1์ผ '๋๊ณต๊ฒฉ์ค'์ ์ค์ ํผํด๋ณด๋ค ํฐ ์ฌํ์ ๋น์ฉ์ ๋ณ์๋ค. ์ํ ์ ๋ณด๋ ์ ํํ ์์น์ ํ์ ๋(confidence)์ ํจ๊ป ์ ํ๋ผ์ผ ํ๋ค.
- ๊ตญ์ ๊ณต์กฐ์ ์ํ: ๋ฏผ๊ฐ ๋ณด์์ ์ฒดยทICANNยทTLD ๋ ์ง์คํธ๋ฆฌยท๊ตญ๊ฐ CERT๊ฐ ํ ๋ด๋ท์ ์ฐํฉํ ์ต์ด์ ์ฌ๋ก๋, 10๋ ๋ค Emotet ์ธํ๋ผ ๊ณต๋ ํ์ทจ(2021) ๊ฐ์ ์์ ์ ์ค๊ณ๋๊ฐ ๋๋ค. ์ ์ฑ์ฝ๋ ๋์์ ์ํ๊ณ ์ ์ฒด์ ๋ฌธ์ ๋ค.
์ถ์ฒ
- Wikipedia โ Conficker โ https://en.wikipedia.org/wiki/Conficker
- Microsoft โ MS08-067 ๋ณด์ ๊ฒ์ํ (Critical) โ https://learn.microsoft.com/en-us/security-updates/securitybulletins/2008/ms08-067
- Microsoft Security Response Center โ CVE-2008-4250 โ https://msrc.microsoft.com/update-guide/vulnerability/CVE-2008-4250
- SRI International โ An Analysis of Conficker (Porras, Saidi, Yegneswaran, 2009-03-19) โ https://web.archive.org/web/2009/http://mtc.sri.com/Conficker/
- Symantec โ The Downadup Codex (NahorneyยทPark, 2009-03-13) โ https://web.archive.org/web/2015/http://www.symantec.com/content/en/us/enterprise/media/security_response/whitepapers/the_downadup_codex_ed2.pdf
- F-Secure โ Worm:W32/Downadup โ https://www.f-secure.com/v-descs/worm_w32_downadup_al.shtml
ํจ๊ป ์ฝ๊ธฐ: โ๏ธ Stuxnet (2010) โ MS08-067์ ๋ณด์กฐ ์ ํ ์๋จ์ผ๋ก ๋ณ์ฉํ ๊ตญ๊ฐ๊ธ ์ ยท ๐ WannaCry (2017) โ "์๋จธ๋ธ ์ทจ์ฝ์ ์ ์ ๋ต์ ๋น์ถ โ ์ ์ถ โ ์ ์ธ๊ณ์ ์"์ผ๋ก ์ด์ด์ง NSA ๋ฌด๊ธฐ ์ฐ๊ฒฐ๊ณ ๋ฆฌ ยท ๐ฆ Mirai (2016) โ ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ ์ฌ์ ๋์ ์ด IoT์์ ์ฌํ๋ ์ฌ๋ก