- ์ ์ฑ์ฝ๋๋ช : Sasser (W32/Sasser, Net-Worm:W32/Sasser, Worm:Win32/Sasser.A~F) โ ์ด๋ฆ์ LSASS(Security Authority SubSystem Service)์์ ๋ฐ์๋ค
- ๋ฑ์ฅ: 2004๋ 4์ 30์ผ ์ต์ด ์ ํฌ(Sasser.A) โ 5์ ์ด BยทCยทD, ์ ์ ๊ฒ๊ฑฐ ์งํ Sasser.E
- ์ทจ์ฝ์ : MS04-011 / CVE-2003-0533 โ LSASS์ AD ๊ด๋ จ ๋ฏธ๋ฌธ์ํ API(
DsRolerUpgradeDownlevelDatabase)๋ก ์ ๋ฌ๋๋ ๊ธด ๋ฌธ์์ด์์ ๋ฐ์ํ๋ ์๊ฒฉ ๋ฒํผ ์ค๋ฒํ๋ก - ํจ์น์์ ๊ฐ๊ฒฉ: ๋ง์ดํฌ๋ก์ํํธ๊ฐ 2004๋ 4์ 13์ผ MS04-011์ ๋ฐฐํฌ โ ์ ๋ฑ์ฅ๊น์ง 17์ผ. ํจ์น๋ฅผ ๋ฆฌ๋ฒ์ฑํด ์ต์คํ๋ก์์ ๋ง๋ค์๋ค๋ ๋ถ์์ด ์ ๋ ฅํ๋ค
- ์ ํ: ์ฌ์ฉ์ ์ํธ์์ฉ ์์. TCP 445(SMB, ์ผ๋ถ ๋ถ์์ 139๋ ์ธ๊ธ) ์ค์บ โ ์ต์คํ๋ก์ ์ฑ๊ณต ์ 9996 ํฌํธ์ ์๊ฒฉ ์ ธ โ ๊ฐ์ผ ํธ์คํธ์ 5554 FTP ์๋ฒ์์ ์๊ธฐ ์์ ์ ๋ด๋ ค๋ฐ์ ์คํ
- ํ์ :
%WINDIR%\avserve.exe(A) /avserve2.exe(B~E),C:\win.logยทwin2.log,HKLM\...\Run์๋ ์คํ ํค, ๋ฌด์์ftp.exeํ๋ก์ธ์ค, CPU 100% - ๋ํ ์ฆ์: LSASS ํฌ๋์ โ "LSA Shell (Export Version)์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ต๋๋ค" โ 60์ด ์์คํ ์ข ๋ฃ ์นด์ดํธ๋ค์ด โ ์ฌ๋ถํ โ ๋ค์ ๊ฐ์ผ๋๋ ๋ถํ ๋ฃจํ
- ํผํด: ์ ์ธ๊ณ 100๋ง ๋ ์ด์ ๊ฐ์ผ(์ถ์ ). ๋ธํํญ๊ณต ๋์์ ํก๋จํธ ๊ฒฐํญ, AFP ์์ฑ ํต์ ๋์ , ํ๋๋ If/Sampo 130๊ฐ ์ง์ ํ์, ์๊ตญ ํด์๊ฒฝ๋น๋ ์ ์ํด๋ ์๋น์ค ์ค๋จ, ๋ฃฌ๋ ๋ํ๋ณ์ X-ray 4๋ ์ ์ง
- ์ ์: Sven Jaschan(๋น์ 18์ธ, ๋ ์ผ ๋กํ ๋ถ๋ฅดํฌ). 2004๋ 5์ 7์ผ ์ฒดํฌ(๋ง์ดํฌ๋ก์ํํธ ํ์๊ธ 25๋ง ๋ฌ๋ฌ ์ ๋ณด), 2005๋ 7์ 8์ผ ์ง์ญ 1๋ 9๊ฐ์ ์งํ์ ์. Netsky.AC๋ ๊ทธ์ ์ํ์ด์๋ค
- ์์: "ํจ์น๊ฐ ๋์๋ค"์ "ํจ์น๊ฐ ๊น๋ ธ๋ค" ์ฌ์ด์ ๊ฐ๊ฒฉ์ด ๊ณง ๊ณต๊ฒฉ ํ๋ฉด์์ ๋ณด์ฌ์ค ์ฌ๋ก. ํ๊ดดยท์ ์ถ ์์ด๋ ๊ฐ์ฉ์ฑ๋ง์ผ๋ก ์ฌํ ๊ธฐ๋ฐ์์ค์ ๋ฉ์ถ ์ ์์์ ์ฆ๋ช ํ๋ค
1. ๋ฐฐ๊ฒฝ/์ญ์ฌ โ 18๋ฒ์งธ ์์ผ๋ ํ๋ ค๋ ์
2004๋ 4์ 13์ผ, ๋ง์ดํฌ๋ก์ํํธ๋ ์๊ฐ ๋ณด์ ์ ๋ฐ์ดํธ์ ํ๋๋ก MS04-011์ ๋ฐฐํฌํ๋ค. ์ด ์ค ํ๋๊ฐ Windows 2000ยทXP์ LSASS(Local Security Authority Subsystem Service)์์ ๋ฐ๊ฒฌ๋ ์๊ฒฉ ์ฝ๋ ์คํ ์ทจ์ฝ์ CVE-2003-0533์ด์๋ค. LSASS๋ ๋ก๊ทธ์จยท์ธ์ฆยท์ ์ฑ ์ ์ฉ์ ๋ด๋นํ๋ ๋ณด์์ ์ฌ์ฅ์ผ๋ก, SYSTEM ๊ถํ์ผ๋ก ๋์ํ๊ณ ํ๋ก์ธ์ค๊ฐ ์ฃฝ์ผ๋ฉด OS๊ฐ ์น๋ช ์ ์ค๋ฅ๋ก ํ๋จํ๋ค.
17์ผ ๋ค์ธ 2004๋ 4์ 30์ผ, ์ด ์ทจ์ฝ์ ์ ์๋์ผ๋ก ํฐ๋จ๋ฆฌ๋ ์์ด ๋ฑ์ฅํ๋ค. ์ ์์๋ ๋ ์ผ ๋๋์์ผ ๋กํ ๋ถ๋ฅดํฌ์ ๊ธฐ์ ์ ๋ฌธ๋ ํ์ Sven Jaschan(๋น์ 18์ธ). ์์ ๊ทธ์ 18๋ฒ์งธ ์์ผ(4์ 29์ผ)์ ๋ง์ถฐ ์ ํฌ๋ ๊ฒ์ผ๋ก ์๋ ค์ก๋ค. ๊ทธ๋ ๊ฐ์ ์๊ธฐ Netsky ๋ณ์ข (Netsky.AC)๋ ๋ง๋ค์๊ณ , ๋ ์ ์ฑ์ฝ๋๋ ๋น์ ์ ํํ๋ Bagle ๊ณ์ด๊ณผ์ '๋ฐ์ด๋ฌ์ค ์ ์' ๊ตฌ๋ ์์์ ์๋ก๋ฅผ ์ ๊ฑฐํ๋ ๊ธฐ๋ฅ๊น์ง ๋ฃ์ผ๋ฉฐ ์งํํ๋ค.
๋ง์ดํฌ๋ก์ํํธ๋ 25๋ง ๋ฌ๋ฌ ํ์๊ธ์ ๊ฑธ์๊ณ , ์ง์ธ์ ์ ๋ณด๋ก 5์ 7์ผ Jaschan์ด ์ฒดํฌ๋๋ค. ๋ ์ผ ๋ฒ์์ ๊ทธ๊ฐ ๋ง 18์ธ ์ด์ ์ ์์ ์์ฑํ๋ค๊ณ ๋ณด์ ์๋ ๋ฒ์ผ๋ก ์ฌํํ๊ณ , 2005๋ 7์ 8์ผ ์ปดํจํฐ ์ฌ๋ณดํ์ฃผยท๋ฐ์ดํฐ ๋ถ๋ฒ ๋ณ๊ฒฝ ํ์๋ก ์ง์ญ 1๋ 9๊ฐ์ ์งํ์ ์๋ฅผ ์ ๊ณ ํ๋ค. ์ฒดํฌ ์งํ์๋ Sasser.E๊ฐ ์ ํฌ๋๋๋ฐ, ์ด ๋ณ์ข ์ ๋ค๋ฅธ ์์ ์ ๊ฑฐํ๋ โ๋ฐฑ์ ํ๋ดโ ๊ธฐ๋ฅ์ ๋ฃ์ ์ ์ผํ ํ๋ณธ์ด์๋ค.
2. ๊ฐ์ผยท์ ํ ๊ฒฝ๋ก โ ๋ฉ์ผ๋, ํด๋ฆญ๋ ํ์ ์๋ค
Sasser์ ๊ฐ์ฅ ํฐ ํน์ง์ ์ฌ์ฉ์ ํ์๊ฐ ์ ํ ๊ฐ์ ๋์ง ์๋๋ค๋ ์ ์ด๋ค. ์ฒจ๋ถํ์ผ์ ์ด์ง๋, ๋งํฌ๋ฅผ ๋๋ฅด์ง๋ ์๋๋ค. ๋คํธ์ํฌ์ ์ฐ๊ฒฐ๋์ด ์๊ณ 445๋ฒ ํฌํธ๊ฐ ์ด๋ ค ์์ผ๋ฉฐ ํจ์น๊ฐ ์ ๋์ด ์์ผ๋ฉด, ๊ทธ ์์ฒด๋ก ๊ฐ์ผ ๋์์ด๋ค.
- IP ์์ฑ โ ๊ฐ์ผ ํธ์คํธ๋ ์๊ธฐ IP๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฃผ๋ณ ์ฃผ์๋ฅผ ๋๋ ์์ฑํ๋ค. ๊ฐ์ ๋์ญ์ ์ฐ์ ํ๋ ๋ฌด์์์ฑ์ ์์ด, ํ ์๋ธ๋ท์ด ๋งํ๋ฉด ๋ค๋ฅธ ๋์ญ์ผ๋ก ๋ฒ์ง๋ ๊ตฌ์กฐ๋ค.
- 445/TCP ์ฐ๊ฒฐ โ SMB ํ์ ํฌํธ์ ๋์ ๋ค๋ฐ๋ก ์ฐ๊ฒฐ์ ์๋ํ๋ค. ์๋ต์ด ์์ผ๋ฉด ๊ณง๋ฐ๋ก ์ต์คํ๋ก์ ํจํท์ ๋ณด๋ธ๋ค.
- LSASS ์ค๋ฒํ๋ก โ ์กฐ์๋ DCERPC ์์ฒญ์ ๊ธด ๋ฌธ์์ด์ด LSASS ๋ด๋ถ ๋ฒํผ๋ฅผ ๋์น๊ฒ ํด ์คํ ํ๋ฆ์ ๊ฐ๋ก์ฑ๋ค.
- 9996 ๋ฆฌ์ค๋ โ ์
ธ์ฝ๋๊ฐ
cmd.exe๋ฅผ 9996๋ฒ ํฌํธ์ ๋ฌถ์ด ์๊ฒฉ ์ ธ์ ๋ง๋ ๋ค. ์์ ์ฌ๊ธฐ์ ์ ์ํด ๋ช ๋ น์ ๋ด๋ฆฐ๋ค. - 5554 FTP์์ 2๋จ๊ณ ๋ด๋ ค๋ฐ๊ธฐ โ ๊ฐ์ผ ํธ์คํธ๋ ์์ ์ 5554๋ฒ ํฌํธ์ ์ด๋ฏธ๋ FTP ์๋ฒ๋ฅผ ๋์ฐ๊ณ , ๋ฌด์์ 5์๋ฆฌ ์ซ์ +
_up.exe์ด๋ฆ์ผ๋ก ์๊ธฐ ๋ณต์ฌ๋ณธ์ ์ ๊ณตํ๋ค. ์ ํธ์คํธ๋ftp.exe๋ฅผ ์ด์ฉํด ์ด ํ์ผ์ ๋ฐ์ ์คํํ๋ค. - ์์ฃผ โ
%WINDIR%\avserve.exe(๋๋avserve2.exe)๋ก ์ ์ฅ๋๊ณRunํค์ ๋ฑ๋ก๋ผ ์ฌ๋ถํ ํ์๋ ์ด์๋๋ค.
์ฆ Sasser๋ ์ต์คํ๋ก์(1๋จ๊ณ)๊ณผ ํ์ผ ์ ๋ฌ(2๋จ๊ณ)์ ๋ถ๋ฆฌํ๋ค. ์ต์คํ๋ก์ ์ฝ๋๋ ์๊ฒ ์ ์งํ๊ณ , ์ค์ ํ์ด๋ก๋๋ ์ด๋ฏธ ๊ฐ์ผ๋ ํธ์คํธ๊ฐ FTP๋ก ๊ฑด๋ค์ฃผ๋ ๋ฐฉ์์ด๋ค. ์ด ๊ตฌ์กฐ ๋๋ถ์ ์ ๋ณธ์ฒด๋ ์์ญ KB ์์ค์ผ๋ก ์์๊ณ , ๋ณ์ข ๊ต์ฒด๋ ์ฌ์ ๋ค.
3. ๋์ ์๋ฆฌ ์์ธ โ ์ฝ๋/๊ตฌ์กฐ ๋ ๋ฒจ
3.1 ์ทจ์ฝ์ ์ ๋ณธ์ฒด: ๊ธธ์ด๋ฅผ ๋ฏฟ๋ ํ์
CVE-2003-0533์ ๊ทผ๋ณธ ์์ธ์ ๊ณ ์ ์ ์ด๋ค. ๋คํธ์ํฌ์์ ์จ ๊ธธ์ด ๊ฐ์ ๊ฒ์ฆํ์ง ์๊ณ ๊ณ ์ ํฌ๊ธฐ ๋ฒํผ๋ก ๋ณต์ฌํ๋ ์คํ/ํ ์ค๋ฒํ๋ก๋ค. ๊ณต๊ฒฉ์๋ ํ๋ ํฌ๊ธฐ(์์ญ~์๋ฐฑ ๋ฐ์ดํธ)๋ฅผ ํจ์ฌ ๋๋ ๋ฌธ์์ด์ ๋ณด๋ด ์ธ์ ๋ฉ๋ชจ๋ฆฌ(ํจ์ ํฌ์ธํฐยท๋ฆฌํด ์ฃผ์ยท์ธ์ฆ ์ํ ํ๋๊ทธ)๋ฅผ ๋ฎ์ด์ด๋ค. LSASS๋ SYSTEM ๊ถํ์ด๋ฏ๋ก, ์คํ ํ๋ฆ์ ์ก์ผ๋ฉด ๊ณง๋ฐ๋ก ์ต๊ณ ๊ถํ์ด๋ค.
์ค์ํ ์ ์ ์ต์คํ๋ก์ ์ฑ๊ณต์ด ๊ณง ์์ ์ ๋์์ ์๋ฏธํ์ง ์๋๋ค๋ ๊ฒ์ด๋ค. ์์ ์
ธ์ฝ๋๋ ๋งค์ฐ ๊ฑฐ์น ๊ฒ ์์ฑ๋ผ, ์ต์คํ๋ก์์ด ์คํจํ๊ฑฐ๋ ํ ์ํ๊ฐ ์กฐ๊ธ๋ง ๋ฌ๋ผ๋ LSASS๊ฐ 0xC0000005(์ก์ธ์ค ์๋ฐ)๋ก ์ฃฝ๋๋ค. ์ด๊ฒ์ด Sasser์ ์์ง์ธ ์ข
๋ฃ ์นด์ดํธ๋ค์ด์ ๋ง๋ ๋ค.
3.2 ๊ฐ์ผ ํ ํ๋ฆ (์์ฌ ์ฝ๋)
on_start():
if already_running(): exit()
copy_self_to("%WINDIR%\\avserve2.exe")
registry_set_run("avserve", "%WINDIR%\\avserve2.exe")
write_log("C:\\win2.log") # ๊ฐ์ผ ์๊ฐ/์นด์ดํฐ ๊ธฐ๋ก
ftp_server_listen(0.0.0.0:5554) # ์๊ธฐ ๋ณต์ฌ๋ณธ ๋ฐฐํฌ์ฉ
shell_listen(0.0.0.0:9996) # ์ต์คํ๋ก์ ์
ธ์ฝ๋๊ฐ ๋ฐ์ธ๋ฉ
for thread in 1..N: # ๋๋ ๋์ ์ค์บ
ip = pick_target_ip() # ์๊ธฐ ๋์ญ ์ฐ์ + ๋ฌด์์
if tcp_connect(ip, 445, timeout=short):
send_dcerpc_overflow(ip) # 1๋จ๊ณ: LSASS ์ต์คํ๋ก์
if tcp_connect(ip, 9996):
send("ftp -s:script.txt") # 2๋จ๊ณ: 5554์์ ์๊ธฐ ์์ ๋ฐ๊ธฐ
# script.txt: open 5554 / get _up.exe / bye
loop_forever()
์ฌ๊ธฐ์ ๋์ฌ๊ฒจ๋ณผ ์ค๊ณ๋ ์๊ธฐ ๋ฐฐํฌ ์๋ฒ๋ฅผ ์ค์ค๋ก ์ฌ๋ ์๊ธฐ์ฐธ์กฐ ๊ตฌ์กฐ๋ค. ์ค์ C2๋, ์ทจ์ฝํ ์น์๋ฒ๋ ํ์ ์๋ค. ๊ฐ์ผ๋ PC ํ ๋๊ฐ ๋ค์ PC์๊ฒ ํ์ผ์ ๊ฑด๋ค๊ณ , ๊ทธ PC๊ฐ ๋ค์ ์๋ฒ๊ฐ ๋๋ค. ๊ทธ๋์ Sasser๋ ์ด๊ธฐ์ ํ์ฐ ์๋๊ฐ ๋งค์ฐ ๋นจ๋๊ณ , ๋์์ 5554ยท9996 ํฌํธ ์ค์บ์ด๋ผ๋ ๊ฐ๋ ฅํ ํ์ง ์ง๋ฌธ์ ๋จ๊ฒผ๋ค.
3.3 ์ ์ฌ๋ถํ ๋ฃจํ๊ฐ ๋๋
- Windows๋ LSASS๋ฅผ ์น๋ช ์ ์์คํ ํ๋ก์ธ์ค๋ก ์ทจ๊ธํ๋ค. ์ด ํ๋ก์ธ์ค๊ฐ ๋น์ ์ ์ข ๋ฃํ๋ฉด ์ปค๋์ด ์ธ์ ์ ์ ๋ขฐํ ์ ์๋ค๊ณ ํ๋จํด 60์ด ํ ๊ฐ์ ์ข ๋ฃ๋ฅผ ์์ฝํ๋ค.
- ํ๋ฉด์๋ "์์คํ
์ข
๋ฃ: ์ด ์์คํ
์ ์ข
๋ฃ๋ฉ๋๋ค. ์งํ ์ค์ธ ์์
์ ์ ์ฅํ๊ณ ๋ก๊ทธ์คํํ์ญ์์ค. ์ข
๋ฃ๋ NT AUTHORITY\SYSTEM์ ์ํด ์์๋์์ต๋๋ค" ํํ์ ๋ํ์์์ ์นด์ดํธ๋ค์ด์ด ๋ฌ๋ค. ์์ธ ์ ๊ณต์๋
lsass.exe์ ์ํ ์ฝ๋-1073741819(=0xC0000005)๋ค. - ์ฌ๋ถํ
ํ
Runํค๋กavserve2.exe๊ฐ ๋ค์ ๋จ๊ณ , ๋ค์ ์ค์บยท์ต์คํ๋ก์์ ์์ํ๋ค. ํจ์น ์ ์๋ ์ฌ์ค์ ์๊ฐ ๋ณต๊ตฌ ๋ถ๊ฐ๋ฅํ ๋ฃจํ๋ค. - ์ ์์ฒด๋ ํ์ผ์ ์ํธํํ๊ฑฐ๋ ์ญ์ ํ์ง ์๋๋ค. ํผํด์ ๋ณธ์ง์ ๊ฐ์ฉ์ฑ ์์ค์ด๋ค. ๊ทธ๋ฐ๋ฐ๋ ๋ณ์ยทํญ๊ณต์ฌยท์ํ์ด ๋ฉ์ถ ์ด์ ๋, ์ด '๊ฐ์ฉ์ฑ'์ด ์ ๋ฌด ๊ทธ ์์ฒด์ด๊ธฐ ๋๋ฌธ์ด๋ค.
3.4 ๋ณ์ข ๊ณ๋ณด
| ๋ณ์ข | ๋๋กญ ํ์ผ | ํน์ด์ |
|---|---|---|
| Sasser.A | avserve.exe | ์ต์ด ํ๋ณธ. 4์ 30์ผ ํ์ฐ |
| Sasser.B~D | avserve2.exe | ์ค์บ ์ค๋ ๋ยท๋์ ๋์ญยทํ์ผ๋ช ๋์ํ๊ฐ ์กฐ๊ธ์ฉ ๋ณ๊ฒฝ, ํ์ฐ๋ ฅ ๊ฐํ |
| Sasser.E | avserve2.exe | ์ ์ ๊ฒ๊ฑฐ ์งํ ๋ฑ์ฅ. ๋ค๋ฅธ ์ ์ ๊ฑฐ ๊ธฐ๋ฅ ํฌํจ(Netsky ๊ณ์ด์ ํํ) |
| Sasser.F | avserve2.exe | ํ๊ธฐ ๋ณ์ข . ์ผ๋ถ ๋ฐฑ์ ํ๋ก์ธ์ค ์ข ๋ฃ ์๋ |
4. ํผํด ๊ท๋ชจ/์ํฅ โ ์ซ์๋ก ๋ณด๋ 2004๋ 5์
- ๊ฐ์ผ ๊ท๋ชจ: ๊ฐ๊ตญ ISPยท๋ฐฑ์ ์ ์ฒด ์ง๊ณ๋ฅผ ํฉ์น๋ฉด 100๋ง ๋๋ฅผ ๋์์ ๊ฒ์ผ๋ก ์ถ์ ๋๋ค. 2004๋ ์ MyDoomยทBagleยทNetskyยทSasser๊ฐ ๊ฒน์น '์์ ํด'์๋ค.
- ๋ธํํญ๊ณต: ์์ฝยท์ดํญ ์์คํ ์ด ๋ง๋น๋๋ฉฐ ๋์์ ํก๋จํธ ์ฌ๋ฌ ํธ ๊ฒฐํญ. ๋น์ ์ธ๋ก ์ "์ ๋๋ฌธ์ ๋นํ๊ธฐ๊ฐ ๋จ์ง ๋ชปํ๋ค"๊ณ ๋ณด๋ํ๋ค.
- AFP(Agence France-Presse): ์์ฑ ํต์ ์ด ์ ์๊ฐ ์ฐจ๋จ๋ผ ๊ตญ์ ๋ด์ค ์ก๊ณ ๊ฐ ์ค๋จ๋๋ค.
- ํ๋๋ If ๋ณดํยทSampo Bank: ์์คํ ์ ๋ฉด ์ค๋จ์ผ๋ก 130๊ฐ ์ง์ ํ์.
- ์๊ตญ ํด์๊ฒฝ๋น๋(Coastguard): ์ ์ ํด๋ยท๋งคํ ์๋น์ค๊ฐ ์ ์๊ฐ ์๋ ์ค๋จ.
- ๋ฃฌ๋ ๋ํ๋ณ์(์ค์จ๋ด): X-ray ์ฅ๋น 4๋๊ฐ ์ ์๊ฐ ์ ์ง, ์๊ธ ํ์๋ฅผ ์ธ๊ทผ ๋ณ์์ผ๋ก ์ ์.
- ๊ทธ ์ธ: Goldman Sachs, Deutsche Post, ์ ๋ฝ์ฐํฉ ์งํ์์ํ ๋ฑ์ด ์ ๋ฌด ์ง์ฅ์ ๋ณด๊ณ ํ๋ค. ํธ์ฃผ ์ฒ ๋ ์ผ๋ถ ๋ ธ์ ์ง์ฐ ์ฌ๋ก๋ ์ธ๋ก ์ ๋ณด๋๋๋ค.
- ๊ฒฝ์ ์ ์์ค: ์์ญ์ต ๋ฌ๋ฌ ๊ท๋ชจ๋ก ์ถ์ ๋์ง๋ง ๊ณต์ ์ง๊ณ๋ ์๋ค. ์์ ๋ฐ์ดํฐ๋ฅผ ํ์น์ง ์์๊ณ ๋ชธ๊ฐ๋ ์๊ตฌํ์ง ์์๋ค. ์์ํ ๊ฐ๋ ์ค๋จ ๋น์ฉ๋ง์ผ๋ก ์ด ๊ท๋ชจ๊ฐ ๋์๋ค๋ ์ ์ด ํต์ฌ์ด๋ค.
- ์ฐ์ ํจ๊ณผ: 445 ํฌํธ ์ฐจ๋จยทํจ์น ์๋ํยทISP ์ฐจ์์ ํํฐ๋ง์ด ๋ณธ๊ฒฉ์ ์ผ๋ก ๋ ผ์๋๋ ๊ณ๊ธฐ๊ฐ ๋๋ค. ์ค๋๋ ์ ํจ์น ๊ด๋ฆฌยท๋คํธ์ํฌ ์ธ๊ทธ๋ฉํ ์ด์ ๊ท์ (์: PCI DSS)์๋ ์ด ์๊ธฐ์ ์ฌ๊ฑด๋ค์ด ๋ฐฐ๊ฒฝ์ผ๋ก ์์ฉํ๋ค.
5. PoC โ ๋์ ์๋ฆฌ ์ฌํ (๊ต์ก์ฉยท๋ก์ปฌ ๋ฉ ์ ์ฉ)
PoC 1 โ ์ค์บ ํํ ์๋ฎฌ๋ ์ดํฐ (์ ํ 1๋จ๊ณ)
์์ด ์ด๋ป๊ฒ '์ฃผ๋ณ ๋์ญ'์ ํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์ ๋ฐฉํ๋ฒฝ ํ ์ค๋ก ๋งํ๋์ง๋ฅผ ๋ณด์ฌ์ค๋ค. ์ค์ ์ต์คํ๋ก์์ ์๊ณ , ๋ฉ ๋์ญ์ ๋ํ TCP ์ฐ๊ฒฐ ์๋๋ง ํ๋ค. ์ค์ ์์ ์๋ฐฑ~1,000 ์ค๋ ๋๋ฅผ ์ผ์ง๋ง, ๋ฉ์์๋ 64๊ฐ๋ก ์ ํํ๋ค.
#!/usr/bin/env python3
# ๊ต์ก์ฉ: 127.0.0.0/24 ๊ฐ์ ๋ฉ์์ "์ค์บ ํํ"๋ง ์ฌํํ๋ค.
# ์ค์ ์ทจ์ฝ์ ํธ๋ฆฌ๊ฑฐ/์
ธ์ฝ๋๋ ํฌํจํ์ง ์๋๋ค.
import ipaddress, socket
import concurrent.futures as cf
LAB = ipaddress.ip_network("127.0.0.0/24") # ์์ ํ ๋ฉ ๋์ญ๋ง!
PORT = 445
def probe(ip):
s = socket.socket()
s.settimeout(0.3)
try:
return str(ip), s.connect_ex((str(ip), PORT)) == 0
finally:
s.close()
with cf.ThreadPoolExecutor(max_workers=64) as ex:
alive = [ip for ip, ok in ex.map(probe, LAB.hosts()) if ok]
print("๋ฉ ๋ด 445/TCP ์๋ต:", alive)
print("โ ์ด ๋ชฉ๋ก์ด ๊ณง ์์ '๋ค์ ๊ฐ์ผ ํ๋ณด'๊ฐ ๋๋ค")
ํด์ค: Sasser์ ๋ฌด์์์ ์ด ๋ฃจํ๊ฐ ์ฌ๋ ์์ด, ์ด๋น ์๋ฐฑ ๋ฒ ๋๋ค๋ ์ ์ด๋ค. ๋ฐ๋๋ก ๋ฐฉ์ด๋ ๋จ์ํ๋ค. ์ธ๋ฐ์ด๋ 445๋ฅผ ์ธํฐ๋ท์์ ์ฐจ๋จํ๋ฉด ์ด ๋ฃจํ๋ ์๋ฌด๊ฒ๋ ๋ชป ํ๋ค. 2004๋ ์๋ "๋ฐฉํ๋ฒฝ๋ง ์ ๋๋ก ์ค์ ํด๋ ๋งํ๋ค"๋ ๊ฒ์ด ๋ง์ดํฌ๋ก์ํํธ์ ๊ณต์ ์ค๋ช ์ด์๋ค.
PoC 2 โ ๊ฒฝ๊ณ ๊ฒ์ฌ ์คํจ ์๋ฎฌ๋ ์ด์ (์ทจ์ฝ์ ์ ๋ณธ์ง)
LSASS ์ค๋ฒํ๋ก๋ฅผ ๊ทธ๋๋ก ์ฌํํ๋ ๋์ , ๊ธธ์ด๋ฅผ ์ ๋ขฐํ๋ ํ์๊ฐ ์ด๋ค ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋์ง ๊ณ์ฐ๋ง ํ๋ค. ์ค์ ๋ฉ๋ชจ๋ฆฌ ์ค๋ฒํ๋ก๋ฅผ ์คํํ์ง ์๊ณ , ์ด๊ณผ ๋ฐ์ดํธ ์์ ๋ฎ์ด์จ์ง ์ธ์ ํ๋๋ฅผ ์ถ๋ ฅํ๋ค.
/* ๊ต์ก์ฉ: ์ ์ฌ ํ์์ ๊ฒฝ๊ณ ๊ฒ์ฌ ์คํจ๋ฅผ "์๋ฎฌ๋ ์ด์
"ํ๋ค.
* ์ค์ ์ค๋ฒํ๋ก๋ฅผ ์คํํ์ง ์๊ณ , ์ด๋์ ๋์น๋์ง๋ง ๊ณ์ฐํด ์ถ๋ ฅํ๋ค.
* gcc -Wall -o parser_demo parser_demo.c (์คํํด๋ ์์ ) */
#include <stdio.h>
#include <string.h>
#define FIELD_LEN 64
typedef struct {
char account[FIELD_LEN];
int authenticated; /* ์ธ์ ํ๋: 0์ด๋ฉด ๋ฏธ์ธ์ฆ */
} Session;
/* ํจ์น ์ ์ฝ๋์ ํํ: ๊ธธ์ด๋ฅผ ๊ทธ๋๋ก ๋ฏฟ๊ณ ๋ณต์ฌ */
static void parse_vulnerable(Session *s, const char *in) {
memcpy(s->account, in, strlen(in)); /* โ ๊ฒฝ๊ณ ๊ฒ์ฌ ์์ */
}
/* ํจ์น ํ ์ฝ๋์ ํํ: ๋จ๋ ๊ณต๊ฐ๋ง ๋ณต์ฌ + ํญ์ NUL ์ข
๋ฃ */
static void parse_fixed(Session *s, const char *in) {
size_t n = strlen(in);
size_t room = sizeof(s->account) - 1;
if (n > room) n = room; /* โ
์ ๋จ */
memcpy(s->account, in, n);
s->account[n] = '\0';
}
int main(void) {
char input[512];
memset(input, 'A', sizeof(input) - 1);
input[sizeof(input) - 1] = '\0';
Session s = {0};
size_t n = strlen(input);
printf("[vuln ] ์์ฒญ ๊ธธ์ด=%zu, ํ๋ ํฌ๊ธฐ=%d, ์ด๊ณผ=%zu ๋ฐ์ดํธ\n",
n, FIELD_LEN, n - FIELD_LEN);
printf("[vuln ] ์ด ์ด๊ณผ๋ถ์ด ์ธ์ ํ๋(authenticated)๋ฅผ ๋ฎ์ด์ด๋ค\n");
#ifdef RUN_VULN_DEMO
parse_vulnerable(&s, input); /* ๋ก์ปฌ ๋ฉ์์๋ง, ์ ๋ ์๋น์ค์ ์ฐ๊ฒฐ ๊ธ์ง */
#endif
parse_fixed(&s, input);
printf("[fixed] ์ ์ฅ ๊ธธ์ด=%zu, authenticated=%d (๋ณ์กฐ ์์)\n",
strlen(s->account), s.authenticated);
return 0;
}
ํด์ค: ์ทจ์ฝ์ ์ 'ํด์ปค์ ๋ง๋ฒ'์ด ์๋๋ผ ํ ์ค์ ๊ธธ์ด ๊ฒ์ฌ ๋๋ฝ์ด๋ค. ํจ์น(MS04-011)๊ฐ ํ ์ผ๋ ๋ณธ์ง์ ์ผ๋ก ์ด ๊ฒ์ฌ๋ฅผ ์ถ๊ฐํ ๊ฒ์ด๋ค. ๊ทธ๋ฐ๋ฐ ๊ทธ ํ ์ค์ด ์ธํฐ๋ท์ ๋ ธ์ถ๋ ์๋ฐฑ๋ง ๋์ ๋์์ ์ ์ฉ๋์ด์ผ ํ๊ณ , 17์ผ์ ์ถฉ๋ถํ์ง ์์๋ค.
PoC 3 โ 2๋จ๊ณ ์๊ธฐ ๋ฐฐํฌ ์ฒด์ธ (5554 ํฌํธ์ ์๋ฆฌ)
Sasser์ ๋ ํนํ ์ ์ ๊ฐ์ผ ํธ์คํธ๊ฐ ๋ฐฐํฌ ์๋ฒ๊ฐ ๋๋ค๋ ๊ฒ์ด๋ค. ์๋๋ ๊ทธ ๊ตฌ์กฐ๋ฅผ 127.0.0.1์์ ์ฌํํ๋ค. ํ์ด๋ก๋๋ ์คํ ํ์ผ์ด ์๋๋ผ ๋ฌดํดํ ํ ์คํธ ํ์ผ์ด๋ฉฐ, ์ค์ ์์ FTP๋ฅผ ์ผ์ง๋ง ์ฌ๊ธฐ์๋ ๊ตฌํ ํธ์์ HTTP๋ฅผ ์ฌ์ฉํ๋ค.
# ๊ต์ก์ฉ: "๋ค์ ํธ์คํธ๊ฐ ์ด์ ํธ์คํธ์๊ฒ์ ์์ ์ ๋ฐ์๊ฐ๋ค"๋
# 2๋จ๊ณ ์ ๋ฌ ๊ตฌ์กฐ๋ง 127.0.0.1์์ ์ฌํํ๋ค. ํ์ด๋ก๋๋ ๋ฌดํดํ ํ
์คํธ.
import hashlib, http.server, os, socketserver, threading, urllib.request
os.makedirs("/tmp/lab", exist_ok=True)
stage2 = "/tmp/lab/13337_up.exe"
with open(stage2, "w") as f:
f.write("EDUCATIONAL-ONLY: this is not an executable\n")
os.chdir("/tmp/lab")
srv = socketserver.TCPServer(
("127.0.0.1", 5554), # ์ค์ Sasser์ FTP ํฌํธ์ ๋์ผ
http.server.SimpleHTTPRequestHandler)
threading.Thread(target=srv.serve_forever, daemon=True).start()
data = urllib.request.urlopen(
"http://127.0.0.1:5554/13337_up.exe", timeout=3).read()
print("2๋จ๊ณ ์์ ๋ฐ์ดํธ:", len(data))
print("sha256(์ 16์):", hashlib.sha256(data).hexdigest()[:16])
print("โ ์ค์ ์์ ์ด ํ์ผ์ ์ฆ์ ์คํํ๋ค")
srv.shutdown()
ํด์ค: ๋ฐฉ์ด ๊ด์ ์์ ์ด ๊ตฌ์กฐ๋ ์์๋ฐ์ด๋ ํ์ง์ ๊ธฐํ๋ค. ๋ด๋ถ ํธ์คํธ๊ฐ ๊ฐ์๊ธฐ 5554๋ฅผ ๋ฆฌ์ค๋ํ๊ฑฐ๋, ๋ค๋ฅธ ๋ด๋ถ ํธ์คํธ์ 5554๋ก ์ ์ํ๋ฉด ๊ทธ๊ฒ์ ์ ์ ์ ๋ฌด๊ฐ ์๋๋ค. Sasser ์๋์๋ ๋๋ถ๋ถ์ ๊ธฐ์ ์ด ์์๋ฐ์ด๋์กฐ์ฐจ ๋ณด์ง ์์์ง๋ง, ์ค๋๋ EDR์ ์ด ๋ ๊ฐ์ง๋ฅผ ๋ชจ๋ ์ก๋๋ค.
PoC 4 โ ํ์ ๊ธฐ๋ฐ ํ์ง ๊ท์น (๋ฐฉ์ด)
์๊ทธ๋์ฒ(ํ์ผ ํด์)๋ ๋ณ์ข ๋ง๋ค ๋ฐ๋๋ค. ์ด์๋จ๋ ๊ฒ์ ํ์๋ค. Sasser ๊ณ์ด์ ์ก๋ ์ต์ ๊ท์น ์งํฉ์ ํฉ์ฑ ์ด๋ฒคํธ๋ก ์ํํ๋ค.
# ๊ต์ก์ฉ ํ์ง: ํฉ์ฑ ์ด๋ฒคํธ์์ Sasser์ 4๊ฐ์ง ์ง๋ฌธ์ ์ฐพ๋๋ค.
events = [
{"host": "lab-01", "dst_port": 445, "syn_per_min": 640},
{"host": "lab-01", "listen_port": 5554},
{"host": "lab-02", "dst_port": 9996, "direction": "outbound"},
{"host": "lab-02", "file": "avserve2.exe", "path": "C:\\Windows"},
{"host": "lab-03", "run_key": "avserve", "syn_per_min": 3},
]
def scan_flood(e):
return e.get("dst_port") == 445 and e.get("syn_per_min", 0) > 200
def ftp_listener(e):
return e.get("listen_port") == 5554
def shell_callback(e):
return e.get("dst_port") == 9996 and e.get("direction") == "outbound"
def dropped_binary(e):
f = e.get("file", "").lower()
return f.startswith("avserve") or (f.endswith("_up.exe") and f[:5].isdigit())
RULES = [
("SMB ์ค์บ ํญ์ฃผ (์ ์ ํ 1๋จ๊ณ)", scan_flood),
("5554 ๋ฆฌ์ค๋ (์๊ธฐ ๋ฐฐํฌ ์๋ฒ)", ftp_listener),
("9996 ์์๋ฐ์ด๋ (์ต์คํ๋ก์ ์
ธ)", shell_callback),
("avserve/_up.exe ๋๋กญ (์์ฃผ)", dropped_binary),
]
for e in events:
for name, rule in RULES:
if rule(e):
print(f"[ALERT] {e['host']}: {name}")
ํด์ค: ์ค์ ์ด์์์๋ ์ฌ๊ธฐ์ HKLM\Software\Microsoft\Windows\CurrentVersion\Run์ avserve ๊ฐ, C:\win.logยทwin2.log ์์ฑ, ์งง์ ์๊ฐ ๋ด ๋ค์ ํธ์คํธ์ LSASS ํฌ๋์(์ด๋ฒคํธ ID 1000/7031)๋ฅผ ์๊ด ๋ถ์์ผ๋ก ๋ฌถ๋๋ค. ๋จ์ผ ์ด๋ฒคํธ๋ ์คํ์ด ๋ง์ง๋ง, ์ค์บ ํญ์ฃผ + 5554 + LSASS ํฌ๋์๊ฐ ๊ฐ์ ํธ์คํธ์์ ๊ฒน์น๋ฉด ํ์ ๋๊ฐ ๊ธ์์นํ๋ค.
6. ๋ฐฉ์ด ๋ฐฉ๋ฒ โ 2004๋ ์ ๋ต, ๊ทธ๋ฆฌ๊ณ ์ค๋์ ๋ต
6.1 ์ฆ์ ์กฐ์น(๋น์ ๊ธฐ์ค)
- MS04-011 ์ ์ฉ: ๊ทผ๋ณธ ํด๊ฒฐ. ์ ๋ฑ์ฅ 17์ผ ์ ์ ์ด๋ฏธ ๋ฐฐํฌ๋์ด ์์๋ค.
- 445 ์ธ๋ฐ์ด๋ ์ฐจ๋จ: ์ธํฐ๋ท ๊ฒฝ๊ณ์์ SMB๋ฅผ ์ ๋ ๋ ธ์ถํ์ง ์๋๋ค. ๋ด๋ถ๋ ์ ๋ฌด ๋จ์๋ก ๋ถ๋ฆฌํ๋ค.
- 5554ยท9996 ์์๋ฐ์ด๋ ์ฐจ๋จ: ๊ฐ์ผ๋๋๋ผ๋ ํ์ฐยท๋ช ๋ น ์ฑ๋์ ๋๋๋ค.
- ๊ฐ์ผ ์์ฌ ์: ๋์ ์ ๋ฝ๊ณ (๋คํธ์ํฌ ๊ฒฉ๋ฆฌ),
shutdown -a๋ก ์ข ๋ฃ ์นด์ดํธ๋ค์ด์ ์ค์งํ ๋ค,Runํค์avserve๊ฐ ์ญ์ +avserve*.exeยทwin*.log์ ๊ฑฐ + ์ฌ๋ถํ + ํจ์น. ์์๋ฅผ ์งํค์ง ์์ผ๋ฉด ์ฌ๋ถํ ์งํ ๋ค์ ๊ฐ์ผ๋๋ค. - ๋ฐฑ์ ์ ์ ์ ๋ฐ์ดํธ: ๋ณ์ข ์ด ์๊ฐ ๋จ์๋ก ๋์์ผ๋ฏ๋ก ์๋ ์ ๋ฐ์ดํธ๊ฐ ํ์์๋ค.
6.2 ์ค๋๋ ์ ๊ด์
- ํจ์น SLA๋ฅผ '์ผ' ๋จ์๋ก: ์ธํฐ๋ท ๋ ธ์ถ ์์ฐ์ 72์๊ฐ, ๋ด๋ถ๋ 14์ผ ๊ฐ์ ๋ช ์์ ๊ธฐํ์ ๋๊ณ ์์ธ๋ฅผ ์ถ์ ํ๋ค. Sasser์ 17์ผ์ 'ํจ์น๊ฐ ์กด์ฌํ๋ ๊ธฐ๊ฐ'์ด ๊ณง '์ต์คํ๋ก์ ๊ฐ๋ฐ ๊ธฐ๊ฐ'์์ ๋ณด์ฌ์ค๋ค.
- ๋ ธ์ถ๋ฉด ์ ๊ฑฐ: SMB(445)ยทRDP(3389)ยทWinRM์ ์ธํฐ๋ท์ ๋์ง ์๋๋ค. ์๊ฒฉ ๊ทผ๋ฌด๋ VPN/์ ๋กํธ๋ฌ์คํธ๋ก ์ฐํํ๋ค.
- LSASS ๋ณดํธ: Credential GuardยทRunAsPPLยทASR ๊ท์น์ผ๋ก LSASS ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๊ณผ ๋น์ ์ ์ข ๋ฃ๋ฅผ ๊ฐ์ํ๋ค. Sasser๋ LSASS๋ฅผ ๊ณต๊ฒฉ ๋์์ผ๋ก ์ผ์ง๋ง, ์ค๋๋ LSASS๋ ์๊ฒฉ์ฆ๋ช ํ์ทจ ๋์์ด๊ธฐ๋ ํ๋ค.
- ์ด๊ทธ๋ ์ค ํํฐ๋ง: ์์ 2๋จ๊ณ ์ ๋ฌ์ ๊ฑฐ์ ํญ์ ์์๋ฐ์ด๋ ์ฐ๊ฒฐ์ ๋ง๋ ๋ค. ๋ชฉ์ ์ง ์ ํ์ด ํ์ฐ ์๋๋ฅผ ์์ญ ๋ฐฐ ๋ฎ์ถ๋ค.
- ๊ฐ์ฉ์ฑ = ๋ณด์: Sasser๋ ๋ฐ์ดํฐ๋ฅผ ํ์น์ง ์์๋ค. ๊ทธ๋ฐ๋ฐ๋ ๋ณ์๊ณผ ํญ๊ณต์ฌ๊ฐ ๋ฉ์ท๋ค. BCP(์ ๋ฌด์ฐ์์ฑ)์ ์ฌํด๋ณต๊ตฌ ํ๋ จ์ ๋ณด์ ์์ฐ์ ํฌํจํด์ผ ํ๋ ์ด์ ๋ค.
- ์ฑ ์ ๊ณต๊ฐ์ ํ์๊ธ: 25๋ง ๋ฌ๋ฌ ํ์๊ธ๊ณผ ์ง์ธ ์ ๋ณด๊ฐ ๊ฒ๊ฑฐ๋ก ์ด์ด์ก๋ค. ์ค๋๋ ์ ์ทจ์ฝ์ ์ ๊ณ ํฌ์ยทCISA KEV ๋ง๊ฐ ๊ธฐํ๋ ๊ฐ์ ๋งฅ๋ฝ์ '์ฌํ์ ์๋ ฅ' ์ฅ์น๋ค.
7. ๊ตํ โ Sasser๊ฐ ๋จ๊ธด ๋ค ๊ฐ์ง
- ํจ์น ๋ฐฐํฌ โ ํจ์น ์ ์ฉ. 17์ผ์ ์งง์ง ์๋ค. ๊ทธ๋ฌ๋ ์๋ฐฑ๋ง ๋๊ฐ ์ฌ์ ํ ์ทจ์ฝํ๋ค. ์ต์คํ๋ก์ ๊ฐ๋ฐ ์๋๋ ํจ์น ์ ํ ์๋๋ณด๋ค ๋น ๋ฅด๋ค.
- ์ฌ์ฉ์ ๊ต์ก์ผ๋ก๋ ๋ง์ ์ ์๋ ๊ณต๊ฒฉ์ด ์๋ค. ํด๋ฆญ๋, ์ฒจ๋ถํ์ผ๋ ์์๋ค. ๋คํธ์ํฌ ์ค๊ณ์ ํจ์น๊ฐ ์ ์ผํ ๋ฐฉ์ด์๋ค.
- ๊ฐ์ฅ ์์ ์ฝ๋๊ฐ ๊ฐ์ฅ ํฐ ์ค๋จ์ ๋ง๋ ๋ค. Sasser๋ ์์ญ KB์ ๋ถ๊ณผํ๋ค. ํ๊ดด์ ๊ธฐ๋ฅ๋, ์ํธํ๋, ์ ์ถ๋ ์์๋ค. ๊ทธ์ ๊บผ์ง๊ฒ ๋ง๋ค์๋ค.
- ์์ ์๋๋ ๋๋์ง ์์๋ค. 2017๋ WannaCry๋ EternalBlue๋ก ๊ฐ์ ์ผ์ ๋ค์ ํ๋ค. 2020๋ BlueKeep, 2021๋ ProxyLogon๋ ๊ฐ์ ๋ฌธ๋ฒ์ด๋ค. '์๋ ์ ํ + ๋ฏธํจ์น ๊ฒฝ๊ณ + ์ฌ์ฉ์ ๋ฌด๊ฐ์ '์ ์ฌ์ ํ ๊ฐ์ฅ ๋น ๋ฅธ ํ์ฐ ๊ฒฝ๋ก๋ค.
์ถ์ฒ ๋ฐ ํจ๊ป ์ฝ๊ธฐ
- Microsoft Security Bulletin MS04-011 โ LSASS ์ทจ์ฝ์ ์๋ฌธยท์ํฅ ๋ฒ์ยทํจ์น
- NVD โ CVE-2003-0533 โ CVSSยท์ฐธ์กฐ ๋งํฌ
- Microsoft Defender โ Win32/Sasser โ ๋๋กญ ํ์ผยท๋ ์ง์คํธ๋ฆฌ ํ์
- Wikipedia โ Sasser (computer worm) โ ์ฌ๊ฑด ์ฐํยทํผํด ๊ธฐ๊ดยท์ฌํ ๊ฒฐ๊ณผ
- BBC News โ Sasser creator avoids jail term (2005-07-08)
- ํจ๊ป ์ฝ๊ธฐ: Blaster (2003) ยท SQL Slammer (2003) ยท Conficker (2008) ยท WannaCry (2017)