1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ ์ธ์ , ๋๊ฐ, ์ ์ ๋ช ํ๊ฐ
SUNBURST(์ ๋ฒ์คํธ, ๋ณ์นญ Solorigate)๋ 2020๋ 12์์ ๋๋ฌ๋, IT ๊ด๋ฆฌ ์ํํธ์จ์ด SolarWinds Orion ํ๋ซํผ์ ๊ณต์ ์ ๋ฐ์ดํธ ์์ฒด์ ์ ์ฑ ์ฝ๋๊ฐ ์ฌ๊ฒจ ๋ฐฐํฌ๋ ์ํํธ์จ์ด ๊ณต๊ธ๋ง(Supply Chain) ๊ณต๊ฒฉ์ด๋ค. '์ทจ์ฝ์ ์ ์ฐ๋ฅธ' ๊ฒ์ด ์๋๋ผ '์ ํยท์ ์ ์๋ช ๋ ์ ๋ฐ์ดํธ'๊ฐ ๊ณง ๊ณต๊ฒฉ ๋ฒกํฐ์๋ค๋ ์ ์์ ์ด์ ์ธ๋ ์ ์ฑ์ฝ๋์ ์ฐจ์์ด ๋ค๋ฅด๋ค.
- ์ฌ๊ฑด๋ช : SolarWinds Orion ๊ณต๊ธ๋ง ์นจํด / SUNBURST ๋ฐฑ๋์ด (๋ณ์นญ Solorigate, UNC2452)
- ์๊ธฐ: ์ ์ฑ ๋น๋ ์ฃผ์ ์ฝ 2020๋ 3์ โ 2020๋ 12์ 8์ผ FireEye ์นจํด ๊ณต๊ฐ โ 12์ 13์ผ SolarWindsยทCISA ๊ณต์ ํ์ธ
- ๊ณต๊ฒฉ์: APT29(aka Cozy Bear / Nobelium). 2021๋ 4์ ๋ฏธ๊ตญ ์ ๋ถ(NSAยทCISAยทFBIยทODNI ๊ณต๋)๊ฐ ๋ฌ์์ SVR(๋์ธ์ ๋ณด๊ตญ) ์ํ์ผ๋ก ๊ณต์ ๊ท์
- ํต์ฌ: ์ ํ ์ฝ๋์๋ช
์ธ์ฆ์๋ก ์๋ช
๋
SolarWinds.Orion.Core.BusinessLayer.dll๋ฐฑ๋์ด - ๊ท๋ชจ: ์ ์ฑ ์ ๋ฐ์ดํธ๋ฅผ ๋ด๋ ค๋ฐ์ ์กฐ์ง ์ฝ 18,000๊ณณ, ์ค์ ํ์ ์นจํด๋ก ์ด์ด์ง ๊ณณ์ ์ฝ 100๊ณณ ์ด๋ด(๋ฏธ ์ ๋ถ ์กฐ์ฌ ๊ธฐ์ค)
์ ์ ๋ช ํ๊ฐ๋ ํ ๋ฌธ์ฅ์ผ๋ก ์์ฝ๋๋ค. "๋ฐฑ์ ๋, ๋ฐฉํ๋ฒฝ๋, ์๋ช ๊ฒ์ฆ๋ ๋ชจ๋ ํต๊ณผํ๋ ์ ๋ฐ์ดํธ๋ฅผ ํตํด, ๋ฏธ ์ฌ๋ฌด๋ถยท์๋ฌด๋ถยท๊ตญํ ์๋ณด๋ถยท๋ฒ๋ฌด๋ถ ๋ฑ ์ฐ๋ฐฉ๊ธฐ๊ด๊ณผ FireEyeยทMicrosoft ๊ฐ์ ๋ณด์ยทIT ๋๊ธฐ์ ์ด ๋์์ ๋ซ๋ ธ๋ค."
- ํจ๋ฌ๋ค์ ์ ํ: ๋ณด์ ์ ๊ณ๊ฐ ์์ญ ๋ ๊ฐ '์ ๋ขฐ์ ๋ฟ๋ฆฌ'๋ก ์ผ์์จ ์ ํ ์๋ช ์ํํธ์จ์ด๊ฐ ๊ณง ์นจํฌ ๊ฒฝ๋ก๊ฐ ๋ ์ ์์์ ์ค์ฆํ๋ค. ๊ทธ๋์ ์ด ์ฌ๊ฑด์ '๊ณต๊ธ๋ง ๊ณต๊ฒฉ์ ์ํ'์ผ๋ก ๋ถ๋ฆฐ๋ค.
- ํ์ง ๋์ด๋์ ์ ์ : ๋ฐฑ๋์ด๋ ์ ์ฑ ํ์๋ฅผ ํ๊ธฐ ์ 12~14์ผ๊ฐ ์ ๋ณตํ๊ณ , ์๋๋ฐ์คยท๋ถ์ ๋๊ตฌ๋ฅผ ์ค์ค๋ก ํ์งํด ํํผํ๋ค. ์ ์ ์๊ทธ๋์ฒ๋ง์ผ๋ก๋ ์ฌ์ค์ ์กํ์ง ์์๋ค.
- ์ฐ์ ํ๊ธ: 2021๋ ๋ฏธ๊ตญ ๋ฐ์ด๋ ํ์ ๋ช ๋ น(EO 14028)๊ณผ SBOM(์ํํธ์จ์ด ์์ฌ๋ช ์ธ์) ์๋ฌดํ ๋ ผ์์ ์ง์ ์ ๊ณ๊ธฐ๊ฐ ๋๋ค. "๋น์ ์ด ์ฐ๋ ์ํํธ์จ์ด์ ๋ถํ ๋ชฉ๋ก์ ์๋๊ฐ"๋ผ๋ ์ง๋ฌธ์ด ์ฐ์ ํ์ค์ด ๋ ๋ถ๊ธฐ์ ์ด๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ์ด๋ป๊ฒ ํผ์ก๋
์ด ๊ณต๊ฒฉ์๋ '์๊ธฐ๋ณต์ '๋ '์ทจ์ฝ์ ์ค์บ'๋ ์๋ค. ๋์ ๋จ ํ๋์ ์ ๋ขฐ ์ฑ๋(์ ํ ์ ๋ฐ์ดํธ ์๋ฒ)์ ํ๊ณ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ์กฐ์ฉํ ๋ฐฐ๋ฌ๋๋ค. ๊ทธ๋์ ์์ด ์๋๋ผ ๊ณต๊ธ๋ง ๋ฐฑ๋์ด๋ก ๋ถ๋ฅ๋๋ค.
- 1๋จ๊ณ ยท ๋น๋ ํ๊ฒฝ ์ฅ์
: ๊ณต๊ฒฉ์๋ SolarWinds์ ๋น๋(CI) ์๋ฒ์ ๋จผ์ ์นจํฌํด
SUNSPOT์ด๋ผ๋ ์ ์ฉ ์ํ๋ํธ๋ฅผ ์ฌ์๋ค. SUNSPOT์ ๋น๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํ๋ค๊ฐ 'Orion' ๊ด๋ จ ์ปดํ์ผ์ด ์์๋๋ ๋ฐ๋ก ๊ทธ ์๊ฐ ์์ค ํ์ผ์ ๋ฐฑ๋์ด๊ฐ ๋ ๋ฒ์ ์ผ๋ก ์๊ฐ ๊ต์ฒดํ๊ณ , ์ปดํ์ผ์ด ๋๋๋ฉด ์ฆ์ ์๋ณธ์ผ๋ก ๋๋๋ ธ๋ค. - 2๋จ๊ณ ยท ์ ํ์ผ๋ก ์๋ช
๋ ๋ฐฑ๋์ด ํ์ฌ: ๊ฒฐ๊ณผ๋ฌผ์ธ
BusinessLayer.dll์ SolarWinds์ ์ ํ ์ฝ๋์๋ช ์ธ์ฆ์๋ก ์ ์ ์๋ช ๋์ด ๋์๋ค. ์์ค ์ ์ฅ์์๋ ํ์ ์ด ๋จ์ง ์์๊ณ , ์ฐ์ถ๋ฌผ๋ง ์ค์ผ๋๋ค(์๋ PoC A๊ฐ ์ด ์๋ฆฌ ์ฌํ). - 3๋จ๊ณ ยท ์ ํ ์ ๋ฐ์ดํธ๋ก ๋๋ ๋ฐฐํฌ: 2020๋ 3์~6์ ์ฌ์ด ๋ฐฐํฌ๋ Orion ์ ๋ฐ์ดํธ (์: 2019.4 HF5)๋ฅผ ์ฝ 18,000๊ฐ ์กฐ์ง์ด ์ ์ ์ ๋ฐ์ดํธ๋ก ๋ด๋ ค๋ฐ์ ์ค์นํ๋ค. ๊ณต๊ฒฉ์๋ ๊ทธ์ค '๊ฐ์น ์๋' ํ์ ์ด ํ์ธ๋ ๋๋ง ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ๋ค.
- 4๋จ๊ณ ยท ์ ๋ณ ํ ์นจ๋ฌต: ๋ฐฑ๋์ด๋ ๊ธฐ๋ณธ 12~14์ผ๊ฐ ์๋ฌด ๋์๋ ํ์ง ์์๋ค. ์ค์ ํธ๋ํฝ ๋ถ์ ๋๊ตฌยท์๋๋ฐ์ค ํ๊ฒฝ์ ํ์งํ๋ฉด ์ค์ค๋ก ์ ๋ค์๊ณ , ์ด์๋จ์ ์์์์๋ง avsvmcloud[.]com ๊ณ์ด ๋๋ฉ์ธ์ผ๋ก DNS/HTTPS ๋น์ปจ์ ๋ณด๋๋ค.
- 5๋จ๊ณ ยท 2์ฐจ ์ํ๋ํธ ํฌํ: C2๊ฐ ๋ช ๋ น์ ๋ด๋ฆฌ๋ฉด ๋ฉ๋ชจ๋ฆฌ ์ ์ฉ ๋ก๋ TEARDROP / Raindrop๊ฐ ํฌ์ ๋์ด Cobalt Strike๋ฅผ ์คํ, ์ธก๋ฉด ์ด๋ยท์๊ฒฉ์ฆ๋ช ํ์ทจ๋ก ์ด์ด์ก๋ค. ์ดํ ํด๋ผ์ฐ๋์์๋ Golden SAML๋ก ์ฐ๋ฐฉ ํ ๋ํธ๊น์ง ๋์ด๊ฐ๋ค(6์ ์ฐธ์กฐ).
3. ๋์ ์๋ฆฌ ์์ธ ๋ถ์ โ ์ฝ๋/๊ตฌ์กฐ ๋ ๋ฒจ
3-1. ์ '์ ์ ์ฝ๋'์ฒ๋ผ ๋ณด์ด๋๊ฐ
- ์ ํ DLL ์์ฅ: ๋ฐฑ๋์ด๋ ๋ณ๋ ์คํ ํ์ผ์ด ์๋๋ผ Orion์ ์ ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
SolarWinds.Orion.Core.BusinessLayer.dll์ ํด๋์คยท๋ฉ์๋๋ก ํฉ์ณ์ ธ ์์๋ค. ์ ์ ๊ธฐ๋ฅ๊ณผ ๋์ผํ ์๋ช ยท๋ฒ์ ์ ๋ณด๋ฅผ ๊ฐ์ก๊ธฐ์ ํ์ผ ํํ ๊ฒ์ฌยทํ์ดํธ๋ฆฌ์คํธ๋ฅผ ํต๊ณผํ๋ค. - ์ ์ฉ ์ค๋ ๋ยท์๋ ์ค์ผ์ค: ์ ์ฑ ๋ก์ง์ ๋ณ๋ ์ค๋ ๋์์ ์คํ๋๋ฉฐ, ๋ฆฌ์์ค์ ๋๋ ํ๋(์ธ์ฝ๋ฉ๋) ๋ช ๋ น์ ์ ์ฅํ๋ค. ๋ฌธ์์ด ๋๋ถ๋ถ์ด Base64/์ปค์คํ ์ธ์ฝ๋ฉ์ผ๋ก ์จ๊ฒจ์ ธ ์ ์ ๋ถ์์์ ์๋ฏธ ์๋ IOC๊ฐ ์ ๋๋ฌ๋์ง ์์๋ค.
3-2. C2 ํต์ โ DNS ์๋ธ๋๋ฉ์ธ์ ๋ฐ์ดํฐ๋ฅผ ์ค์ด ๋ณด๋ธ๋ค
- ๋๋ฉ์ธ ์ฒด๊ณ: ๊ณต๊ฒฉ์๋
avsvmcloud[.]com์ ๋ฑ๋กํ๊ณ<์ธ์ฝ๋ฉ๋ ์๋ณ์>.appsync-api.<๋ฆฌ์ >.avsvmcloud[.]comํํ์ ์๋ธ๋๋ฉ์ธ์ ๋ง๋ค์๋ค. ํผํด ์กฐ์งยท๋๋ฉ์ธยท์ฌ์ฉ์ ๋ฑ ์ ๋ณด๊ฐ ์๋ธ๋๋ฉ์ธ ๋ฌธ์์ด์ ์ธ์ฝ๋ฉ๋์ด DNS ์ง์๋ง์ผ๋ก๋ ์ ์ถ๋ ์ ์์๋ค. - HTTP ์์ฅ: ์ค์ ํต์ ์ ์ ์ ํธ๋ํฝ์ฒ๋ผ ๋ณด์ด๋๋ก HTTP๋ก ์์ฅํ๊ณ , ๋ ์ง ํค๋ ์กฐ์ยทํ๋ก์ ์๋ ํ์ ๋ฑ ์ฌ๋ด๋ง ํ๊ฒฝ์ ๋ง์ถฐ ์กฐ์ฉํ ์ค๋ฉฐ๋ค์๋ค.
- ํ๊ฒฝ ์ธ์ง(Environment Awareness): ์คํ ์งํ AV/EDRยท์๋๋ฐ์ค ํ์ ์ ์ ๊ฒํ๊ณ , ํน์ ๋ณด์ ์ ํ์ด ๊ฐ์ง๋๋ฉด ์๋ฌด ๊ฒ๋ ํ์ง ์๊ณ ์ข ๋ฃํ๋ค. ๋ํ ๊ฐ์ผ ํธ์คํธ๊ฐ '์ ํํ ๊ฐ์น'๊ฐ ์๋์ง ๋ด๋ถ์ ์ผ๋ก ํ๋ณํ๋ ๋ก์ง์ ๊ฐ์ก๋ค(๋ฌด์ฐจ๋ณ ํ์ฐ์ ํผํ ์ด์ ).
3-3. Golden SAML โ ํด๋ผ์ฐ๋๋ก ๋์ด๊ฐ๋ ๋ง์ง๋ง ๊ณ ๋ฆฌ
- ์จํ๋ ๋ฏธ์ค AD FS(Active Directory Federation Services)์ ํ ํฐ ์๋ช ์ธ์ฆ์๋ฅผ ํ์ทจํ๋ฉด, ๊ณต๊ฒฉ์๋ ์์์ ์ฌ์ฉ์ยท์์์ ๊ถํ์ผ๋ก ์์กฐ๋ SAML ํ ํฐ์ ์ค์ค๋ก ๋ง๋ค ์ ์๋ค. ์ด๋ฅธ๋ฐ Golden SAML์ด๋ค.
- ํต์ฌ์ '๋น๋ฐ๋ฒํธ ์์ด' 'MFA๋ฅผ ์ฐํํ๋ฉฐ' ํด๋ผ์ฐ๋(Microsoft 365ยทAzure AD)์ ์ ์ ์ฌ์ฉ์๋ก ๋ก๊ทธ์ธํ ์ ์๋ค๋ ์ . ๋ฏธ ์ฌ๋ฌด๋ถยท์๋ฌด๋ถ ํ ๋ํธ ์ ๊ทผ์ ์ด ๊ธฐ๋ฒ์ด ๋์๋ ๊ฒ์ผ๋ก ๋ถ์๋๋ค. ๊ณต๊ธ๋ง ๋ฐฑ๋์ด(์จํ๋ ๋ฏธ์ค)์ ํด๋ผ์ฐ๋ ์ฅ์ ์ด ํ๋์ ์ฌ์ฌ๋ก ์ฐ๊ฒฐ๋ ์ง์ ์ด๋ค.
| ๊ตฌ์ฑ ์์ | ์ญํ |
|---|---|
| SUNSPOT | ๋น๋ ์๋ฒ์ ์์ฃผํ๋ฉฐ ์ปดํ์ผ ์๊ฐ ์์ค ํ์ผ์ ๋ฐฑ๋์ด ๋ฒ์ ์ผ๋ก ์๊ฐ ๊ต์ฒดยท์๋ณต |
| SUNBURST (Solorigate) | ์๋ช ๋ Orion DLL์ ํฉ์ณ์ง 1์ฐจ ๋ฐฑ๋์ด. ์ ๋ณตยทํ๊ฒฝ ์ธ์งยทC2 ๋น์ปจ |
| TEARDROP / Raindrop | ๋ฉ๋ชจ๋ฆฌ ์์ฃผํ ๋ก๋. Cobalt Strike ๋ฑ 2์ฐจ ํ์ด๋ก๋ ํฌํ |
| GoldMax / Sibot | ์ง์์ฑยท์ถ๊ฐ ํต์ ์ฉ ๋ณด์กฐ ์ํ๋ํธ |
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ค์ ์ฌ๋ก ์์น
- ๋ฐฐํฌ ๊ท๋ชจ: ์ ์ฑ Orion ์ ๋ฐ์ดํธ ์ค์น ์กฐ์ง ์ฝ 18,000๊ณณ. "์ ์ธ๊ณ 3๋ง ๊ณณ ์ด์์ด ์ฌ์ฉ" ์ค ์๋น์๊ฐ ์ํฅ๊ถ์ ๋ค์ด๊ฐ ๊ฒ์ผ๋ก ์ง๊ณ๋๋ค.
- ์ค์ ์นจํด: ํ์ ์กฐ์ฌ์์ ํ์ ํ ์นจํด๊ฐ ํ์ธ๋ ๊ณณ์ ์ฝ 100๊ณณ ๋ฏธ๋ง. ์ฆ '18,000๊ณณ'์ ๋ ธ์ถ, '100๊ณณ'์ ์ค์ง ํผํด๋ก ๊ตฌ๋ถํด ๋ด์ผ ์ ํํ๋ค.
- ๋ฏธ ์ฐ๋ฐฉ๊ธฐ๊ด: ์ฌ๋ฌด๋ถ(OFAC ํฌํจ), ์๋ฌด๋ถ(NTIA), ๊ตญํ ์๋ณด๋ถ, ๋ฒ๋ฌด๋ถ(์ด๋ฉ์ผ ์์คํ ), ๊ตญ๋ฌด๋ถยท์๋์ง๋ถ(NNSA), NIH ๋ฑ ๋ค์. ์ผ๋ถ ๊ธฐ๊ด ์นจํด๋ 2021๋ ์๋ฐ๊ธฐ๊น์ง ์ด์ด์ก๋ค.
- ๋ณด์ยทIT ๊ธฐ์ : FireEye(๋ ๋ํ ์นจํฌ ๋๊ตฌ ์ ์ถ โ ์ด ์นจํด๊ฐ ์คํ๋ ค SUNBURST ๋ฐ๊ฒฌ์ ์ค๋ง๋ฆฌ), Microsoft(์์ค ์ฝ๋ ์ผ๋ถ ์ด๋ ์ ํฉ), CiscoยทIntelยทNVIDIA ๋ฑ๋ ์ ์ฑ ์ ๋ฐ์ดํธ๋ฅผ ๋ด๋ ค๋ฐ์ ๋ชฉ๋ก์ ํฌํจ๋๋ค.
- ๋น์ฉยท์ ์ฑ ์ํฅ: ์ ์ฌ ํผํด ์ถ์ ์น๋ ์์ฒ์ต ๋ฌ๋ฌ ๊ท๋ชจ๋ก ๋ ผ์๋๊ณ , CISA ๊ธด๊ธ ์ง์(ED 21-01 / 21-02), ์ฐ๋ฐฉ ์ฐจ์์ ์ ์ ์กฐ์ฌ, ๊ทธ๋ฆฌ๊ณ SBOMยทํ์ ๋ช ๋ น 14028(2021)๋ก ์ด์ด์ก๋ค.
- ๋์ ํ์๋ผ์ธ:
- 2020-12-08 FireEye, ์์ฌ ๋ ๋ํ ๋๊ตฌ ํ์ทจยท๊ตญ๊ฐ๊ธ ๊ณต๊ฒฉ์ ์นจํด ๊ณต๊ฐ
- 2020-12-13 SolarWindsยทCISA, Orion ์ ๋ฐ์ดํธ ๋ฐฑ๋์ด ๊ณต์ ํ์ธ โ ED 21-01 ๋ฐ๋ น
- 2020-12-17~ Microsoft, "18,000์ฌ ๊ณ ๊ฐ ๋ค์ด๋ก๋, ์ค์ ์นจํด๋ ๊ทน์์" ๋ฐํ
- 2021-01~03 ์ฐ๋ฐฉ๊ธฐ๊ด ์นจํด ์ถ๊ฐ ํ์ธ, ์ํ ํ์์ ์ฝ๋๋ช UNC2452 โ Nobelium / APT29๋ก ์ ๋ฆฌ
- 2021-04-15 ๋ฏธ ์ ๋ถ, SVR(๋ฌ์์ ๋์ธ์ ๋ณด๊ตญ) ์ํ ๊ณต์ ๊ท์ + ์ ์ฌ
5. PoC (๊ฐ๋ ์ฆ๋ช ) โ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋
avsvmcloud.comยทSolarWinds ์ ํยท์ค์ ๋น๋ ์๋ฒยท์ค์ AD FS๋ ์ผ์ ์ฌ์ฉํ์ง ์์ผ๋ฉฐ,
๋ชจ๋ ๋์์ ๋ก์ปฌ ์ค์ต ๋๋ ํฐ๋ฆฌ/๊ฐ์ ํธ์คํธ๋ค. ๋ชฉ์ ์ '์ ์ด ๊ณต๊ฒฉ์ด ์ ์ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋๊ฐ'๋ผ๋
๋์ ์๋ฆฌ ์ฌํ์ ํ์ ๋๋ค. ์ค์ ํ์ด๋ก๋ ๋ณต์ฌยท๋ฐฐํฌยท๋ฌด๊ธฐํ๋ ๊ธ์ง๋๋ค.
PoC A โ ๋น๋์์ ์ฃผ์ (SUNSPOT ์๋ฆฌ) ์ฌํ: "์์ค๋ ๊นจ๋ํ๋ฐ ์ฐ์ถ๋ฌผ๋ง ์ค์ผ"
๋น๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํ๋ค ์ปดํ์ผ ์๊ฐ์๋ง ์์ค๋ฅผ ๋ฐ๊ฟ์น๊ธฐํ๊ณ , ๋๋๋ฉด ์๋ณตํ๋ ํ๋ฆ์ ๋ก์ปฌ์์ ๋ชจ์ฌํ๋ค. ํ์ง์ ์ด์ ๋ "์ฐ์ถ๋ฌผ(=DLL)๊ณผ ์์ค๋ก๋ถํฐ์ ์ฌํ ๋น๋ ๊ฒฐ๊ณผ๋ฅผ ๋์กฐ"ํ๋ ๊ฒ์ด๋ค.
# poc_a_build_inject.py โ ๊ต์ก์ฉ ๋ชจ์ (์ค์ ์
์ฑ์ฝ๋ ์๋ / ๋ก์ปฌ ์ค์ต ๋๋ ํฐ๋ฆฌ ์ ์ฉ)
import os, hashlib
os.makedirs("lab/src", exist_ok=True); os.makedirs("lab/out", exist_ok=True)
SRC, OUT = "lab/src/BusinessLayer.cs", "lab/out/BusinessLayer.dll"
# 1) ๊นจ๋ํ "์ ํ" ์์ค
CLEAN = "class BusinessLayer { void Handle() { Log(); } }\n"
open(SRC, "w").write(CLEAN)
def compile_it(): # ์ค์ ๋ก๋ csc.exe ์ปดํ์ผ ์๋ฆฌ
open(OUT, "w").write("BINARY:" + open(SRC).read())
def h(p): # ์งง์ ์ง๋ฌธ(๊ต์ก์ฉ)
return hashlib.sha256(open(p, "rb").read()).hexdigest()[:16]
compile_it()
benign_hash = h(OUT)
print("[0] ์ ํ ๋น๋ ์ฐ์ถ๋ฌผ ํด์ :", benign_hash)
# 2) SUNSPOT ํ๋ด: '์ปดํ์ผ์ด ์์๋๋ ์๊ฐ'๋ง ๋ฐฑ๋์ด ๋ฒ์ ์ผ๋ก ์ผ์ ๊ต์ฒด
BACKDOORED = CLEAN.replace("Log();", "Log(); Backdoor(); /* [EDU-MOCK] */")
open(SRC, "w").write(BACKDOORED) # <-- ์๊ฐ ๊ต์ฒด
compile_it() # ์ค์ผ๋ ์ฐ์ถ๋ฌผ ์์ฑ
open(SRC, "w").write(CLEAN) # <-- ์ฆ์ ์๋ณต โ ์์ค ์ ์ฅ์์ ํ์ ์์
print("[1] ๋น๋ ํ ์์ค ํด์ :", h(SRC), "(์๋ณธ๊ณผ ๋์ผ:", h(SRC) == h("lab/src/BusinessLayer.cs") and open(SRC).read() == CLEAN, ")")
print("[2] ์ค์ผ๋ ์ฐ์ถ๋ฌผ ํด์ :", h(OUT), "โ ์ ํ๊ณผ ๋ค๋ฆ:", h(OUT) != benign_hash)
# 3) ํ์ง: "์์ค์์ ์ฌํ ๋น๋ํ ๊ฒฐ๊ณผ"์ ์ค์ ๋ฐฐํฌ ์ฐ์ถ๋ฌผ์ ๋์กฐ
expected = hashlib.sha256(("BINARY:" + CLEAN).encode()).hexdigest()[:16]
print("[ํ์ง] ์ฌํ ๋น๋ ํด์ :", expected)
print("[ํ์ง] ์ผ์น ์ฌ๋ถ :", expected == h(OUT),
"โ False ๋ฉด '์์ค์ ๋ค๋ฅธ ์ฐ์ถ๋ฌผ' = ๊ณต๊ธ๋ง ์ค์ผ ์์ฌ!")
PoC B โ ์ ๋ณต ํ ๋น์ปจ(SUNBURST ์๋ฆฌ) ์ฌํ + ๋คํธ์ํฌ ํ์ง
12~14์ผ ์ ๋ณตยทํ๊ฒฝ ์ธ์งยท์๋ธ๋๋ฉ์ธ ์ธ์ฝ๋ฉ ๋น์ปจ์ ๊ฐ์ C2(avsvmcloud.example)๋ก ๋ชจ์ฌํ๊ณ ,
๋ง์ง๋ง์ "์๋ ค์ง C2 ๋๋ฉ์ธ ๋ฌธ์์ด ์์ ๋งค์นญ"์ด๋ผ๋ ๋คํธ์ํฌ ํ์ง๊ฐ ์ด๋ป๊ฒ ์ก๋์ง ๋ณด์ฌ์ค๋ค.
# poc_b_beacon_sim.py โ ๊ต์ก์ฉ ๋ชจ์ (๊ฐ์ C2 / ์ค์ ๋๋ฉ์ธ ์๋)
import base64, hashlib
FAKE_C2 = "avsvmcloud.example" # ์ค์ ๋๋ฉ์ธ ์๋ (example ์ต์์)
SLEEP_DAYS, DECOY_AV = 14, ["edr.example"] # ์ ๋ณต ๊ธฐ๊ฐ / ๊ฐ์ ๋ณด์์ ํ ํ์
def env_is_sandbox():
return any(a in "lab.local-proc-list" for a in DECOY_AV) # ๋ก์ปฌ ๋ชจ์ ํ๋ณ
def beacon_domain(org, host):
# ํผํด ์ ๋ณด๋ฅผ ์๋ธ๋๋ฉ์ธ์ ์ธ์ฝ๋ฉํด DNS ์ง์๋ง์ผ๋ก๋ ์ ์ถ๋๊ฒ (SUNBURST ๋ฐฉ์ ๋ชจ์ฌ)
blob = base64.b32encode(hashlib.sha256(f"{org}|{host}".encode()).digest())
return blob.decode().lower()[:20] + f".appsync-api.us-east-2.{FAKE_C2}"
def run():
if env_is_sandbox():
print("[ํํผ] ๋ถ์ ํ๊ฒฝ ๊ฐ์ง โ ์๋ฌด ๋์ ์์ด ์ข
๋ฃ"); return
for day in range(1, SLEEP_DAYS + 1):
if day < 13:
continue # 12~14์ผ๊ฐ '์นจ๋ฌต'
dom = beacon_domain("lab.local", "SRV-01")
print(f"[day {day}] ๋น์ปจ: GET https://{dom}/dns/query?<encoded-victim>")
print(" (HTTP ๋ ์ง ํค๋ ์คํธํ / ํ๋ก์ ์๋ ํ์ ํ๋ด)")
break
run()
# --- ๋คํธ์ํฌ ํ์ง (๋ฐฉ์ด ์ธก) ---
KNOWN_C2 = (FAKE_C2,)
def detect(doms):
return [d for d in doms if any(c in d for c in KNOWN_C2)]
sample = [beacon_domain("lab.local", "SRV-01")]
print("[ํ์ง] ์์ฌ ๋๋ฉ์ธ ๋งค์นญ:", detect(sample))
print(" โ ๋น์ปจ์ '๋๋ฉ์ธ ๋ฌธ์์ด + ์ฃผ๊ธฐ์ฑ'์ผ๋ก ์ก๋๋ค. 12์ผ ์นจ๋ฌต๋ DNS ๋ก๊ทธ๋ ๋จ๋๋ค.")
(์ฐธ๊ณ ) Golden SAML ๊ฐ๋ ์์ฝ โ ์ฝ๋๊ฐ ์๋๋ผ '์ ๋ขฐ ๊ตฌ์กฐ'์ ๋ฌธ์
Golden SAML์ ์ทจ์ฝ์ ์ด ์๋๋ผ ์ค๊ณ์ ์ ๋ขฐ์ ๋ฌธ์ ๋ค. AD FS์ ํ ํฐ ์๋ช ์ธ์ฆ์ ํค๋ฅผ ์ป์ผ๋ฉด ๊ณต๊ฒฉ์๋ ์์ ์ฌ์ฉ์ยท์์ ๊ถํ์ SAML ์ด์ค์ ์ ์ค์ค๋ก ์๋ช ํด ํด๋ผ์ฐ๋ IdP์ ์ ์ถํ ์ ์๋ค. MFAยท๋น๋ฐ๋ฒํธ ์์ด, ๋ก๊ทธ์๋ '์ ์ ๋ก๊ทธ์ธ'์ผ๋ก ๋จ๋๋ค. ๋ฐฉ์ด์ ํต์ฌ์ ์ธ์ฆ์ ํค ๋ณดํธ์ ๋น์ ์ ์ด์ค์ (์๋ช ์/์กฐ๊ฑด/์๊ฐ) ํ์ง์ด๋ฉฐ, ์ฝ๋ ์ฌํ์ด ์๋๋ผ ํค ๊ด๋ฆฌยท๋ชจ๋ํฐ๋ง ๋ฌธ์ ๋ก ๋ค๋ฃจ๋ ๊ฒ์ด ์ณ๋ค.
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ โ ์ด๋ป๊ฒ ๋ง์๊ณ , ๋ฌด์์ ๋ฐฐ์ฐ๋
- ๋น๋ ํ์ดํ๋ผ์ธ์ '์ต๊ณ ๋ฑ๊ธ ์์ฐ'์ผ๋ก ์ทจ๊ธํ๋ผ: SUNBURST์ ์ถ๋ฐ์ ์ ๋น๋ ์๋ฒ ์ฅ์ ์ด์๋ค. ๋น๋ ์๋ฒ๋ ์์ค๋ณด๋ค ๊ฐํ ์ ๊ทผํต์ ยท์ ์ฉ๋งยท2์ธ ์น์ธยท๋ชจ๋ ์ปค๋ฐ/์ปดํ์ผ ๋ก๊ทธ ๋ณด์กด์ด ํ์ํ๋ค. (PoC A์ ์ฌํ ๋น๋ ๋์กฐ๊ฐ ์ฐ์ถ๋ฌผ ๋ฌด๊ฒฐ์ฑ ๊ฒ์ฆ์ ์ต์์ ์ด๋ค.)
- '์๋ช ๋๋ค'๋ '์์ ํ๋ค'๊ฐ ์๋๋ค: ์ฝ๋์๋ช ์ ์ถ์ฒ(์ ์กฐ์ฌ)๋ฅผ ๋ณด์ฆํ ๋ฟ ๋ด์ฉ์ ์์ ์ ๋ณด์ฆํ์ง ์๋๋ค. ๊ณต๊ธ๋ง ๋๊ตฌ๋ ํํยท์๋ช ๊ณผ ๋ณ๊ฐ๋ก ํ์ ๊ธฐ๋ฐ(EDR)์ผ๋ก ๋ด์ผ ํ๋ค.
- ์ด์ ํ์ยท๋น์ปจ ํ์ง(๋คํธ์ํฌ): ์ฃผ๊ธฐ์ DNS ๋น์ปจ, ์ ๊ท/๋ฏธ๋ถ๋ฅ ๋๋ฉ์ธ, ์๋ธ๋๋ฉ์ธ ๊ธธ์ดยท์ํธ๋กํผ ์ด์์ ์์ ๋ชจ๋ํฐ๋งํ๋ค. 12~14์ผ ์นจ๋ฌต์ ํ์ง๋ฅผ ๋ฆ์ถ ๋ฟ ๋ก๊ทธ๋ฅผ ์ง์ฐ์ง ๋ชปํ๋ค(PoC B).
- ์ต์ ๊ถํยท์ธ๊ทธ๋ฉํ ์ด์ : ๊ด๋ฆฌ ๋๊ตฌ๊ฐ ๋๋ฉ์ธ ์ ์ฒด์ ๊ด๋ฆฌ์ ๊ถํ์ผ๋ก ๊น๋ฆฌ๋ ๊ดํ์ ์ฌ์์ ์ฆํญ๊ธฐ๋ค. ๊ณ์ธต์ ๊ด๋ฆฌ ๋ชจ๋ธ(Tiered Admin)ยท์๋น์ค ๊ณ์ ๊ฒฉ๋ฆฌ๋ก ๋จ์ผ ๋๊ตฌ ์ฅ์ ์ ํ๊ธ์ ์ค์ธ๋ค.
- ํด๋ผ์ฐ๋ ์ ๋ขฐ์ ์ฌ์ ๊ฒ(Golden SAML): ํ๋๋ ์ด์ ์๋ช ํค๋ฅผ HSM/์ ์ฉ ๋ณดํธ๋ก ๊ฒฉ๋ฆฌํ๊ณ , ๋น์ ์ SAML ์ด์ค์ ๊ณผ ์กฐ๊ฑด๋ถ ์ก์ธ์ค ์ฐํ๋ฅผ ํ์งํ๋ค. '์จํ๋ ๋ฏธ์ค ์์ = ํด๋ผ์ฐ๋ ์์ '์ด ์๋๋ค.
- SBOMยท๊ฐ์์ฑ: "๋ฌด์์, ์ด๋ค ๋ฒ์ ์ผ๋ก, ์ด๋์ ๋น๋ํ๋๊ฐ"๋ฅผ ์๋ ๊ฒ ์์ฒด๊ฐ ๋ฐฉ์ด๋ค. ์ด ์ฌ๊ฑด ์ดํ SBOM/ํ์ ๋ช ๋ น 14028์ด ํ์ค์ผ๋ก ์๋ฆฌ ์ก์๋ค.
- ๊ตํ ์์ฝ:
- ์ ๋ขฐ ์ฌ์ฌ ์ ์ฒด๊ฐ ๊ณต๊ฒฉ๋ฉด์ด๋ค: ์ฝ๋ ํ ์ค์ด ์๋๋ผ ๋น๋โ์๋ช โ๋ฐฐํฌโ์ด์ ์ ๊ตฌ๊ฐ์ด ํ์ ์ด๋ค.
- ์กฐ์ฉํจ์ด ๊ณง ์ํ ์ ํธ๋ค: ๋ฌด์ฐจ๋ณ ํ์ฐ ์๋ ํ์ ํยท์ ์์ ๊ณต๊ฒฉ์ด ๊ตญ๊ฐ๊ธ ์ํ์ ํน์ง์ด๋ค.
- ๊ณ๋ณด: ์(MorrisยทSlammerยทConficker) โ ๋์ฌ์จ์ด(WannaCryยทNotPetya) โ IoT(Mirai) โ ๊ณต๊ธ๋ง ๋ฐฑ๋์ด(SUNBURST, 2020). ํ์ฐ ๋ฐฉ์์ '๋ฌด์ฐจ๋ณ'์์ '์ ๋ฐยท์ ๋ขฐ ์ ์ฉ'์ผ๋ก ์งํํ๋ค.
์ถ์ฒ
- Wikipedia โ 2020 United States federal government data breach โ https://en.wikipedia.org/wiki/2020_United_States_federal_government_data_breach
- CISA โ Emergency Directive 21-01: Mitigate SolarWinds Orion Code Compromise (2020-12-13) โ https://www.cisa.gov/news-events/directives/ed-21-01-mitigate-solarwinds-orion-code-compromise
- Microsoft Security โ Analyzing Solorigate, the compromised DLL file (2020-12-18) โ Microsoft Security Blog โ Analyzing Solorigate
- FireEye/Mandiant โ Highly Evasive Attacker Leverages SolarWinds Supply Chain (SUNBURST) โ Mandiant โ SUNBURST Backdoor
- CISA โ Alert AA20-352A: Advanced Persistent Threat Compromise of Government Agencies (SUNBURST & TEARDROP) โ https://www.cisa.gov/news-events/cybersecurity-advisories/aa20-352a
- MITRE ATT&CK โ SUNBURST (S0559) / Supply Chain Compromise T1195.002 / Forge Web Credentials: SAML T1606.002 โ https://attack.mitre.org/software/S0559/
- NSA/CISA/FBI/ODNI โ Joint Statement attributing the SolarWinds compromise to the SVR (2021-04-15) โ https://www.cisa.gov/news-events/news/cisa-fbi-nsa-and-odni-release-joint-statement-solarwinds-compromise
ํจ๊ป ์ฝ๊ธฐ: ๐ชฑ Conficker (2008) โ ๋๊ท๋ชจ ๊ฐ์ผ๊ณผ ๊ตญ์ ๊ณต์กฐ ยท ๐ฆ Mirai (2016) โ ๊ธฐ๋ณธ ๋น๋ฐ๋ฒํธ๋ก IoT๋ฅผ ๋ฌด๊ธฐํ ยท โ ๏ธ NotPetya (2017) โ ๊ณต๊ธ๋ง(M.E.Doc)์์ ์์๋ ์์ดํผ