1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ ๋ฉ๋ชจ๋ฆฌ์ผ๋ฐ์ด ์ฃผ๋ง์ ์์๋ 'ํ๋ฐํ ๋๋ ์ ์ถ'
MOVEit Transfer๋ ๊ธฐ์ ยท์ ๋ถยท๊ธ์ต๊ธฐ๊ด์ด ๋์ฉ๋ ๋ฏผ๊ฐ ํ์ผ์ ์ฃผ๊ณ ๋ฐ๋ ๊ด๋ฆฌํ ํ์ผ์ ์ก(MFT, Managed File Transfer) ์ ํ์ด๋ค. 2002๋ Standard Networks๊ฐ ์ถ์ํ๊ณ 2008๋ Ipswitch๊ฐ ์ธ์, ์ง๊ธ์ Progress Software๊ฐ ์ ์ง๋ณด์ํ๋ค. ํน์ง์ ํ๋ คํจ์ด ์๋๋ผ ์์น๋ค โ ๊ธ์ฌ๋ช ์ธยท์๋ฃ๊ธฐ๋กยท์ธ๊ธ์๋ฃยทDMV ๋ฐ์ดํฐ์ฒ๋ผ "์กฐ์ง์ ๋ค์ด์จ ๋ฏผ๊ฐ ์ ๋ณด๊ฐ ๋ง์ง๋ง์ผ๋ก ๋ชจ์ฌ ๋๊ฐ๋ ์ง์ "์ ๋์ธ๋ค. ๊ทธ๋์ MFT ํ ๋๊ฐ ๋ซ๋ฆฌ๋ฉด ๊ทธ ๋ค์ ์ฐ๊ฒฐ๋ ์๋ฐฑ ๊ฐ ๊ณ ๊ฐ ์กฐ์ง์ด ํจ๊ป ๋ซ๋ฆฐ๋ค.
2023๋ 5์ 27์ผ, ๋ฏธ๊ตญ ๋ฉ๋ชจ๋ฆฌ์ผ๋ฐ์ด ์ฐํด์ ์ฒซ ์ฃผ๋ง์ ๋ฌ์์์ด๊ถ ๋ฒ์ฃ์กฐ์ง Cl0p(TA505 / FIN11)์ด MOVEit Transfer์ ๋ฌด์ ๋ก๋ฐ์ด SQL ์ธ์ ์ (CVE-2023-34362)์ ํ์ ํ์ด ์๋๋ผ ์ค์บํ์ผ๋ก ๋๋ ์ต์คํ๋ก์ํ๊ธฐ ์์ํ๋ค. 5์ 28์ผ ํ ๊ณ ๊ฐ์ด ์ด์ ์งํ๋ฅผ ์ ๊ณ ํด ์กฐ์ฌ๊ฐ ์์๋๊ณ , Progress๋ 5์ 31์ผ ํจ์น๋ฅผ ๋ฐฐํฌํ์ผ๋ฉฐ, CISA๋ 6์ 2์ผ ์ด ์ทจ์ฝ์ ์ KEV(์ค์ ์ ์ฉ๋ ์ทจ์ฝ์ ) ์นดํ๋ก๊ทธ์ ์ฌ๋ ธ๋ค. 6์ 7์ผ์๋ FBIยทCISA๊ฐ ๊ณต๋ ๊ถ๊ณ AA23-158A๋ฅผ ๋ฐํํ๋ฉฐ "์ด๋ฏธ ๋ค์ ์กฐ์ง์ด ์นจํด๋นํ๋ค"๊ณ ๊ฒฝ๊ณ ํ๋ค.
์ด ์ฌ๊ฑด์ด ๋ณด์์ฌ์ ๊ธฐ์ต์ ๋จ๋ ์ด์ ๋ ์ธ ๊ฐ์ง๋ค.
- ๊ฒฐํจ ํ๋ = ์ฐ์ ์ ์ฒด์ ์ ์ถ. ์ ํ 1๊ฐ์ SQL ์ธ์ ์ ์ด 2,700๊ฐ ์ด์ ์กฐ์ง ยท ์ฝ 9,300๋ง ๋ช ์ ๊ฐ์ธ์ ๋ณด ์ ์ถ๋ก ์ฆํญ๋๋ค. ๊ณต๊ฒฉ์๋ ์ฌ๋์ ๋์ง ์์๋ค. ์ธํฐ๋ท์ ๋ ธ์ถ๋ ์ ํ์ ์ ๋ถ ๋๋๋ ธ๋ค.
- '๋ฌด์ํธํ ๋์ฌ์จ์ด'์ ์ฃผ๋ฅํ. Cl0p๋ ์ด๋ฒ์๋ ํ์ผ์ ์ํธํํ์ง ์์๋ค. ๋ฐ์ดํฐ๋ง ํ์ณ์ "๋์ ์ฃผ๋ฉด ์ญ์ ํ๊ฒ ๋ค"๊ณ ํ๋ฐํ๋ค. ๋ฐฑ์ ยท๋ณต๊ตฌ ํ๋ จ์ผ๋ก๋ ๋ง์ ์ ์๋ ํํ์ ํ๋ฐ์ด ํ์ค์ด ๋ ๋ถ๊ธฐ์ ์ด๋ค.
- ์ฐ์ ํ์ ์ ์ ์ . Cl0p๋ Accellion FTA(2020~21) โ Fortra GoAnywhere MFT(2023 ์ด) โ MOVEit(2023)๋ก ๊ฐ์ ํจํด์ ๋ฐ๋ณตํ๋ค โ "์ธํฐ๋ท์ ๋ถ์ด ์๋ ํ์ผ์ ์ก ์ฅ๋น๋ฅผ, ํด์ผ์, ๋ฌด์ธ์ฆ์ผ๋ก."
- ์ฌ๊ฑด๋ช : MOVEit Transfer ๋๋ ์ต์คํ๋ก์ / Cl0p ๋ฐ์ดํฐ ๊ฐ์ทจ ์บ ํ์ธ (2023)
- ์ทจ์ฝ์ : CVE-2023-34362 โ MOVEit Transfer ๋ฌด์ธ์ฆ SQL ์ธ์ ์ (์น๋ช ์ , CVSS 9.8) ยท ํ์ CVE-2023-35036(6์ 9์ผ), CVE-2023-35708(6์ ์ค์) ์ฐ์ด์ด ์์
- ์
์ฑ์ฝ๋: ์น์
ธ LEMURLOOT (
human2.aspxโ ์ ์human.aspx์์ฅ, C# ASP.NET) - ๊ณต๊ฒฉ์: Cl0p / Clop โ TA505ยทFIN11๋ก ์ถ์ ๋๋ ๋ฌ์์์ด๊ถ ๋ฒ์ฃ์กฐ์ง, CISA/FBI ํ์ธ
- ๊ธฐ๊ฐ: ์ต์คํ๋ก์ ์์ 2023-05-27 (Mandiant ์ถ์ ) ยท ํจ์น 05-31 ยท KEV ๋ฑ์ฌ 06-02 ยท ๊ณต๋ ๊ถ๊ณ 06-07
- ํผํด: 2,500๊ฐ+ ์กฐ์ง(2023-10 Emsisoft ์ง๊ณ) โ ์ดํ 2,700๊ฐ+ ยท ์ฝ 9,300๋ง ๋ช (์ง๊ณ ๋์ ) ยท ๋ฏธ๊ตญ ์์ฌ ์กฐ์ง ๋น์ค 80% ์ด์
- ์์ต ์ถ์ : Cl0p๊ฐ MOVEit ์บ ํ์ธ์ผ๋ก 7,500๋ง~1์ต ๋ฌ๋ฌ (2023-07 ์ถ์ )
- ์ํฅ ๋ฒ์ : MOVEit Transfer 2023.0.x / 2022.1.x / 2022.0.x / 2021.1.x / 2021.0.x / 2020.1.x / 2020.0.x (๊ณต๊ฐ ๋น์ ์ ๋ธ๋์น)
- ๋์: Progress ๊ธด๊ธ ํจ์น(05-31) ยท CISA KEV ๊ฐ์ ์กฐ์น ยท CISA/FBI/NSA ๊ณต๋ ๊ถ๊ณ ยท ์ ๊ณ๋ ์ ์ํ ๋ฒค๋ ์ํต์ ๊ธ์ ํ๊ฐ
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ํผ์ฑ์ด ์๋๋ผ '๋ ธ์ถ๋ฉด ์ค์บ'
EmotetยทQakbot๋ฅ ๋ก๋๋ ๋ฉ์ผ๋ก ์ฌ๋์ ๋๋๋ค. MOVEit ์บ ํ์ธ์ ์ ๋ฐ๋๋ค. ์ฌ๋์ด ๊ฐ์ ํ ์ง์ ์ด ์ฒ์๋ถํฐ ์์๋ค.
- โ ์ ์ฐฐ โ ์ธํฐ๋ท์ ๋ ธ์ถ๋ MOVEit Transfer ์ฐพ๊ธฐ: ์ฌ๋์ด ๋ก๊ทธ์ธํ๋ ์น ์ธํฐํ์ด์ค๊ฐ ๊ณต์ธ IP์ ๊ทธ๋๋ก ์ด๋ ค ์๋ ๊ณณ์ ์ค์บํ๋ค. Cl0p๋ 2021๋ Accellion FTA ์ฌ๊ฑด๋ถํฐ ๊ฐ์ ์๋ฒ์ ์ผ๊ณ , ๋ณด๊ณ ์ ๋ฐ๋ผ์๋ 2023๋ ๋ด๋ถํฐ ์ ์ฐฐยท์ ํ ์๋ ํ์ ์ด ๊ด์ฐฐ๋๋ค. (ํต์ฌ์ ์ทจ์ฝ์ ์ '์จ๋'๊ฐ ์๋๋ผ ๋ ธ์ถ ๋์๋ค.)
- โก ๋ฌด์ธ์ฆ ์ง์
โ API ์๋ํฌ์ธํธ: ์ธ์ฆ ํ๋ฉด์ ํต๊ณผํ ํ์๊ฐ ์์๋ค.
/moveitisapi/moveitisapi.dll?action=m2๊ฐ์ ๋ ๊ฑฐ์ API์guestaccess.aspx๊ฐ์ ๋น๋ก๊ทธ์ธ ๋ฐฉ๋ฌธ์์ฉ ๊ธฐ๋ฅ์ด ๊ณต๊ฒฉ ํ๋ฉด์ด์๋ค (3์ฅ์์ ์์ธ). - โข ์น์
ธ ์ค์น โ
human2.aspx: ๊ด๋ฆฌ์ ๊ถํ์ ์ป์ ๋ค ์ ํ์ ์ ์ ํ์ผ ์ ๋ก๋ API๋ก ์น ๋ฃจํธ์ ์น์ ธ์ ๋จ์ด๋จ๋ฆฐ๋ค. ํ์ผ๋ช ์ ์ ์ ํ์ผhuman.aspx์ ์ซ์ ํ๋๋ฅผ ๋ถ์ฌ ์์ฅํ๋ค. ์ด๋ฆ์ LEMURLOOT. - โฃ ์์ง โ DB + Azure Blob: ์น์ ธ์ด MOVEit ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ํ์ผ ๋ชฉ๋ก๊ณผ Azure Blob Storage ์ค์ ยท๊ณ์ ํค๋ฅผ ์ฝ์ด ๋๋ ๋ค์ด๋ก๋ํ๋ค. ์ฆ ํผํด ์กฐ์ง์ ํ์ผ์ ์ก์๊ฐ ๊ณต๊ฒฉ์์ ๋ฐฐ์ถ๊ตฌ๋ก ์ ํ๋๋ค.
- โค ํ๋ฐ โ ๋คํฌ์น ์ ์ถ ์ฌ์ดํธ: ํ์น ๋ฐ์ดํฐ๋ฅผ ์ ์ถ ์ฌ์ดํธ "Cl0p^_-Leaks"์ ์ฌ๋ฆฌ๋ฉฐ "๊ธฐํ ์์ ์ฐ๋ฝํ๋ฉด ์ญ์ ํด์ฃผ๊ฒ ๋ค"๊ณ ์๋ฐํ๋ค. ์ํธํ ๋จ๊ณ๊ฐ ์์ ์๋ค.
- โฅ ํ์ฐ์ด ์๋๋ผ '๋์ ํ๊ฒฉ': ์ ํ ๊ธฐ๋ฅ์ ํ์ ์๋ค. ์ทจ์ฝํ ์ ํ์ด ์ธํฐ๋ท์ ์์ฒ ๋ ์๊ณ , ๊ณต๊ฒฉ์๋ ๊ทธ ๋ชฉ๋ก์ ํ ๋ฒ์ ํ๋๋ค. ์ด ์บ ํ์ธ์ "์(Worm)"์ ์ฝ๋๊ฐ ์๋๋ผ ์ทจ์ฝํ ์์ฐ์ ๋ถํฌ์๋ค.
์ฃผ๋ชฉํ ์ ์ ํ์ด๋ฐ์ด๋ค. Accellion FTA๋ 2020๋ 12์ 23์ผ(์ฐ๋ง), MOVEit์ ๋ฉ๋ชจ๋ฆฌ์ผ๋ฐ์ด ์ฐํด โ Cl0p๋ ๋ด๋น์๊ฐ ํด๊ฐ ์ค์ธ ๊ธฐ๊ฐ์ ๋ ธ๋ฆฌ๋ ์ต๊ด์ด ์๋ค. ํจ์น๊ฐ ๋์๋ ์ค์ ์ ์ฉ๊น์ง์ ์ธ๊ฐ ์๊ฐ์ด ๊ณง ๊ณต๊ฒฉ ์ฐฝ(Window)์ด์๋ค.
3. ๋์ ์๋ฆฌ ์์ธ โ '์ ์ ๊ธฐ๋ฅ'๋ง์ผ๋ก RCE๊น์ง ๊ฐ๋ 8๋จ๊ณ
๋ณด์์ ์ฒด Horizon3.ai๊ฐ ํจ์น ์ ํ ๋ฐ์ด๋๋ฆฌ๋ฅผ ๋น๊ตํด ๊ณต๊ฐํ ์ฌํ ๊ฒฝ๋ก๊ฐ ๊ฐ์ฅ ์ดํด๊ฐ ๋น ๋ฅด๋ค. ์ธ์์ ์ธ ๊ฑด ์๋ก์ด ๋ฌด๊ธฐ๊ฐ ๊ฑฐ์ ์๋ค๋ ์ ์ด๋ค โ ์ทจ์ฝํ ์ฝ๋ ํ ๊ณณ + ์ ํ์ด ์๋ ์ ๊ณตํ๋ ์ ์ ๊ธฐ๋ฅ๋ค์ ์ด์ด ๋ถ์ฌ RCE๊น์ง ๋๋ฌํ๋ค.
| ๋จ๊ณ | ์ ์ฉํ ์ง์ | ์ฑ๊ฒฉ |
|---|---|---|
| 1 | moveitisapi.dll?action=m2 โ machine2.aspx ์ค๊ณ | ํค๋ ์ ๋ฏธ์ฌ ๋งค์นญ ๋ฒ๊ทธ๋ก ๊ฒ์ดํธ ์ฐํ |
| 2 | session_setvars ๊ฑฐ๋ / X-siLock-SessVar* | ์ธ์ ๋ณ์ ์์ ์ค์ (์ ์ ๊ธฐ๋ฅ) |
| 3 | guestaccess.aspx (secmsgpost) | ๋น๋ก๊ทธ์ธ ๊ฒฝ๋ก๋ก SQLi ๋๋ฌ |
| 4 | MOVEit DB ์ฝ๊ธฐยท์ฐ๊ธฐ | ๊ด๋ฆฌ์ ๊ณ์ ์์ฑ, IP ์ ํ ํด์ , ์ฐํฉ์ธ์ฆ ์ค์ ๋ณ๊ฒฝ |
| 5 | /api/v1/auth/token + session_grant=external_token | ๊ณต๊ฒฉ์ ์ธ์ฆ์๋ก ์๋ช ํ JWT๋ก sysadmin ํ ํฐ ํ๋ |
| 6 | /api/v1/folders/<id>/files?uploadType=resumable | ์ ์ ํ์ผ ์ ๋ก๋ API๋ก ์น์ ธ ๋ฐฐ์น |
| 7 | ์
๋ก๋ ์ฌ๊ฐ ์ํ(uploadState) โ BinaryFormatter.Deserialize() | .NET ์ญ์ง๋ ฌํ RCE |
| 8 | LEMURLOOT(human2.aspx) ์์ฃผ | DB์ ๋จ๋ ๊ณต๊ฒฉ์ ๊ณ์ = ์ง์์ฑ |
- โ ๊ฒ์ดํธ ์ฐํ(ํค๋ ์ ๋ฏธ์ฌ ๋ฒ๊ทธ):
action_m2์ฒ๋ฆฌ๊ธฐ๋ ์์ฒญ์machine2.aspx๋ก ๋๊ธฐ๊ธฐ ์ ์X-siLock-Transactionํค๋๊ฐfolder_add_by_path์ธ์ง ๊ฒ์ฌํ๋ค. ๊ทธ๋ฐ๋ฐ ์ด ํค๋๋ฅผ ์ถ์ถํ๋ ์ฝ๋๊ฐ ์ ๋ฏธ์ฌ(suffix) ๋งค์นญ์ผ๋ก ๋์ํด์,xX-siLock-Transaction: folder_add_by_path๊ฐ์ ๊ฒ์ฌ๋ง ํต๊ณผ์ํค๋ ๊ฐ์ง ํค๋๋ฅผ ํ๋ ๋ฃ๊ณ , ์ง์ง ๊ฑฐ๋ ํค๋๋ ๋ฐ๋ก ๋ฃ์ด ์ํ๋ ์์ ์ ์คํ์ํฌ ์ ์์๋ค. "๊ฒ์ฌํ ๊ฐ"๊ณผ "์คํ๋ ๊ฐ"์ด ๋ฌ๋๋ค. - โก ์ธ์
๋ณ์ ์ฃผ์
:
session_setvars๊ฑฐ๋๋ ํจ์น์์ ํจ์ ์์ฒด๊ฐ ์ญ์ ๋ ๊ธฐ๋ฅ์ด์๋ค(์ฆ ์ฌ๋ผ์ง ์ฝ๋๊ฐ ์ทจ์ฝ์ ์ ์ฆ๊ฑฐ๋ค). ์ด ํจ์๋X-siLock-SessVar0,X-siLock-SessVar1โฆ ํค๋๋ฅผ ๊ทธ๋๋ก ์ธ์ ๋ณ์๋ก ๋ณต์ฌํ๋ค. ์์ปจ๋X-siLock-SessVar0: MyUsername: sysadmin์ฒ๋ผ ์์ฒญ ํค๋๋ง์ผ๋ก ์ธ์ ๊ฐ์ ๋ฐ๊ฟ ์ ์์๋ค. - โข SQL ์ธ์ ์
: ์ง์
์ ์
guestaccess.aspx์secmsgpost๊ฑฐ๋(์ธ๋ถ์ธ์ด ๋ฉ์์ง๋ฅผ ๋ณด๋ด๋ ์ ์ ๊ธฐ๋ฅ)์๋ค. ํธ์ถ ์ฌ์ฌ์guestaccess.aspx โ SILGuestAccess.PerformAction() โ MsgEngine.MsgPostForGuest() โ UserEngine.UserGetSelfProvisionUserRecipsWithEmailAddress() โ UserGetUsersWithEmailAddress(). ๋ฌธ์ ๋ ์์ ์ ์ด๋ฉ์ผ ๋ชฉ๋ก(SelfProvisionedRecips)์ด ์ ๋ฆฌ(XHTMLClean) ์์ดAND Email='<EmailAddress>'์ ๋ฌธ์์ด ๊ฒฐํฉ์ผ๋ก ๋ค์ด๊ฐ ๊ฒ. ์ฌ๊ธฐ์ ์ฌ๋ฏธ์๋ ์ ์ฝ์ด ์๋ค โ ์ด ๋ณ์๋ ๋จผ์ ์ฝค๋ง(,)๋ก ์ชผ๊ฐ์ง๊ธฐ ๋๋ฌธ์ ์ฃผ์ ๋ฌธ์ ์ฝค๋ง๋ฅผ ์ธ ์ ์๋ค. ๊ณต๊ฒฉ์๋ INSERT๋ฅผ ํ ๋ฒ, UPDATE๋ฅผ ๋ ํ ๋ฒ์ฒ๋ผ ์์ฒญ์ ์ฌ๋ฌ ๋ฒ ๋๋ ์คํํด ์ฐํํ๋ค(์ฑํฐ 5์ PoC โ ์ด ๊ทธ ๊ตฌ์กฐ๋ฅผ ์ฌํํ๋ค). - โฃ DB ์ ๊ถ ํ๋: ์ด์ MOVEit ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ฝ๊ณ ์ธ ์ ์๋ค.
CISA ๊ถ๊ณ ๊ฐ ์ง๋ชฉํ ํ๋์ ๊ด๋ฆฌ์ ๊ถํ ๊ณ์ ์์ฑ์ด์๋ค โ ๋ฌด์์ ์ฌ์ฉ์๋ช
+
RealName='Health Check Service'. ๊ทธ๋ฆฌ๊ณ sysadmin์ ์ ์ IP ์ ํ์ ํ๊ณ , ์ฐํฉ ๋ก๊ทธ์ธ ์ค์ ์ ๊ณต๊ฒฉ์ ์ชฝ์ผ๋ก ๋ฐ๊ฟ๋ฒ๋ฆฐ๋ค. - โค sysadmin ํ ํฐ ํ์ทจ: MOVEit์
/api/v1/auth/token์session_grant=external_token์ผ ๋ ์ฐํฉ ๋ก๊ทธ์ธ(์ธ๋ถ IdP) ๊ฒฝ๋ก๋ฅผ ํ๋ค. ์๋ฒ๋ ์ ์ถ๋ RS256 JWT์ ์๋ช ์ ๊ฒ์ฆํ๊ธฐ ์ํดamurlํ๋๊ฐ ๊ฐ๋ฆฌํค๋ ๊ณณ์์ ์ธ์ฆ์๋ฅผ ๋ด๋ ค๋ฐ๋๋ค. JWT ๋ด์ฉ์ ๊ณต๊ฒฉ์๊ฐ ๋ง๋๋,amurl์ ์๊ธฐ ์๋ฒ๋ก ๋๋ฆฌ๊ณ ์๊ธฐ ์ธ์ฆ์๋ฅผ ์ฐ๋ฉด ์๋ช ๊ฒ์ฆ์ด ํต๊ณผํ๋ค. DB ์กฐ์์ผ๋ก "์ด IdP๋ฅผ ์ ๋ขฐํ๋ผ"๊ณ ์ค์ ํด ๋ ๋๋ถ์ ์ต์ข ์ ์ผ๋ก ๋ด์ฅ sysadmin์ ์ก์ธ์ค ํ ํฐ์ ์ป๋๋ค. - โฅ ์น์
ธ ๋ฐฐ์น: ์ป์ ํ ํฐ์ผ๋ก
/api/v1/folders๋ฅผ ์กฐํํ๊ณ , ์ฌ๊ฐ ๊ฐ๋ฅ ์ ๋ก๋(resumable) API๋ก ํ์ผ์ ์ฌ๋ฆฐ๋ค. ์ธ์ฆ๋ ์ ์ ์ ๋ก๋์ด๋ฏ๋ก ํ์ผ ์ ๋ก๋ ๋ณด์ ์ฅ์น๋ "ํฉ๋ฒ์ ๊ด๋ฆฌ์ ์ ๋ก๋"๋ก ๋ณธ๋ค. - โฆ ์ญ์ง๋ ฌํ RCE: Horizon3๊ฐ ํจ์น์์ ๋ฐ๊ฒฌํ ๋ ํ๋์ ๊ตฌ๋ฉ์ด
GetFileUploadInfo()์๋ค. ์ ๋ก๋ ์ฌ๊ฐ ์uploadState๊ฐ์ DB์์ ์ฝ์ดBinaryFormatter().Deserialize()์ ๊ทธ๋๋ก ๋ฃ๋๋ค โ ์ ํ์ ์ธ .NET ์ญ์ง๋ ฌํ ์ทจ์ฝ์ (ysoserial.net์TypeConfuseDelegate๊ณ์ด). DB ํ๋๊ฐ ์กฐ์ง๋ณ ํค๋ก ์ํธํ๋ผ ์์ด๋, ์ด๋ฏธ SQLi๋ก DB๋ฅผ ์ธ ์ ์๋ ๊ณต๊ฒฉ์์๊ฒ๋ ์๋ฏธ๊ฐ ์๋ค. "์ ๋ขฐ ๊ฒฝ๊ณ ์์ชฝ ๋ฐ์ดํฐ"๋ฅผ ์ ๋ขฐํ ๊ฒฐ๊ณผ๋ค. - โง LEMURLOOT์ ๋ด๋ถ: ์น์
ธ์ C#๋ก ์์ฑ๋ ASP.NET ํ์ผ๋ก,
์ ์ ์ ํ DLL(
MOVEit.DMZ.ClassLib,MOVEit.DMZ.Application.Files,MOVEit.DMZ.Application.Users)์ ๋ถ๋ฌ ์ ํ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก DBยทํ์ผ์ ์ ๊ทผํ๋ค. ์์ฒญ์ ํ๋์ฝ๋ฉ๋ ๋น๋ฐ๋ฒํธ์ ์ ์ฉ ํค๋(X-siLock-Comment)๋ก ์ธ์ฆํ๊ณ ,X-siLock-Step1/2/3ํค๋๋ก ๋ช ๋ น์ ์ฃผ๊ณ ๋ฐ์ผ๋ฉฐ ์๋ต์ gzip์ผ๋ก ์์ถํ๋ค. ๋ณผ์ผ์ด ์์ผ๋ฉด HTTP 404๋ฅผ ๋ฐํํด ์ค์บ๋์๊ฒ "์๋ ํ์ด์ง"๋ก ๋ณด์ธ๋ค. ํ ์ ์๋ ์ผ์ ํ์ผ ๋์ดยท๋ค์ด๋ก๋, Azure Blob ์ค์ ยท๊ณ์ ํค ์ถ์ถ, ๊ด๋ฆฌ์ ๊ณ์ ์์ฑ/์ญ์ ๋ค. - โ ์ง์์ฑ์ ํต์ฌ: ์น์ ธ ํ์ผ์ ์ง์๋, DB์ ๋ง๋ค์ด ๋ ๊ด๋ฆฌ์ ๊ณ์ ์ ๋จ๋๋ค. CISA๋ "์น ์๋ฒ๋ฅผ ์ฌ๊ตฌ์ถํด๋ DB๊ฐ ๋จ์ ์์ผ๋ฉด ๊ณต๊ฒฉ์ ๊ณ์ ์ผ๋ก ๋ค์ ๋ค์ด์ฌ ์ ์๋ค"๊ณ ๋ช ์ํ๊ณ , ๊ฐ์ฌ SQL๋ก ๋จ์ ๊ณ์ ์ ์ฐพ์ ์ญ์ ํ๋ผ๊ณ ๊ถ๊ณ ํ๋ค(์ฑํฐ 5์ PoC โฃ๊ฐ ๊ทธ ์ฟผ๋ฆฌ๋ค).
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ซ์๋ก ๋ณด๋ 2023
- ์กฐ์ง: ๋ณด์์ ์ฒด Emsisoft์ ์ง๊ณ(2023-10-25)์์ 2,500๊ฐ ์ด์, ์ดํ ๋์ 2,700๊ฐ ์ด์. ์ด ์ค 80% ์ด์์ด ๋ฏธ๊ตญ ์์ฌ ์กฐ์ง์ด์๋ค.
- ๊ฐ์ธ: ๋ ธ์ถ๋ ๊ฐ์ธ์ ๋ณด๊ฐ ์ฝ 9,300๋ง ๋ช ๊ท๋ชจ๋ก ์ง๊ณ๋๋ค. ํ ์ ํ์ ๊ฒฐํจ์ด 'ํ ๋๋ผ ์ธ๊ตฌ๊ธ' ๊ฐ์ธ์ ๋ณด์ ๋ฑ๊ฐ๊ฐ ๋ ์ฌ๋ก๋ค.
- ๋ํ ํผํด(2023๋ 5~6์): ์บ๋๋ค ๋ ธ๋ฐ์ค์ฝ์ค ์ฃผ์ ๋ถ (์ฌ์งยทํด์ง ์ง์ ์ต๋ 10๋ง ๋ช ), ์๊ตญ BBC ยท British Airways ยท Boots ยท Aer Lingus์ ๊ธ์ฌ๋ํ์ฌ Zellis, Ernst & Young ยท Transport for London ยท Ofcom, ๋ฏธ๊ตญ ์๋์ง๋ถ(DoE) ์ฐํ ๊ธฐ๊ด๋ค, ๋ฃจ์ด์ง์ ๋ OMV์ ์ค๋ฆฌ๊ฑด DMV(์๋ฐฑ๋ง ๋ช ๊ท๋ชจ), ๊ทธ๋ฆฌ๊ณ ShellยทPutnam Investmentsยท1st Sourceยท๋ด์์ ๊ต์ก์ฒญ ๋ฑ์ด ์๋ฐ๋ผ ๊ณต๊ฐ๋๋ค.
- ๊ณต๊ฒฉ์ ์์ต: Cl0p๋ ์ํธํ ์์ด๋ MOVEit ์บ ํ์ธ๋ง์ผ๋ก 7,500๋ง~1์ต ๋ฌ๋ฌ๋ฅผ ๋ฒ์ด๋ค์ผ ๊ฒ์ผ๋ก ์ถ์ ๋๋ค. "๋ณต๊ตฌ ๋น์ฉ" ๋์ "์ ์ถ๋ ๋ฐ์ดํฐ์ ๊ฐ์น"์ ๊ฐ๊ฒฉ์ ๋งค๊ธด ์ ์ด๋ค.
- ๊ฑฐ์ง๋ง: Cl0p๋ 6์ 6์ผ "์ ๋ถยท๊ตฐยท์ด๋ฆฐ์ด๋ณ์ ๊ด๋ จ ๋ฐ์ดํฐ๋ ์ฆ์ ์ญ์ ํ๋ค"๊ณ ์ฃผ์ฅํ์ง๋ง ๊ฑฐ์ง์ผ๋ก ๋๋ฌ๋ฌ๋ค. ๋ฒ์ฃ์์ '์ญ์ ์ฝ์'์ ํ์ ๋๊ตฌ์ผ ๋ฟ์ด๋ผ๋ ์ ์ด ๋ค์ ํ์ธ๋๋ค.
- ํ๊ธ์ ๊ตฌ์กฐ: ํผํด ๋ชฉ๋ก์ด ํน์ ์ ์ข ์ ๋ชฐ๋ ค ์์ง ์๋ค. ์๋ฃยท๊ธ์ตยท ์ ๋ถยท๊ต์กยทํญ๊ณตยท์๋์ง๊ฐ ํ๊บผ๋ฒ์ ๋์จ๋ค โ MFT๊ฐ ์ ์ข ์ด ์๋๋ผ '๋ฐ์ดํฐ๊ฐ ํ๋ฅด๋ ๊ด๋ฌธ'์ด๊ธฐ ๋๋ฌธ์ด๋ค. ๊ณต๊ธ๋ง ์ํ์ "์ฐ๋ฆฌ ํ๋ ฅ์ฌ๊ฐ ์ํํ๊ฐ"๋ก ๋ฌผ์ผ๋ฉด ๋์น๋ ์ข ๋ฅ์ ๋ฆฌ์คํฌ๋ค.
- ๋์: Progress์ 5์ 31์ผ ์ ๋ธ๋์น ์์ ๋น๋๋ฅผ ๋ฐฐํฌํ๊ณ , CISA๋ KEV ๋ฑ์ฌ(6/2)๋ก ์ฐ๋ฐฉ๊ธฐ๊ด์ ๊ฐ์ ์กฐ์น๋ฅผ ๊ฑธ์์ผ๋ฉฐ FBIยทCISA(๋ฐ NSA)๊ฐ 6์ 7์ผ ๊ณต๋ ๊ถ๊ณ ์ ํํ ์๊ทธ๋์ฒ๋ฅผ ๊ณต๊ฐํ๋ค. ํ์ SQLi 2๊ฑด (CVE-2023-35036 ยท CVE-2023-35708)์ด ์ฐ์ด์ด ๋์ค๋ฉฐ "ํ ๋ฒ ๊ณ ์น๋ฉด ๋"์ด๋ผ๋ ์ฐฉ๊ฐ๋ ํจ๊ป ๊นจ์ก๋ค.
5. PoC โ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋ 4์ข (๋ก์ปฌ ์ค์ต ์ ์ )
sqlite :memory:)์ ํฉ์ฑ ๋ก๊ทธ/๋ฌธ์์ด ์์์๋ง
๋์ํ๋ค. ๋คํธ์ํฌ ํต์ ยท์ค์ DB ์ ์ยทํ์ผ ์
๋ก๋ยท๋ช
๋ น ์คํ ๊ธฐ๋ฅ์ ์๊ณ , ๊ณต๊ฒฉ ๋์์
์ธํฐ๋ท๊ณผ ๋ถ๋ฆฌ๋ ๊ฐ์์ ๋ก์ปฌ ์ค์ต ๋ฉ์ ์ ์ ๋ก ํ๋ค.
์ค์ ์ ํ์ ๋์์ผ๋ก ํ ์ทจ์ฝ์ ํธ๋ฆฌ๊ฑฐ๋ ์ํํ์ง ์๋๋ค.
PoC โ โ ๋ฌด์ธ์ฆ ์ ๋ ฅ์ด ๋ฌธ์์ด ๊ฒฐํฉ์ผ๋ก ๋ค์ด๊ฐ ๋
3์ฅ์ AND Email='<EmailAddress>' ๊ฒฐํฉ ์ง์ ์ ๋ก์ปฌ ๋ฉ์ผ๋ก ์ฎ๊ธด ๊ฒ์ด๋ค.
๊ฐ์ ์
๋ ฅ์ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ์ผ๋ก ๋๊ธฐ๋ฉด ๊ฒฝ๊ณ๊ฐ ์ ์ง๋๋ ๊ฒ๊น์ง ๋์กฐํ๋ค.
# poc1_moveit_lab.py โ ๋ฌดํดํ ๋ก์ปฌ ์ค์ต์ฉ(:memory: DB). ์ค์ MOVEit ์ฝ๋ ์๋
def vulnerable_query(email):
# ์ทจ์ฝ: ๋ฏธ์ธ์ฆ ์
๋ ฅ์ด ์ ๋ฆฌ(XHTMLClean ์๋น) ์์ด ๋ฌธ์์ด ๊ฒฐํฉ์ผ๋ก ๋ค์ด๊ฐ๋ค
return ("SELECT Username, Permission FROM users WHERE InstID=9389 AND Deleted=0 "
"AND (Email='%s' OR Email LIKE ('%s'))"
% (email, escape_like_for_sql(email)))
def harden_query(): # ์์ : ํ๋ ์ด์คํ๋ + ๋ฐ์ธ๋ฉ
return ("SELECT Username, Permission FROM users WHERE InstID=? AND Deleted=0 "
"AND (Email=? OR Email LIKE ?)")
payload = "x') OR 1=1 --" # ์ฝค๋ง ์์ด, ๋ค์ชฝ ์ ์ ์ฃผ์์ผ๋ก ์๋ผ๋ธ๋ค
print(db.execute(vulnerable_query(payload) + "\n").fetchall())
print(db.execute(harden_query(), (9389, payload, escape_like_for_sql(payload))).fetchall())
์คํ ๊ฒฐ๊ณผ(์ด๋ฒ ์คํ ์ค์ ์ถ๋ ฅ):
[์ทจ์ฝ ์ฝ๋] ์คํ๋๋ SQL (์ฝ์
์ง์ ๋ค๋ก๋ `--` ์ฃผ์):
SELECT Username, Permission FROM users WHERE InstID=9389 AND Deleted=0 AND (Email='x') OR 1=1 --' OR Email LIKE ('x') OR 1=1 --'))
โ ์ค์ ๋ก ์๋ฒ๊ฐ ์คํํ๋ ๋ฌธ์ฅ: SELECT Username, Permission FROM users WHERE InstID=9389 AND Deleted=0 AND (Email='x') OR 1=1 /* ์ฌ๊ธฐ์๋ถํฐ๋ ์ ๋ถ ์ฃผ์ */
๋ฐํ ํ ์: 3 โ [('svc_backup', 30), ('sysadmin', 30), ('guest_secmsg', 10)]
โป ํ์ ์ธ์คํด์ค(9389)๋ก ํ์ ๋์ด์ผ ํ ์กฐํ๊ฐ ์ ์ฒด ๊ณ์ ์ ๋ฐํํ๋ค.
[์์ ์ฝ๋] ์คํ๋๋ SQL: SELECT Username, Permission FROM users WHERE InstID=? AND Deleted=0 AND (Email=? OR Email LIKE ?)
๋ฐ์ธ๋ฉ ๊ฐ: (9389, "x') OR 1=1 --") โ ๋ฐํ ํ ์: 0 โ []
โป ๊ฐ์ ์
๋ ฅ์ด '๋ฌธ์์ด'๋ก๋ง ์ทจ๊ธ๋์ด 0๊ฑด โ ๊ถํ ๊ฒฝ๊ณ๊ฐ ์ ์ง๋๋ค.
PoC โก โ ์ ์ถ๋ ์๋ช ํค๊ฐ '์ธ์ฆ'์ ๋ฌด๋ ฅํํ๋ค
5์ฅ โค๋จ๊ณ(sysadmin ํ ํฐ ํ๋)์ โฆ๋จ๊ณ(์ญ์ง๋ ฌํ)์ ๊ณตํต ์ ์ ๋ "์๋ช ํค๋ฅผ ์๋ค"๋ ๊ฒ์ด๋ค. ์๋๋ ASP.NET ์ธ์ฆ ์ฟ ํค ์๋ช (HMAC)์ ๋ชจ์๋ก ์ฌํํด, ํค๋ฅผ ๊ต์ฒดํ๋ฉด ์์กฐ ์ธ์ ์ด ์ฆ์ ์ ๋ถ ๋ฌดํจ๊ฐ ๋๋ ๊ฒ์ ๋ณด์ฌ์ค๋ค.
# poc2_session_forgery.py โ ๊ต์ก์ฉ ๋ชจ์(๋ก์ปฌ). ์ค์ ์ธ์
์ฟ ํคยทmachineKey ์๋
LAB_MACHINE_KEY = hashlib.sha256(b"mock-lab-machine-key-0926").digest() # ๋ชจ์ ํค
def sign_session(payload, key): # ์ฟ ํค ๋ณธ๋ฌธ + HMAC ์๋ช
body = json.dumps(payload, separators=(",", ":"), sort_keys=True).encode()
return (body + b"|" + hmac.new(key, body, hashlib.sha256).digest()).hex()
def verify_session(blob, key): # ๊ฒ์ฆ: ์๋ช
์ด ๋ง์ผ๋ฉด ์ธ์
'์ธ์ '
raw = bytes.fromhex(blob)
body, _, mac = raw.rpartition(b"|")
if hmac.compare_digest(hmac.new(key, body, hashlib.sha256).digest(), mac):
return json.loads(body)
return None
forged = sign_session({"user": "sysadmin", "perm": 30, "ip": "*"}, LAB_MACHINE_KEY)
print(verify_session(forged, LAB_MACHINE_KEY)) # โ ์๋ ํค
print(verify_session(forged, hashlib.sha256(b"rotated").digest())) # โก ํค ๊ต์ฒด ํ
์คํ ๊ฒฐ๊ณผ(์ด๋ฒ ์คํ ์ค์ ์ถ๋ ฅ):
์์กฐ ์ฟ ํค(๋ชจ์): 7b22657870223a313739303433313431342c226970223a222a222c227065726d223a3330 ...
โ ์๋ ํค๋ก ๊ฒ์ฆ : {'exp': 1790431414, 'ip': '*', 'perm': 30, 'user': 'sysadmin'}
โก ํค ๊ต์ฒด ํ ๊ฒ์ฆ: None
โป ์๋ช
๊ฒ์ฆ์ 'ํค๋ฅผ ์๋๊ฐ'๋ง ๋ฌป๋๋ค. ํค๊ฐ DB(SQLi)๋ก ์๋ฉด ์๋ช
์ ๋ฌด์๋ฏธํด์ง๊ณ ,
๋ฐ๋๋ก ํค๋ฅผ ๊ต์ฒดํ๋ฉด ์ด๋ฏธ ๋ฟ๋ ค์ง ์์กฐ ์ธ์
ยท๋ทฐ์คํ
์ดํธ๊ฐ ํ ๋ฒ์ ๋ฌดํจํ๋๋ค.
PoC โข โ 404๋ก ์์ฅํ๋ ์น์ ธ์ 'ํํ'์ ์๊ทธ๋์ฒ ํํ
LEMURLOOT์ ํต์ ๊ท์น(ํ๋์ฝ๋ฉ ๋น๋ฐ๋ฒํธ + ์ ์ฉ ํค๋ + gzip ์๋ต + 404 ์์ฅ)์ ๋ก์ปฌ ํจ์๋ก ์ฌํํ๊ณ , ์ด์ด์ CISA ํํ ์๊ทธ๋์ฒ์ ์ถ(๋ง์ปค + ํ์ผ ํฌ๊ธฐ๋)์ด ์ ์ ํ์ผ๊ณผ ์ด๋ป๊ฒ ๊ตฌ๋ถ๋๋์ง ๋์กฐํ๋ค. ์น์ ธ payload ์์ฒด๋ ์์ฑํ์ง ์๊ณ , '๋ง์ปค๊ฐ ์๋ ํฉ์ฑ ๋ฌธ์์ด'๋ง ๊ฒ์ฌํ๋ค.
# poc3_webshell_hunt.py โ ์น์
ธ์ ๋ง๋ค์ง ์๊ณ 'ํํ'๋ง ์ฌํยทํ์ง
MOCK_SECRET = "mock-lab-password" # ์ค์ต์ฉ ๋ชจ์ ๊ฐ (์ค์ ์น์
ธ ๋น๋ฐ๋ฒํธ ์๋)
def mock_request(headers): # ํต์ ๊ท์น ์ฌํ (๋คํธ์ํฌ ์์)
if headers.get("X-siLock-Comment") != MOCK_SECRET:
return 404, b"Not Found" # ์ ์ ๋ฐฉ๋ฌธ์ยท์ค์บ๋์๊ฒ๋ ๊ทธ๋ฅ 404
if headers.get("X-siLock-Step1") == "list":
return 200, gzip.compress(b"[mock] /Human/Inbox/mock-dump.csv")
return 404, b"Not Found"
SIGNATURES = ["X-siLock-Comment", "X-siLock-Step", "Health Check Service",
"Create_ASP_human2_aspx"] # CISA ์๊ทธ๋์ฒ ์ถ์ฝ(๊ต์ก์ฉ)
def scan_aspx(name, blob): # ์ด๋ฆ + ํฌ๊ธฐ ์๋์ฐ + ๋ง์ปค ๊ฐ์
hits = [s for s in SIGNATURES if s.encode() in blob]
return (name.endswith(".aspx") and 5000 <= len(blob) <= 10000 and len(hits) >= 2), len(blob), hits
for name, blob in (("human2.aspx", LEMU_SHAPE), ("human.aspx", BENIGN_ASPX)):
print(name, scan_aspx(name, blob))
์คํ ๊ฒฐ๊ณผ(์ด๋ฒ ์คํ ์ค์ ์ถ๋ ฅ):
์ ์ ์์ฒญ โ (404, b'Not Found')
๋น๋ฐ๋ฒํธ ํ๋ฆฐ ์์ฒญ โ (404, b'Not Found')
๋น๋ฐ๋ฒํธ ๋ง๋ ์์ฒญ โ 200 | gzip ํด์ : b'[mock] /Human/Inbox/mock-dump.csv'
human2.aspx size=7182 markers=4 ['X-siLock-Comment', 'X-siLock-Step', 'Health Check Ser โ โ ๏ธ ์
์ฑ ์์ฌ
human.aspx size=2453 markers=0 [] โ ์ ์
PoC โฃ โ ์ฌํ ํํ : ๋จ์ ๊ณ์ ๊ฐ์ฌ + ๋ก๊ทธ ์๊ด
์น์ ธ ํ์ผ์ ์ง์๋ DB์ ๋จ์ ๊ณต๊ฒฉ์ ๊ณ์ ์ด ์ง์์ฑ์ด ๋๋ค๋ CISA์ ์ง์ ์ ๊ทธ๋๋ก ์ฎ๊ฒผ๋ค. ๋๋ถ์ด, 404๋ฅผ ๋๋ ค์ฃผ๋ ์์ฒญ์ ๋ก๊ทธ์์ ์น๊ฒฉ ๊ฒฝ๋ณด๋ก ๋ง๋๋ ๊ท์น(์ ์ ์ฌ์ฉ์๋ 404 ํ์ด์ง๋ฅผ 3๋ฒ ์ฐ์ POSTํ์ง ์๋๋ค)์ ํฉ์ฑ ๋ก๊ทธ๋ก ๊ฒ์ฆํ๋ค.
# poc4_hunt.py โ ๋จ์ ๊ณต๊ฒฉ์ ๊ณ์ ๊ฐ์ฌ + '404 ์น์
ธ' ๋ก๊ทธ ์๊ด (ํฉ์ฑ ๋ฐ์ดํฐ)
AUDIT_SQL = ("SELECT Username, LoginName FROM users "
"WHERE Permission=30 AND Status='active' AND Deleted='0'")
for u in db.execute(AUDIT_SQL): # RealName='Health Check Service' ๊ณ์ ์ด ํ์ง ๋์
print("๊ด๋ฆฌ์ ๊ถํ ๊ณ์ :", u)
for (src, path, code), ts in seen.items(): # ๊ฐ์ ์ถ์ฒ๊ฐ 404 .aspx ๋ฅผ ๋ฐ๋ณต POST
if code == "404" and len(ts) >= 3:
print("[webshell_probe] src=%s path=%s 404๋ฐ๋ณต=%dํ" % (src, path, len(ts)))
์คํ ๊ฒฐ๊ณผ(์ด๋ฒ ์คํ ์ค์ ์ถ๋ ฅ):
[๊ฐ์ฌ ์ฟผ๋ฆฌ] SELECT Username, LoginName FROM users WHERE Permission=30 AND Status='active' AND Deleted='0'
๊ด๋ฆฌ์ ๊ถํ ๊ณ์ : ('svc_backup', 'svc_backup')
๊ด๋ฆฌ์ ๊ถํ ๊ณ์ : ('hcs_a71f', 'a71f9c22')
โป RealName='Health Check Service' ๊ณ์ ์ CISA ๊ถ๊ณ ์ ์ญ์ ๋์(์น์๋ฒ๋ฅผ ์ฌ๊ตฌ์ถํด๋
DB๊ฐ ๋จ์ ์์ผ๋ฉด ๊ณต๊ฒฉ์ ๊ณ์ ์ ๊ทธ๋๋ก ์ด์ ์๋ค).
[๋ก๊ทธ ์๊ด] 404 ์๋ต์ด๋ผ๋ '๊ฐ์ ์ถ์ฒ๊ฐ ๋ฐ๋ณต POST' ํ๋ .aspx ๋ฅผ ์น๊ฒฉ ๊ฒฝ๋ณด๋ก ์ฒ๋ฆฌ
โ ๏ธ [webshell_probe] src=203.0.113.7 path=/human2.aspx 404๋ฐ๋ณต=3ํ since=2026-09-25T23:41:05Z
๋ค ์กฐ๊ฐ์ ํฉ์น ๊ฒฐ๋ก ์ ์ด๋ ๋ค โ โ ๋ฌด์ธ์ฆ ๊ฒฝ๋ก โก์ธ์ ๋ณ์ ์ฃผ์ โข์๋ช ํค ํ์ทจ โฃํ์ผ ์ ๋ก๋ยท์ญ์ง๋ ฌํ๊ฐ ๊ฐ๊ฐ์ '์ ์ ๊ธฐ๋ฅ'์ธ๋ฐ ์ง๋ ฌ๋ก ์ด์ด ๋ถ์ RCE๊น์ง ๋๋ฌํ๋ค. ๊ทธ๋์ ๋ฐฉ์ด๋ ๊ฐ ์ด์์๋ง๋ค ํ์ํ๋ค.
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ/๊ตํ
- ๊ฒฝ๊ณ ์ ํ์ ์ธํฐ๋ท์ ์ง์ ๋ ธ์ถํ์ง ์๋๋ค: MFTยทVPNยทRMMยท๋ฉ์ผ ๊ฒ์ดํธ์จ์ด๋ '๋ฐ์ดํฐ๊ฐ ๋ชจ์ด๋ ๊ณณ'์ด๋ผ ํ ๋ฒ ๋ซ๋ฆฌ๋ฉด ํ๊ธ์ด ๊ณฑํด์ง๋ค. ๋ฆฌ๋ฒ์ค ํ๋ก์ยทZero Trust ์ก์ธ์ค ์๋จ ๋ฐฐ์น, ํ์ฉ IP ์ ํ, ๊ด๋ฆฌ UI ๋ถ๋ฆฌ๋ฅผ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ๋๊ณ , ๋ ธ์ถ ๋์๋ฅผ ์์ฐ ์ธ๋ฒคํ ๋ฆฌ๋ก ์์ ํ์ ํ๋ค. ์ด ์บ ํ์ธ์ 'ํ์ฐ'์ ์ทจ์ฝ ์์ฐ์ ๋ถํฌ ๊ทธ ์์ฒด์๋ค.
- ์ธํฐ๋ท ๋ ธ์ถ ์์ฐ์ ํจ์น๋ '๋น์ผ'์ด ๊ธฐ์ค: ๊ณต๊ฐ(5/31) โ KEV(6/2) โ ๊ณต๋ ๊ถ๊ณ (6/7). ์ฃผ๋งยท์ฐํด๋ฅผ ๋ ธ๋ฆฐ ๊ณต๊ฒฉ์ ํจ์น ์ ์ฐฝ(Window)์์ ๋๋๋ค. ์ฆ์ ์ ์ฉ์ด ์ด๋ ค์ฐ๋ฉด WAF ๊ฐ์ ํจ์นยท์๋ํฌ์ธํธ ์ฐจ๋จยท์๋น์ค ์ค์ง ์ค ํ๋๋ฅผ ๋ฐ๋์ ํํ๋ค.
- SQL์ ์ธ์ ๋ ํ๋ผ๋ฏธํฐ ๋ฐ์ธ๋ฉ: PoC โ ์ด ๋ณด์ฌ์ฃผ๋ฏ '์ด์ค์ผ์ดํ ํฌํผ'์ ๋ธ๋๋ฆฌ์คํธ ์ ๋ฆฌ๋ ์ฐํ์ ๋์์ด๋ค(์ค์ ๋ก ์ด ์ทจ์ฝ์ ์ ์ ๋ฆฌ ํจ์๋ฅผ ์ฐํํ๋ ๊ฒฝ๋ก๋ฅผ ํตํด ์ฑ๋ฆฝํ๋ค). ๋ ๊ฑฐ์ API์ '๋น๋ก๊ทธ์ธ ๋ฐฉ๋ฌธ์' ๊ธฐ๋ฅ์ด ๋จ์ ์๋์ง๋ ํจ๊ป ์ ๋ฆฌํ๋ค โ ์ค๋๋ ์๋ํฌ์ธํธ๋ ์ต์ ์ฝ๋์ ์ ๋ฆฌ ๋ก์ง์ ๊ณต์ ํ์ง ์๋๋ค.
- ํค๋ยท์ธ์ ๋ณ์๋ฅผ ์ ๋ขฐํ์ง ์๋๋ค: ๊ฒ์ฌํ ๊ฐ๊ณผ ์คํ์ ์ฐ์ธ ๊ฐ์ด ๋ฌ๋ผ์ง๋ ์๊ฐ ๊ฒ์ดํธ๋ ๋ฌด์๋ฏธํด์ง๋ค(์ ๋ฏธ์ฌ ๋งค์นญ ๋ฒ๊ทธ). ์ธ์ ๋ณ์๋ฅผ ํด๋ผ์ด์ธํธ ํค๋๋ก ์ค์ ํ๋ ๊ธฐ๋ฅ์ ์ค๊ณ ๋จ๊ณ์์ ์ ๊ฑฐํ๋ ํธ์ด ๋ซ๋ค.
- ์ ๋ขฐ ๊ฒฝ๊ณ ์์ชฝ ๋ฐ์ดํฐ๋ ์ฌ๊ฒ์ฆ: ์
๋ก๋ ์ฌ๊ฐ ์ํยทDB ํ๋์ฒ๋ผ
'์ฐ๋ฆฌ ์์คํ
์ด ๋ง๋ ๊ฐ'์ด๋ผ ๋ฏฟ๋ ๋ฐ์ดํฐ๊ฐ ์ญ์ง๋ ฌํ ์
๋ ฅ์ด ๋๋ฉด, ์๋จ์ SQLi ํ๋๊ฐ
RCE๋ก ์น๊ฒฉ๋๋ค.
BinaryFormatter๋ฅ ์์ ํ์ง ์์ ์ญ์ง๋ ฌํ๋ ์ฌ์ฉํ์ง ์๋๋ค(๋ง์ดํฌ๋ก์ํํธ๋ ํ๊ธฐ๋ฅผ ๊ถ๊ณ ). - ์๋ช ํค๋ ๊ณง ๊ฒฝ๊ณ๋ค: PoC โก์ฒ๋ผ ์๋ช ๊ฒ์ฆ์ "ํค๋ฅผ ์๋๊ฐ"๋ง ๋ฌป๋๋ค. ํค๊ฐ ์๋ฉด ์์กฐ ์ธ์ ์ด ํต๊ณผํ๊ณ , ํค๋ฅผ ๊ต์ฒดํ๋ฉด ์์กฐ ์ธ์ ์ด ์ผ๊ด ๋ฌดํจ๊ฐ ๋๋ค. ์ฌ๊ณ ํ์๋ ํคยทํ ํฐยท๋น๋ฐ๋ฒํธ ์ ๋ฉด ๊ต์ฒด๋ฅผ ๋ณต๊ตฌ ์ ์ฐจ์ ํฌํจํ๋ค.
- ์ฌ๊ณ ๋์ = ์ญ์ ๊ฐ ์๋๋ผ '๊ฐ์ฌ': ์น์ ธ์ ์ง์ฐ๊ณ ์น์๋ฒ๋ฅผ ์ฌ๊ตฌ์ถํด๋ DB์ ๊ณต๊ฒฉ์ ๊ณ์ ์ ๋จ๋๋ค. PoC โฃ์ ๊ฐ์ฌ ์ฟผ๋ฆฌ ๊ฐ์ ์ ๊ฒ์ ๋ณต๊ตฌ ์๋ฃ ์กฐ๊ฑด์ ๋ฃ๊ณ , ์น ๋ฃจํธ์ ์๋ก ์๊ธด .aspx๋ฅผ ๋ฌด๊ฒฐ์ฑ ๋ชจ๋ํฐ๋ง์ผ๋ก ์ก๋๋ค. 404๋ก ์์ฅํ ์น์ ธ์ ๋ฐ๋ณต POST๋ผ๋ ํ๋ ํ์ ์ผ๋ก ๋๋ฌ๋๋ค.
- ๋ฐฑ์ ๋ง์ผ๋ก๋ ๋ฐฉ์ด๊ฐ ์๋๋ค: ์ํธํ๋ฅผ ํ์ง ์์๋ ์ ์ถ๋ง์ผ๋ก ํ๋ฐ์ด ์ฑ๋ฆฝํ๋ค. ๋ณธ์ง์ ์ํ๋ ๋ณด๊ด ๋ฐ์ดํฐ ์ต์ํ(์ค๋๋ ๊ธ์ฌยท์๋ฃ ์๋ฃ๋ฅผ ์ ์ด์ ๋ฐ์๋์ง ์๊ธฐ)์ ์ ์ก ๊ตฌ๊ฐ ์๋ช ๊ด๋ฆฌ๋ค.
- ๊ณต๊ธ๋ง ์ ๋ขฐ์ ๊ฒฝ๊ณ๋ฅผ ์ดํดํ๋ค: "์ฐ๋ฆฌ๊ฐ ์์ ํ๊ฐ"๊ฐ ์๋๋ผ "์ฐ๋ฆฌ ๋ฐ์ดํฐ๊ฐ ์ง๋๊ฐ๋ ์ ํ์ด ์์ ํ๊ฐ"๋ฅผ ๋ฌผ์ด์ผ ํ๋ค. ๋ค๋ง ์ด ์ฌ๊ฑด์์ ์ ๊ณ๊ฐ ๊ณตํต์ผ๋ก ์ธ๊ธํ ์ ์ ๋ฒค๋์ ์ ์ํ ํจ์น์ ์ํต์ด ํผํด ๊ท๋ชจ๋ฅผ ์ค์๋ค๋ ์ฌ์ค์ด๋ค โ ์ฌ๊ณ ๋ ๋ง์ง ๋ชปํด๋ ๊ณต๊ฐ ์๋๋ ํต์ ํ ์ ์๋ค.
7. ์ถ์ฒ
- CISA/FBI โ #StopRansomware: CL0P Ransomware Gang Exploits CVE-2023-34362 MOVEit Vulnerability (AA23-158A, 2023-06-07) โ cisa.gov/โฆ/aa23-158a
- Progress Software โ MOVEit Transfer Critical Vulnerability (2023-05-31 ๋ณด์ ๊ณต์ง) โ community.progress.com/โฆ/MOVEit-Transfer-Critical-Vulnerability-31May2023
- Horizon3.ai โ CVE-2023-34362 Deep Dive and Indicators of Compromise (8๋จ๊ณ ์ฒด์ธ ์ฌํ) โ horizon3.ai/โฆ/moveit-transfer-cve-2023-34362-deep-diveโฆ
- Wikipedia โ 2023 MOVEit data breach โ en.wikipedia.org/wiki/2023_MOVEit_data_breach
- Wikipedia โ Clop (hacker group) โ en.wikipedia.org/wiki/Clop_(hacker_group)
- Huntress โ MOVEit ์ ๋ ์ต์คํ๋ก์ยท์น์ ธ ๋ถ์ ์๋ฆฌ์ฆ โ huntress.com/blog
โป ๋ณธ๋ฌธ์ PoC ์ฝ๋๋ ๊ตฌ์กฐ ์ดํด ๋ชฉ์ ์ ๊ต์ก์ฉ ๋ชจ์ ์ฝ๋์ด๋ฉฐ, ์ค์ CVE-2023-34362 ํธ๋ฆฌ๊ฑฐยท์ค์ ์ต์คํ๋ก์ ์์ฒญยท์ค์ ์น์ ธ(LEMURLOOT)ยท์ ์ถ ๋ฐ์ดํฐยทC2/IOC๋ ํฌํจํ์ง ์์ต๋๋ค. ๋ชจ๋ ์ค์ต์ ์ธํฐ๋ท๊ณผ ๋ถ๋ฆฌ๋ ๊ฒฉ๋ฆฌ ๋ฉ VM์ ์ ์ ๋ก ํฉ๋๋ค.
ํจ๊ป ์ฝ๊ธฐ: โ ๏ธ NotPetya (2017) โ ์ ๋ขฐ๋ฐ๋ ์ ๋ฐ์ดํธ ์ฑ๋์ ๋ฌด๊ธฐ๋ก ์ด ์์ดํผ ยท ๐ฆ SolarWinds SUNBURST (2020) โ ๊ณต๊ธ๋งยท์๋ช ์ ๋ขฐ์ ๋ถ๊ดด ยท ๐ฅ Emotet (2014โ2021) โ ๋์ฌ์จ์ด์ 1์ฐจ ์นจํฌ ํ๋ซํผ ยท ๐ชฑ Conficker (2008) โ ์๊ฐ ๋ฐฉ์ดํ ์ ยท ๐ฆ Bangladesh Bank SWIFT Heist (2016) โ '์ ์ ์น์ธ ๊ฑฐ๋'๋ก ์์ฅํ ์ํ ๊ฐํ