- ์ ์ฑ์ฝ๋๋ช : CryptoLocker (Trojan:Win32/Crilock.A ๊ณ์ด) โ ์ต์ด์ ๋๊ท๋ชจ '๊ฐํ ์ํธ' ๋์ฌ์จ์ด
- ๋ฑ์ฅ: 2013๋ 9์(9/5 ์ ํ ์ต์ด ๊ด์ธก) โ Dell SecureWorksยทSymantecยทFireEye๊ฐ ์๋ฌ์ ๋ถ์ ๋ณด๊ณ
- ๋ฐฐํฌ(1์ฐจ ์นจํฌ): Gameover ZeuS(P2P ZeuS) ๋ด๋ท โ Cutwail ์คํธ ๋ด๋ท์ด ๋ฟ๋ฆฐ ZIP ์ฒจ๋ถ(์ด์ค ํ์ฅ์
.pdf.exe)๊ฐ ์คํ ๋๋กํผ - ์ํธ ๊ตฌ์กฐ: ํ์ผ๋ง๋ค AES ๋์นญํค๋ก ์ํธํ โ ๊ทธ ๋์นญํค๋ฅผ ์ ์ฑ์ฝ๋์ ํ๋์ฝ๋ฉ๋ RSA-2048 ๊ณต๊ฐํค๋ก ๋ด์ธ โ ๊ฐ์ธํค๋ C2 ์๋ฒ์๋ง ์กด์ฌ (ํผํด์๋ ์๋ฆฌ์ ์ผ๋ก ๋ณตํธ ๋ถ๊ฐ)
- ๋ชธ๊ฐ ์ฒญ๊ตฌ: ๋นํธ์ฝ์ธ ๋๋ ์ ๋ถ ๋ฐ์ฐ์ฒ(MoneyPak/Ukash/CashU) ยท ์ฒ์ 2 BTC(โ$300) โ ๊ธฐํ ๊ฒฝ๊ณผ ์ 10 BTC(โ$2,300)๋ก ์ธ์ ยท 72์๊ฐ ์นด์ดํธ๋ค์ด ํ ๊ฐ์ธํค ํ๊ธฐ ํต๋ณด
- ํผํด ๊ท๋ชจ: Dell SecureWorks ์ถ์ ์ฝ 23๋ง~25๋ง ๋ ๊ฐ์ผ, ์ฒซ ๋ ๋ฌ๊ฐ ๋ชธ๊ฐ ์ฝ $2700๋ง โ 2013๋ ์ต๋ ์์ตํ ์ฌ์ด๋ฒ ๋ฒ์ฃ
- ์ข ๊ฒฐ: 2014๋ 6์ 2์ผ 'Operation Tovar' โ ๋ฏธ FBIยท์ ๋ฝ Europolยท๋ค๊ตญ์ ์์ฌ๊ธฐ๊ด + ๋ฏผ๊ฐ ๋ณด์์ฌ๊ฐ Gameover ZeuS P2P๋ง์ ์ฑํฌํ ์ฒ๋ฆฌํ๋ฉฐ ๋ฐฐํฌยทํค ์ ๋ฌ ๊ฒฝ๋ก ์ฐจ๋จ
1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ '์ํธ๋ฅผ ๋ชธ๊ฐ์ผ๋ก' ํ ์ฒซ ์ธ๋
๋์ฌ์จ์ด ๊ฐ๋ ์์ฒด๋ 1989๋ AIDS Trojan(์์ด์ฆ ํธ๋ก์ด๋ชฉ๋ง)๊น์ง ๊ฑฐ์ฌ๋ฌ ์ฌ๋ผ๊ฐ์ง๋ง, ๊ทธ๊ฑด ์ฐํธ ๋์ค์ผ์ผ๋ก ๋ฐฐํฌ๋๊ณ ์ํธ๊ฐ ํ์ ํด ๊ณง ํ๋ ธ๋ค. 2000๋ ๋์ '๊ฐ์ง ๋ฐฑ์ (try & pay)'์ ํ์ผ์ ์ง์ฐ๋ ์ฒ๋ง ํ์ง ์ค์ ๋ก ์ํธํํ์ง ์์๋ค. CryptoLocker๊ฐ ๋ฑ์ฅํ 2013๋ ์ ์ด๋ฅด๋ฌ์์ผ ์ธ ๊ฐ์ง๊ฐ ๋์์ ์ฑ์ํ๋ค.
- โ ๊ฐํ ์ํธ์ ๊ฐ์ผ ์์ฉํ: RSA-2048 + AES๋ฅผ ๊ตฌํํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ํํด์ ธ, ๊ฐ์ธ ๊ฐ๋ฐ์๋ '๊ตญ๊ฐ๊ธ ๋์ด๋'์ ์ํธ๋ฅผ ์ ์ฉํ ์ ์๊ฒ ๋๋ค. CryptoLocker์ ํค ๊ด๋ฆฌ๋ ๋น์ ๊ธฐ์ค์ผ๋ก ๋งค์ฐ ์ ๊ตํ๊ณ , ๊ทธ๋์ '๋ณต๊ตฌ ๋๊ตฌ'๊ฐ ๊ฑฐ์ ์กด์ฌํ์ง ์์๋ค.
- โก ์ต๋ช ๊ฒฐ์ ๋ง(๋นํธ์ฝ์ธ): 2013๋ ๋นํธ์ฝ์ธ์ ์ฒ์์ผ๋ก ๋ชธ๊ฐ์ ์ถ์ ๋ถ๊ฐ๋ฅํ๊ฒ, ์ฆ์, ์ ์ธ๊ณ ์ด๋์๋ ์๊ธํ ์ ์๊ฒ ํด์คฌ๋ค. ๋์ฌ์จ์ด๊ฐ '๋ฒ์ฃ ์ฌ์ '์ผ๋ก ์ฑ๋ฆฝํ๋ ๊ฒฐ์ ์ ์กฐ๊ฐ์ด์๋ค.
- โข ์ ํต ์ธํ๋ผ(๋ด๋ท): Gameover ZeuS๋ผ๋ ๊ฑฐ๋ํ ์ํ ํธ๋ก์ด๋ชฉ๋ง ๋ด๋ท์ด ์ด๋ฏธ ์์ญ๋ง ๋๋ฅผ ์ฅ์ ํ๊ณ ์์๊ณ , CryptoLocker๋ ๊ทธ ๋ด๋ท์ '์ ํต๋ง'์ผ๋ก ๋น๋ ค ์ผ๋ค. ๋ฉ์จ์ด ์ด์์์ ๋ด๋ท ์ด์์๊ฐ ์์ต์ ๋๋๋ ์ต์ด์ ๋ณธ๊ฒฉ ํํธ๋์ญ์ด์๋ค.
์ ์ ๋ช ํ๊ฐ: CryptoLocker๋ '๋์ฌ์จ์ด 1์ธ๋'์ ๋ฌธ๋ฒ์ ์์ฑํ๋ค. ํ์ผ ์ํธํ โ ๋ชธ๊ฐ ์ฒญ๊ตฌ โ ์นด์ดํธ๋ค์ด โ ๋ฏธ๋ฉ ์ ํ๊ธฐ โ ๋นํธ์ฝ์ธ ๊ฒฐ์ . ๊ทธ ๋ค์ ๋์จ CryptoWallยทTorrentLockerยทLockyยทPetyaยทWannaCryยทRyukยทContiยทLockBit์ ๋ชจ๋ ์ด ๋ฌธ๋ฒ์ ๋ฌผ๋ ค๋ฐ์๋ค. ์ด ๊ธ์์ ๋ค๋ฃฌ ์ ์๋ WannaCryยทNotPetya๊ฐ '์ํ ์ฌ๋'์ด๋ผ๋ฉด, CryptoLocker๋ '๊ณผ๊ธ ๋ชจ๋ธ์ ์ํ'์ด๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ๋ด๋ท์ด ์ด ์ค ์คํธ, ์คํ๋๋ ์๊ฐ ์ ๊ธด๋ค
CryptoLocker๋ ์ค์ค๋ก ํผ์ง์ง ์๋๋ค(์๊ณผ ๊ฒฐ์ ์ ์ฐจ์ด). ๋์ ์ด๋ฏธ ๊ฐ์ผ๋ ๋ด๋ท์ด '์ด๋ฐ์ฑ '์ด์๋ค.
- 1๋จ๊ณ โ ์คํธ ์ ์
: Cutwail ๋ด๋ท์ด "๋ฐฐ์ก ์๋ด์ / ์ก์ฅ / ๊ณ ๊ฐ ๋ถ๋ง / ์ด๋ ฅ์" ๊ฐ์ ์ ๋ชฉ์ ๋ฉ์ผ์ ๋๋ ๋ฐ์ก.
์ฒจ๋ถ๋ ZIP์ผ๋ก ์์ถ๋ ํ์ผ์ธ๋ฐ, ์ค์ ๋ก๋
invoice.pdf.exe์ฒ๋ผ ์ด์ค ํ์ฅ์๋ก ์์ฅํด ์คํ ํ์ผ์์ ์จ๊ฒผ๋ค. - 2๋จ๊ณ โ ์คํ ๋๋กํผ: ์ฌ์ฉ์๊ฐ ์ด๋ฉด ZIP ์์ ์คํ ํ์ผ์ด ๊ตฌ๋๋๊ณ , ์ดํ ํ์ผ ์ํธํ๊ฐ ์์๋๋ค. ์ผ๋ถ ๋ณ์ข ์ Gameover ZeuS ์์ฒด๊ฐ ์ง์ ๋ด๋ ค๋ฐ์ ์คํ์ํค๋ ๋ฐฉ์์ผ๋ก ์ ํฌ๋๋ค(์ด ๋๋ฌธ์ ๋ฐฐํฌ๋ง๊ณผ ์ํธํ ์ ์ฑ์ฝ๋์ ๊ฒฝ๊ณ๊ฐ ํ๋ฆฟํ๋ค).
- 3๋จ๊ณ โ C2 ํต์ : ์ ์ฑ์ฝ๋๋ ๋ฏธ๋ฆฌ ์ ํ ๋๋ฉ์ธ ์์ฑ ์๊ณ ๋ฆฌ์ฆ(DGA)๋ก ๋ค์์ ๋๋ฉ์ธ์ ๋ง๋ค์ด C2์ ์ ์ํ๊ณ , ์ฌ๊ธฐ์ ๋ช ๋ นยท์ค์ ยท๊ทธ๋ฆฌ๊ณ (๋ชธ๊ฐ ๋ฉ๋ถ ์) ๊ฐ์ธํค ๋ณต๊ตฌ ์ ๋ณด๋ฅผ ์ฃผ๊ณ ๋ฐ๋๋ค.
- 4๋จ๊ณ โ ์ฆ์ ์ํธํ: ๋ก์ปฌ ๋๋ผ์ด๋ธ์ ์ฐ๊ฒฐ๋ ๋คํธ์ํฌ ๊ณต์ ๊น์ง ํ์ผ๋ฉฐ ๋ฌธ์ยท์ฌ์งยท์์ถํ์ผ ๋ฑ ํ์ ํ์ฅ์๋ฅผ ์ํธํํ๋ค. ํ๋ก์ธ์ค๊ฐ ๋งค์ฐ ๋นจ๋ผ '๊ฐ์งํ๊ณ ์ ์์ ๋ฝ๊ธฐ' ์ ์ ์์ฒ ๊ฐ ํ์ผ์ด ์ ๊ธฐ๋ ์ผ์ด ํํ๋ค.
3. ๋์ ์๋ฆฌ ์์ธ ๋ถ์ โ '๋ด์ธ'๋ ์ด์ ๊ฐ ๋ชธ๊ฐ์ ๊ทผ๊ฑฐ๋ค
ํต์ฌ์ ํค ๊ด๋ฆฌ(key management)๋ค. ํ์ ์ํธํ์ ๋ค๋ฃจ์ง ์์ ๊ณต๊ฒฉ์๋, ์๋ ๊ตฌ์กฐ๋ง ๊ฐ์ถ๋ฉด ์ฌ์ค์ ๊นฐ ์ ์๋ ๋ชธ๊ฐ์ ๋ง๋ค ์ ์๋ค. CryptoLocker์ ์ค๊ณ๋ ๋๋ต ์ด๋ฌํ๋ค(๊ณต๊ฐ ๋ถ์ ๊ธฐ๋ฐ ์ฌ๊ตฌ์ฑ).
- ๋์นญํค ์์ฑ: ํผํด์๋ง๋ค(ํน์ ์ธ์ ๋ง๋ค) ๋ฌด์์ ๋์นญํค๋ฅผ ํ๋ ๋ง๋ ๋ค. ์ค์ ๊ตฌํ์ AES ๊ณ์ด์ ์ฌ์ฉํ๊ณ , ํ์ผ์ ์ด ํค๋ก ๋น ๋ฅด๊ฒ ์ํธํํ๋ค. ๋์นญํค๋ ๋น ๋ฅด์ง๋ง 'ํค ๋ฐฐํฌ' ๋ฌธ์ ๊ฐ ์๋ค โ ํค๋ฅผ ์์ ํ๊ฒ ๋ณด๊ดํ ๊ณณ์ด ํ์ํ๋ค.
- ๋น๋์นญํค๋ก ๋ด์ธ: ๊ทธ ๋์นญํค๋ฅผ ์ ์ฑ์ฝ๋์ ํ๋์ฝ๋ฉ๋ RSA-2048 ๊ณต๊ฐํค๋ก ์ํธํํ๋ค. ๊ณต๊ฐํค๋ ๋๊ตฌ๋ ๋ณผ ์ ์์ง๋ง, ์ง์ด ๋๋ ๊ฐ์ธํค๋ ์ค์ง ๊ณต๊ฒฉ์์ C2 ์๋ฒ์๋ง ์๋ค. ์ฆ ํผํด์ PC์๋ '๋ด์ธ๋ ์์'๋ง ๋จ๋๋ค.
- ๊ฐ์ธํค์ ๋ถ์ฌ = ๋ณต๊ตฌ ๋ถ๊ฐ: ๊ฐ์ธํค ์์ด๋ ๋ด์ธ์ ํ ์ ์๊ณ , ๋ด์ธ์ ํ์ง ๋ชปํ๋ฉด ๋์นญํค๋, ํ์ผ๋ ์ป์ ์ ์๋ค. "๋์ ๋ด์ผ๋ง ์ด๋ฆฐ๋ค"๋ ์๋ฐ์ด ์ฌ๊ธฐ์ ์ํ์ ์ผ๋ก ์ฑ๋ฆฝํ๋ค. CryptoLocker๊ฐ ์ด์ ์ธ๋์ ์ฐจ์์ด ๋ฌ๋๋ ์ง์ ์ด๋ค.
- ์นด์ดํธ๋ค์ด๊ณผ ๊ฐ๊ฒฉ ์ธ์: ํ๋ฉด์ 72์๊ฐ ํ์ด๋จธ๋ฅผ ๋์ฐ๊ณ , ์ด๊ณผํ๋ฉด ๋ชธ๊ฐ์ 2 BTC โ 10 BTC๋ก ์ฌ๋ฆฐ๋ค. ํฌ์์ฑยท๊ธด๊ธ์ฑ์ ๋ง๋ค์ด '์ง๊ธ ๊ฒฐ์ '๋ฅผ ์ ๋ํ๋ ์ ํ์ ์ฌ๋ฆฌ ์ค๊ณ๋ค.
- ํ๋ฉด ์ ๊ธ + ์๋ด ํ์ผ: ๋ฐ์คํฌํฑ์ ๊ฒฐ์ ์๋ด ์ฐฝ์ ๋์ฐ๊ณ ๊ฐ ํด๋์ ์๋ด ํ์ผ์ ๋จ๊ธด๋ค. ์ด '์ฌ์ฉ์ ์ธํฐํ์ด์ค'๊ฐ ๊ณง ๋์ฌ์จ์ด์ ์์ตํ ์ ์ ์ด๋ค.
๊ธฐ์ ์ ์ผ๋ก ๋์ฌ๊ฒจ๋ณผ ์ : CryptoLocker๋ ์ํธ๋ฅผ ๊นจ์ ๋ฌด๋ ฅํํ ๊ฒ์ด ์๋๋ผ, ์ ํต ๋ด๋ท(Gameover ZeuS)์ ๋ฌด๋ ฅํํด์ ์ด๊ฒผ๋ค. ๋์ฌ์จ์ด ๋ฐฉ์ด์ ๋ ์ถ โ ์ํธ/๋ฐฑ์ (๋ณต๊ตฌ๋ ฅ)๊ณผ ์ ํต๋ง/์นจํฌ ์ฐจ๋จ(์๋ฐฉ๋ ฅ) โ ์ด ์ ๋์์ ํ์ํ์ง ๋ณด์ฌ์ฃผ๋ ์ฌ๋ก๋ค.
4. ํผํด ๊ท๋ชจ/์ํฅ โ '๋์ฌ์จ์ด ์ฐ์ '์ด ์ด๋ฆฌ๋ค
- ๊ฐ์ผ ๋์: Dell SecureWorks์ 2013๋ ๋ง ์ถ์ ์ผ๋ก ์ฝ 23๋ง~25๋ง ๋. ์ ์ธ๊ณ ์ค์๊ธฐ์ ยท๋ณ์ยท๊ฒฝ์ฐฐ์ยท๊ฐ์ธ PC๊ฐ ์์ฌ ์์๋ค.
- ๋ชธ๊ฐ ์์ : ์ฒซ ๋ ๋ฌ(2013๋ 9~11์) ๋์ ์ฝ $2700๋ง(โ3๋ฐฑ์ต ์) ์๋น์ด ์ง๋ถ๋ ๊ฒ์ผ๋ก ์ถ์ . ํ ๊ฑด๋น 2~10 BTC์์์ ๊ฐ์ํ๋ฉด ๋ง๋ํ ๊ท๋ชจ๋ค.
- ๊ณ์ด ์์กยท์์ฌ: Gameover ZeuS์ ์ง๋์๋ก ์ง๋ชฉ๋ Evgeniy Bogachev('slavik')๋ FBI ๊ธฐ์ยทํ์๊ธ $300๋ง์ด ๊ฑธ๋ ธ๊ณ (2026๋ ํ์ฌ๋ ๋ฏธ๊ฒ๊ฑฐ), CryptoLocker ์ ํต๊ณผ ๊ฒฐ๋ถ๋๋ค.
- ์ํ๊ณ ํ์ฐ: CryptoLocker์ ์ฑ๊ณต์ ๊ณง๋ฐ๋ก CryptoWall, TorrentLocker, CryptoLocker 2.0 ๋ฑ ๋ชจ๋ฐฉยท๋ณ์ข ๋ฌ์๋ฅผ ๋ถ๋ ๊ณ , ransomware-as-a-service(RaaS)์ '๋ชธ๊ฐ โ ์ด์ค ๊ฐ์ทจ(๋ฐ์ดํฐ ์ ์ถ ํ๋ฐ)'๋ก ์ด์ด์ง๋ ํ๋ ๋์ฌ ์ํ๊ณ์ ์ถ๋ฐ์ ์ด ๋๋ค.
- ์ญ์ค์ ๊ตฌ์ : Operation Tovar๋ก C2๋ฅผ ์์ํ๋ ๊ณผ์ ์์ ํ๋ณด๋ ๊ฐ์ธํค ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ถ์,
์ผ๋ถ ํผํด์๋
decryptcryptolocker.com๊ฐ์ ๋ฏผ๊ฐ ๋ณต๊ตฌ ์๋น์ค๋ก ํ์ผ์ ๋์ฐพ์ ์ ์์๋ค โ 'ํค๋ฅผ ์ค์์ ๋' ์ค๊ณ๊ฐ ์ญ์ผ๋ก ์ฝ์ ์ด ๋ ์๊ฐ์ด์๋ค.
5. ๊ต์ก์ฉ PoC 4์ข โ ์๋ฆฌ๋ง ์ฌํํ๋ ๋ชจ์ ์ฝ๋
์๋ ์ค๋ํซ์ ์๋ ค์ง ๊ณต๊ฐ ๋ถ์์ ๋ฐํ์ผ๋ก ํ ์ฌ๊ตฌ์ฑ์ด๋ฉฐ, ๊ฐ์์ ๋ก์ปฌ ์ค์ต ๋๋ ํฐ๋ฆฌ /tmp/lab์์๋ง ๋์ํ๋๋ก ๋ง๋
๊ต์ก์ฉ ๋ชจ์ ์ฝ๋๋ค. ์ค์ ์ ํฌ์ฉ ๋๋กญํผ๋ ๊ฐ์ทจ ์ ์ฐจ๋ ์๋ค.
PoC 1 โ ํ์ ํ์ผ ์ด๊ฑฐ(ํ์ ํ ๋ก์ง). ๋์ฌ์จ์ด๋ ๋ฌด์์๊ฐ ์๋๋ผ ๊ฐ์น ์๋ ํ์ฅ์๋ฅผ ๊ณจ๋ผ ์ํธํํ๋ค.
# PoC 1: ํ์ ํ์ฅ์ ์ด๊ฑฐ โ "๋ฌด์์ ๋
ธ๋ฆฌ๋๊ฐ"๋ง ๋ณด์ฌ์ฃผ๋ ์์ (/tmp/lab ํ์ )
import os
TARGET_EXT = {".doc", ".docx", ".xls", ".xlsx", ".pdf", ".jpg", ".png",
".txt", ".zip", ".sql", ".ppt", ".pptx", ".csv"}
def enumerate_targets(root="/tmp/lab"):
hits = []
for dirpath, _dirs, files in os.walk(root):
for f in files:
if os.path.splitext(f)[1].lower() in TARGET_EXT:
hits.append(os.path.join(dirpath, f))
return hits
if __name__ == "__main__":
# ์ค์ต ๋๋ ํฐ๋ฆฌ๋ฅผ ๋จผ์ ์ค๋น: mkdir -p /tmp/lab && echo hi > /tmp/lab/a.txt
for p in enumerate_targets():
print("[ํ์ ]", p)
print("์ด ํ์ ์:", len(enumerate_targets()))
PoC 2 โ '๋ด์ธ๋ ์ด์ ' ๊ตฌ์กฐ(ํค ๊ด๋ฆฌ ํต์ฌ). ์ค์ CryptoLocker์ ์ฌ์ฅ๋ถ๋ฅผ ์์ ํ๊ฒ ์ฌํํ๋ค. ์ฌ๊ธฐ์๋ ๋คํธ์ํฌ๋ก ํค๋ฅผ ๋ณด๋ด์ง ์๊ณ ๋ก์ปฌ์์ RSA๋ก ๋์นญํค๋ฅผ ๊ฐ์ธ๋ ๊ฒ๊น์ง๋ง ๋ณด์ฌ์ค๋ค.
# PoC 2: ๋์นญํค ์์ฑ โ RSA ๊ณต๊ฐํค๋ก '๋ด์ธ'(wrap) โ ์ค์ ๊ฐ์ทจ/์ก์ ์ ์์
# ํ์: pip install cryptography (๊ต์ก์ฉ ๋ก์ปฌ ์คํ ์ ์ฉ)
import os
from cryptography.hazmat.primitives.ciphers.aead import AESGCM
from cryptography.hazmat.primitives.asymmetric import rsa, padding
from cryptography.hazmat.primitives import hashes
# --- ๊ณต๊ฒฉ์ ์ธก: ํค์ ์ค๋น. ์ค์ ๋ก๋ RSA-2048 '๊ณต๊ฐํค'๋ง ์
์ฑ์ฝ๋์ ํ๋์ฝ๋ฉ๋จ ---
attacker_private = rsa.generate_private_key(public_exponent=65537, key_size=2048)
attacker_public = attacker_private.public_key() # ์ด ๊ณต๊ฐํค๋ง ๋ฐฐํฌ๋๋ค
def encrypt_one(plaintext: bytes):
# (1) ํ์ผ๋ง๋ค ๋ฌด์์ AES-256 ๋์นญํค ์์ฑ
sym_key = AESGCM.generate_key(bit_length=256)
nonce = os.urandom(12)
ciphertext = AESGCM(sym_key).encrypt(nonce, plaintext, None)
# (2) ๊ทธ ๋์นญํค๋ฅผ RSA ๊ณต๊ฐํค๋ก '๋ด์ธ' โ ๊ฐ์ธํค ์์ด๋ ๋ชป ์ถ
wrapped = attacker_public.encrypt(
sym_key,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None))
# ์ค์ ์
์ฑ์ฝ๋๋ ์ฌ๊ธฐ์ wrapped ๋ฅผ C2๋ก ์ ์กํ๊ณ ๋ก์ปฌ ํค๋ ์ง์ด๋ค.
return nonce, ciphertext, wrapped
# --- ํผํด์ ์ธก: ๊ฐ์ธํค๊ฐ ์์ผ๋ฉด ์๋ฆฌ์ ์ผ๋ก ๋ณต๊ตฌ ๋ถ๊ฐ ---
def decrypt_one(nonce, ciphertext, wrapped, private_key):
sym_key = private_key.decrypt(
wrapped,
padding.OAEP(mgf=padding.MGF1(algorithm=hashes.SHA256()),
algorithm=hashes.SHA256(), label=None))
return AESGCM(sym_key).decrypt(nonce, ciphertext, None)
if __name__ == "__main__":
n, ct, w = encrypt_one(b"educational-demo-only")
print("[๋ณตํธํ ์๋ โ ๊ฐ์ธํค ๋ณด์ ์]", decrypt_one(n, ct, w, attacker_private))
try:
decrypt_one(n, ct, w, rsa.generate_private_key(public_exponent=65537, key_size=2048))
except Exception as e:
print("[๋ณตํธํ ์๋ โ ๋ค๋ฅธ ํค ์ฌ์ฉ ์] ์คํจ:", type(e).__name__)
PoC 3 โ ์นด์ดํธ๋ค์ดยท๋ชธ๊ฐ ์ธ์(์ฌํ๊ณตํ ๋ก์ง). ์ ์ฑ์ฝ๋์ '์์ ' ๋ถ๋ถ์ ์ฌ๋ฆฌ ์ค๊ณ๋ค.
# PoC 3: 72์๊ฐ ์นด์ดํธ๋ค์ด + ๊ธฐํ ๊ฒฝ๊ณผ ์ ๊ฐ๊ฒฉ ์ธ์(๋ชจ์). ์ค์ ๊ฒฐ์ /ํ๊ธฐ๋ ์์.
import time
def ransom_message(elapsed_hours: float) -> str:
deadline = 72
left = deadline - elapsed_hours
price = 2 if left > 0 else 10 # BTC: ๊ธฐํ ๋ด 2, ์ด๊ณผ 10
if left > 0:
return f"[๋ชจ์] ๋ชธ๊ฐ {price} BTC ยท ๋จ์ ์๊ฐ {left:.1f}h โ ๊ฒฐ์ ํ๋ฉด ๋ณต๊ตฌ ํค๋ฅผ ์ค๋ค(์ฒ)."
return f"[๋ชจ์] ๊ธฐํ ์ด๊ณผ โ ๋ชธ๊ฐ {price} BTC๋ก ์ธ์. ๊ฐ์ธํค๋ ํ๊ธฐ๋๋ค๊ณ ์ฃผ์ฅํ๋ค(์ฒ)."
if __name__ == "__main__":
for h in (0, 30, 71.9, 72.1):
print(ransom_message(h))
PoC 4 โ ๋ฐฉ์ด ๊ฒ์ฆ(๋ณต๊ตฌ๋ ฅ ํ ์คํธ). ๊ฐ์ฅ ๊ฐ๋ ฅํ ๋์์ '๋ชธ๊ฐ์ ์ ๋ด๊ณ ๋์ด๋ฆฌ๊ธฐ'๋ค. ๋ฐฑ์ ์ด ์ค์ ๋ก ๋ณต๊ตฌ๋๋์ง๋ฅผ ์ ๊ธฐ์ ์ผ๋ก ๊ฒ์ฆํ๋ ๋ชจ์ ์คํฌ๋ฆฝํธ.
# PoC 4: ๋ฐฑ์
๋ณต๊ตฌ ๋ฆฌํ์ค โ '๋ณต์ํด ๋ด์ผ ๋ฐฑ์
์ด๋ค'
import hashlib, os, shutil
def sha(p):
return hashlib.sha256(open(p, "rb").read()).hexdigest()
def drill(live_dir="/tmp/lab", backup_dir="/tmp/lab_backup"):
# 1) ์๋ณธ ์ค๋
์ท
originals = {f: sha(os.path.join(live_dir, f)) for f in os.listdir(live_dir)}
# 2) ์ฌํด ์๋๋ฆฌ์ค: ์๋ณธ์ ์ง์ ๋ค๊ณ ๊ฐ์ ํ๊ณ ๋ฐฑ์
์์ ๋ณต์
for f in originals:
shutil.copy(os.path.join(backup_dir, f), os.path.join(live_dir, f))
# 3) ๋ฌด๊ฒฐ์ฑ ๋์กฐ โ ํด์๊ฐ ๋ชจ๋ ์ผ์นํด์ผ '๋ณต๊ตฌ ๊ฐ๋ฅ' ์ํ
ok = all(sha(os.path.join(live_dir, f)) == h for f, h in originals.items())
print("[๋ฆฌํ์ค]", "๋ณต๊ตฌ ๊ฐ๋ฅ โ" if ok else "๋ณต๊ตฌ ์คํจ โ โ ๋ฐฑ์
์ ์ ๋ขฐํ์ง ๋ง ๊ฒ")
return ok
# ์ค์ต ์ค๋น:
# mkdir -p /tmp/lab /tmp/lab_backup
# echo demo > /tmp/lab/a.txt && cp /tmp/lab/a.txt /tmp/lab_backup/
if __name__ == "__main__":
drill()
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ โ '๋ณต๊ตฌ๋ ฅ'๊ณผ '์ ํต๋ง ์ฐจ๋จ' ๋ ์ถ
- ๋ฐฑ์ ์ '์คํ๋ผ์ธยท๋ถ๋ณ'์ผ๋ก, ๊ทธ๋ฆฌ๊ณ ๊ฒ์ฆํ๋ผ: ์ฐ๊ฒฐํ ๋ฐฑ์ ์ ๋์ฌ์จ์ด๊ฐ ํจ๊ป ์ํธํํ๋ค. 3-2-1 ๊ท์น(์ฌ๋ณธ 3, ๋งค์ฒด 2, ์คํ์ฌ์ดํธ 1) + ๋ถ๋ณ ์ ์ฅ(immutable/WORM)์ด ํต์ฌ์ด๋ค. PoC 4์ฒ๋ผ ์ ๊ธฐ ๋ณต๊ตฌ ๋ฆฌํ์ค ์์ด๋ '๋ฐฑ์ ์ด ์๋ค'๋ ์ฐฉ๊ฐ์ผ ๋ฟ์ด๋ค.
- ์ด์ค ํ์ฅ์ยท๋งคํฌ๋ก ์คํ ์ฐจ๋จ:
invoice.pdf.exe๊ฐ์ ์ด์ค ํ์ฅ์๋ฅผ ์จ๊ธฐ์ง ์๋๋ก '์๋ ค์ง ํ์ผ ํ์์ ํ์ฅ์ ํ์'๋ฅผ ์ผ๊ณ , ๋ฉ์ผ ๊ฒ์ดํธ์จ์ด์์ ์คํํ์ผยท๋งคํฌ๋ก๋ฅผ ๊ธฐ๋ณธ ์ฐจ๋จํ๋ค(PoC 1์ ์ ์ ๊ฒฝ๋ก ์ฐจ๋จ). - ์ต์ ๊ถํยท๋คํธ์ํฌ ๋ถํ : CryptoLocker๋ ์ ๊ทผ ๊ฐ๋ฅํ ๊ณต์ ํด๋๊น์ง ์ ๊ฐ๋ค. ๊ณต์ ๊ถํ์ ์ต์ํํ๊ณ ์ธ๊ทธ๋ฉํ ์ด์ ํ๋ฉด ํผํด ๋ฐ๊ฒฝ์ด ๊ธ๊ฐํ๋ค.
- ํ์ ๊ธฐ๋ฐ ํ์ง(์ํธํ ํจํด): ์งง์ ์๊ฐ์ ๋๋ ํ์ผ์ด ๋ฐ๋๊ณ ์ํธ๋กํผ๊ฐ ๊ธ๋ฑํ๋ ํจํด, ๊ทธ๋ฆฌ๊ณ ๊ฐ ํด๋์ ๊ฐ์ ์๋ด ํ์ผ์ด ์๊ธฐ๋ ํจํด์ EDR์์ ๊ฐ๋ ฅํ ์๊ทธ๋์ฒ๋ค. ํ๋ก์ธ์ค ์ด๋ฆ์ด ์๋๋ผ ํ์๋ฅผ ๋ณธ๋ค.
- ์นจํฌยท์ ํต ์ฐจ๋จ(์๋ฐฉ๋ ฅ): CryptoLocker๋ ๊ฒฐ๊ตญ Gameover ZeuS ๋ด๋ท์ ํตํด ์๋ค. ์คํธ ํํฐ, ์ทจ์ฝํ ์๋ํฌ์ธํธ ๊ด๋ฆฌ, C2 ๋๋ฉ์ธ( DGA ) ์ฐจ๋จ์ '์ํธ๋ฅผ ๋ชป ๊นจ๋ ์ด๊ธฐ๋' ๊ฒฝ๋ก๋ค.
- ๊ตํ: ๊ฐํ ์ํธ๋ ์๋ ์ ์นผ์ด๋ค. ๋ฐฉ์ด์๋ ์ ์ฒด ๋์คํฌ ์ํธํยท์ ์์๋ช ยท๋ณด์ ๋ฐฑ์ ์ ๊ฐ์ ์ํธ๋ฅผ ์ฐ๋ ๋งํผ, 'ํค ๊ด๋ฆฌ'์ '๋ณต๊ตฌ๋ ฅ'์ด ๊ณง ๋ณด์์ ์ค์ฌ์ด๋ผ๋ ๊ฒ์ CryptoLocker๊ฐ ์ฒ์์ผ๋ก ๋ผ์ ๋ฆฌ๊ฒ ๋ณด์ฌ์คฌ๋ค.
7. ์ถ์ฒ
- Dell SecureWorks โ CryptoLocker Ransomware (๊ฐ์ผ ๋์ยท์์ต ์ถ์ , ํค ๊ด๋ฆฌ ๊ตฌ์กฐ ๋ถ์) โ secureworks.com
- FireEye โ Your Money or Your Files: A look inside CryptoLocker โ fireeye.com
- Brad Duncan (SANS ISC) โ CryptoLocker ransomware ๋ถ์ ๋ ธํธ (๊ฐ์ผ ํ๋ฆยท๋๋ฉ์ธ) โ isc.sans.edu
- U.S. DOJ / FBI โ U.S. Leads Multi-National Action Against 'Gameover Zeus' Botnet and 'Cryptolocker' Ransomware (2014-06-02, Operation Tovar) โ justice.gov
- Wikipedia โ CryptoLocker (ํ์๋ผ์ธยท๋ฐฐํฌยท์์ตยทOperation Tovar ๊ฐ์) โ en.wikipedia.org/wiki/CryptoLocker
- Europol โ Operation Tovar: international takedown of the Gameover ZeuS botnet โ europol.europa.eu
โป ๋ณธ๋ฌธ์ PoC ์ฝ๋๋ ๊ตฌ์กฐ ์ดํด ๋ชฉ์ ์ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋์ด๋ฉฐ, ์ค์ ์ ํฌ์ฉ ๋๋กํผยท์ค์ C2ยท์ค์ ๋ชธ๊ฐ ์ฒญ๊ตฌยท์ค์ ํค ํ๊ธฐ ์ ์ฐจ๋ ํฌํจํ์ง ์์ต๋๋ค. ๋ชจ๋ ์ค์ต์ ์ธํฐ๋ท๊ณผ ๋ถ๋ฆฌ๋ ๊ฒฉ๋ฆฌ ๋ฉ(/tmp/lab)์ ์ ์ ๋ก ํ๋ฉฐ, ์ค์ ์์คํ ยทํ์ธ ์์ฐ์ ๋ํ ์คํยท๊ฐ์ทจ๋ ๋ถ๋ฒ์ ๋๋ค.
ํจ๊ป ์ฝ๊ธฐ: ๐ WannaCry (2017) โ CryptoLocker๊ฐ ์ฐ ๋์ฌ์จ์ด ์๋๋ฅผ '์'์ผ๋ก ์ฆํญ์ํจ ์ฌ๊ฑด ยท โ ๏ธ NotPetya (2017) โ ๊ณผ๊ธ์ ํฌ๊ธฐํ๊ณ ํ๊ดด๋ฅผ ํํ ์์ดํผ ยท ๐ฆ Zeus / Zbot (2007โ2014) โ CryptoLocker์ ์ ํต๋ง์ด์๋ ๋ฑ ํน ํธ๋ก์ด๋ชฉ๋ง ยท ๐ Morris Worm (1988) โ ์ต์ด์ ์๊ธฐ๋ณต์ ์์์ ์์๋ ์ ์ฑ์ฝ๋ ๊ณ๋ณด