커널스팸메일러 (Rustock) 안철수연구소 ASEC 분석 1팀고흥환선임연구원 2005년이후악성코드의커다란변화는커널모드루트킷 (Rootkit) 의사용이빈번해지고있다는것이다. 뿐만아니라 2006년부터는그기법이매우정교해지고고급화되어안티바이러스업체나분석가로하여금상당한시간과노력을투자하게만들고있다. 2006년 VB(Virus Bulletin) 9월호 ROOTKIT ANALYSIS 기사에는최근의진보된루트킷하나를다루고있어흥미를주었는데, 바로 Rustock 이라불리는커널스팸메일러였다. 최근까지의가장진보된기술과은닉방법을사용하고있는 Rustock 에대해서장기간에 걸친상세분석결과와진단및치료를위한방법에대해서논의하고자한다. 1. Rustock 이란? 커널스팸메일러인 Rustock은생성된커널드라이버에서제작자가붙인이름 (Rustock rootkit v 1.2) 과프로젝트명 (Z:\NewProjects\spambot spambot\new\driver\objfre\i386\ driver.pdb) 을찾을수있다. 러시아인으로보이는제작자는커널루트킷커뮤니티에서활동하며다양한기법을연구, 발전시켜 2005년 12월초기버전을제작하고 2006년 7월까지 4 차례버전업데이트를하면서배포한것으로보인다. Rustock은윈도우커널모드루트킷과유저모드라이브러리로구성되며사용자몰래동적으로생성한스팸메일을발송하고, 외부로부터명령을받아들일수있도록통신포트를개방한다. 자체프로세스가존재하지않으며윈도우네트워크시스템모듈을변조하기때문에모니터링도구나스켄도구로부터도자유로울수있었다. 뿐만아니라그자체가파일로존재하지않도록 NTFS ADS(Alternate Data Streams) 에기록하여안티바이러스의파일감지를피하도록하였다. 2. 감염방법 기본적인감염방식을간단하게구성해보았다. 1 사용자가해킹된웹사이트에접속한다. 2 보안취약점을통하여사용자 PC 에드랍퍼 (Dropper) 가다운로드된다. 1
3 드랍퍼 (Dropper) 가실행되고 Rustock을 NTFS ADS에생성한다. 4 서비스등록및실행이되어커널모드루트킷이동작한다. 5 Services.exe에라이브러리 (A.DLL) 을인젝션 (Injection) 시킨다. 6 스팸메일발송및외부접속대기한다. 커널의루트킷은파일, 레지스트리, 오브젝트, 네트워크등을은닉시키는진보된기술을사용하 며, Services.exe 에인젝션되어진라이브러리는스팸발송과백도어로서의기능을맡고있다. < 그림 2-1 > 3. 진보된기술및기법 다형성 (Polymorphic) / 실행압축 다운로드된드랍퍼 (Dropper) 뿐만아니라 NTFS ADS(Alternate Data Streams) 에기록된 %WINDIR%\System32:lzx32.sys 는다형성으로실행압축되었다. 이다형성의기본골격은잘게쪼개진루틴들로이루어져있으며 PUSH / RET 방식으로호출되게하였다. 이러한방식을스파게티 (Spaghetti) 알고리즘이라한다. 이제까지의커널모드악성코드 (Rootkit) 는단순히유저모드의악성코드프로세스나레지스 트리를은닉하기위해사용되었으며, 실행압축과는거리가멀게생각되어왔다. 실행압축 2
해제에필요한 Kernel32.dll의 Export 함수인 LoadLibrary(), GetProcAddress() 등의함수를사용할수없다는것이문제였기때문이다. 그러나 Rustock은커널모드의 ntoskrnl.exe의 Export 함수인 ExAllocatePool(), ExFreePool(), ZwQuerySystemInformation(), _stricmp() 의함수포인터를구하여압축해제에사용하였다. < 그림3-1 > 은커널모드에서 Ntoskrnl.exe의로드이미지주소를얻기위해사용된방법이다. 드라이버로딩의주체는 System 프로세스 (ProcessID 4) 이며 FS:[--] A 은 System 프로세스의 NonPagePool Inherited Usage 주소즉, IDT(Interrupt Descriptor Table) 를가리킨다. IDT에는인터럽트서비스포인터가존재하며, 그포인터는 Ntoskrnl.exe의코드영역내를가리키고있을것이므로 Ntoskrnl.exe의로드이미지를얻을수있다. < 그림 3-1 > 4. 진보된기술및기법 NTFS ADS(Alternate Data Stream) NTFS 파일시스템의중요한특징은파일과폴더에대해서보안과스트림 (Stream) 적용을 추가하여 FAT 파일시스템보다효율적이고안정적인구조를설계한데에있다. Rustock에서는시스템폴더의 ADS(Alternate Data Stream) 영역에파일 (%WINDIR%\ System32:lzx32.sys) 을생성하고 SCM(Service Control Manager) 으로하여금서비스등록과실행을하도록하고있다. 그리고, 안티디텍션 (Anti-Detection) 방법으로 FileObject의 AccessState를변경하여 ADS 접근을제한하고, IoCallDriver API를후킹 (Hook) 하여 System32:lzx32.sys에대한접근 (IRP_MJ_CREATE, IRP_MJ_DIRECTORY_CONTROL) 의 IRP 요청에대해서거짓정보를리턴 (STATUS_OBJECT_NAME_NOT_FOUND) 함으로서자신을은 A 오용을막기위해정확한표기는생략한다. 3
닉시킨다. < 그림 4-1 > 5. 진보된기술및기법 System Service Call Hook 유저모드 (UserMode) 의 Ntdll.dll, User32.dll, Gdi32.dll B 은커널모드 (KernelMode) 시스템 서비스를요청할때, 다음과같은두가지방법을사용한다. 1 INT 0x2E (Interrupt 0x2E) Windows NT, 2000 2 SYSENTER (IA32_SYSENTER_EIP Register) Windows XP 이상 (3 월 ASEC 테크니컬리포트 루트킷을이용하는악성코드 참조 ) < 그림5-1 > 은 Intel CPU에서의 MSR(Model Specific Registers) 레지스터를소프트아이스에서불러온그림이다. SYSENTER 서비스에대한 CS:IP 주소가존재하는 MSR 레지스터의 0x174(IA32_SYSENTER_CS) 와 0x176(IA32_SYSENTER_EIP) 에대한포인터를 Ntoskrnl.exe의.rsrc Section의특정위치 (FATAL FATAL_UNHANDLED_HARD_DRROR) 로후킹 (Hook) 하고문자열 (FATAL) 5바이트는 JMP XXXXXXXX (E9XXXXXXXX) 로대체된다. IDT(Interrupt Descriptor Table) 의 0x2E Entry는 NT_SYSTEM_SERVICE_NT로정의된시스템서비스진입점포인터가존재한다. 바로 INT 0x2E로불리는데이에대한포인터를역시 Ntoskrnl.exe의.rsrc Section의특정위치 (FATAL_UNHA _UNHANDLED_HARD_DRROR) 로후킹 B 유저모드와커널모드사이의다리역할을하는서브시스템 (Subsystem) 4
(Hook) 하고문자열 (_UNHA) 5 바이트는 JMP XXXXXXXX (E9XXXXXXXX) 로대체된다. < 그림 5-2 > 는 Ntoskrnl.exe 의.rsrc Section 내에서후킹된 INT 0x2E 와 SYSENTER 가가 리키는주소로이곳은다시루트킷에의해 JMP 코드로덮어씌워진다. < 그림 5-1 > < 그림 5-2> 후킹설치가끝나고나면루트킷드라이버는 Ntoskrnl.exe 의코드영역에서참조되는모든 SYSENTER 참조포인터를후킹된주소로교체하는작업을한다. 그런데이렇게 INT 0x2E 와 SYSENTER 를후킹한이유가무엇인가? 결론을먼저언급하면특정서비스함수에대한후킹이목적이다. 하지만 Rustock은정작각각의서비스함수에대한후킹을하였던기존의루트킷의방법인 SSDT(System Service Dispatch Table) 의서비스함수후킹을사용하지않는다. 이유는간단하다. 많은루트킷디텍션 (Detection) 툴들이시스템의 SSDT(System Service Dispatch Table) 의포인터들을검사하여루트킷의존재를검사하였기때문이다. Rustock은실제로자신이후킹하고자하는서비스함수는정해져있다. 그래서 INT 0x2E와 SYSENTER를후킹하고복제본의 SSDT에서자신이목적으로하는서비스함수일경우에만특정주소로분기하게만들었다. 복제된 SSDT 에후킹서비스주소를등록하는서비스함수는다음의함수들이다. A. ZwOpenKey, ZwEnumerateKey, ZwQueryKey, ZwCreateKey B. ZwSaveKey, ZwDeviceIoControlFile 5
C. ZwQuerySystemInformation D. ZwTerminateProcess IofCallDriver는서비스함수가아니어서 Ntoskrnl.exe의 EAT(Export Address Table) 에서직접후킹등록한다. 6. 진보된기술및기법 DKOM Direct Kernel Object Manipulation의약자로사용되는 DKOM 기법은커널메모리에서유지, 관리하는모든오브젝트 (Object) 는이중연결리스트 (Double Linked List) 인원형큐 (Circular Queue) 로구성되어있는데이연결리스트의연결고리를끊어특정오브젝트를은닉하도록하는방법이다. < 그림 6-1 > 는특정커널드라이버오브젝트에대한은닉그림이며 DKOM 방식은메모리 보호, 대상오브젝트포인터획득, 오브젝트구조의이해등많은관련지식을필요로한다. < 그림 6-1 > Rustock은 DKOM 방식을사용하여다양한커널오브젝트를변경하는데그중에서서비스오브젝트는 SCM(Service Control Manager) 인 Services.exe 프로세스가관리하는서비스오브젝트전역변수를메모리에서찾아내링크를따라가며자신의서비스오브젝트명 (PE386) 을찾아관련링크를해제시키는방법을사용하였다. 6
< 그림 6-2 > 7. 진보된기술및기법 Asynchronous Procedure Call Rustock은커널루트킷 (Rootkit) 과시스템프로세스인 Services.exe에인젝션된라이브러리로구성된다는것은이미서두부분에서언급하였다. 문제는인젝션된라이브러리는어디로부터나와서어떻게 Services.exe의가상메모리에로드되어지며어떻게구동되느냐? 하는것이다. Windows는유저모드애플리케이션과커널모드드라이버간의데이터교환을위해 DeviceIoControl이라는 API 함수를사용한다. 드라이버는 DeviceIoControl에대한리턴버퍼를통해서유저모드애플리케이션에데이터를전송할수있다. 또는이벤트 (Event) 를사용한메모리매핑 (MemoryMapping) 을이용할수도있다. 하지만이방법들로는드라이버가유저모드의특정프로세스공간에라이브러리를로드시키고함수를호출하는것이불가능하다. NTSTATUS KeAttachProcess(PEB *); 다음의함수는 Ntoskrnl.exe에서 Export하는 Undocument API 함수이다. 인자값은 EPROCESS 포인터이며해당프로세스로의 Context Switch가동반된다. 즉, 현재프로세스의가상메모리번지지정을담당하는 CR3 레지스터가 EPROCESS가가리키는가상메모리번지로변경된다는것이다. 그러므로 Services.exe의가상메모리공간에메모리를할당받을수있게된다. Rustock 드라이버는시스템폴더 ADS(System32:lzx32.sys) 의마지막부분을읽어들이고복호화과정을거친뒤, Services.exe의할당된메모리공간에복호화된라이브러리데이터를옮겨심는다. 즉, 실행파일 (PE파일) 에대한메모리적재를수행하는시스템로더 (Loader) 의역할을 Rustock은내부적으로가지고있다. 7
VOID KeInitializeAPC ( struct _KAPC *APC, PKTHREAD thread, PKKERNEL_ROUTINE ker_routine, PKRUNDOWN_ROUTINE rd_routine, PKNORMAL_ROUTINE nor_routine, Unsigned char mode, Void *context ); VOID KeInsertQueueApc( struct _KAPC *APC, Void *SysArg1, Void *SysArg2, Unsigned char arg4 ); 다음의함수들은 Services.exe에적재시킨라이브러리의함수를호출할수있는방법을제공하는 API들이다. 붉게표시된부분은실제라이브러리의특정함수포인터와파라미터인자값들이다. Services.exe의메모리영역에복사된라이브러리는시스템의 IRQL Level이 APC가되었을때에호출되어진다. VOID rd_routine( ULONG *context, ULONG *SysArg1, ULONG *SysArg2 ); Services.exe 에인젝션 (Injection) 된라이브러리함수 rd_routine 가호출되어지면초기화 과정을거친뒤, 스팸메일발송과백도어로서의역할을시작하게될것이다. ( 악용될소지가 있어상세한기법은소개하지않을것이다.) 8. 진보된기술및기법 Network System Patch 윈도우 NT의네트워크구조의뼈대를이루는것이 NDIS(Nerwork Driver Interface Specification) 부르는커널네트워크라이브러리에서비롯된다. 마이크로소프트와 3Com사가공동개발하여네트워크하드웨어 (Hardware) 개발의공통인터페이스를제공하도록하였다. 윈도우네트워크시스템은바로 NDIS.SYS 드라이버라이브러리의익스포트함수 (Export Function) 를이용하여통신하게된다. Rustock은스펨메일발송과외부접속에따른네트워크통신을은닉하기위해서윈도우네트워크시스템의드라이버파일 (WanArp.sys, Tcpip.sys) 을패치 (Patch) 한다. Tcpip.sys와 WanArp.sys 모듈내부의.text 섹션 (Section) 에서다음과같은바이너리 OP 코드를찾아변경한다. 8
1 Tcpip.sys 코드영역 (FF 70 04 FF 50 30 => E8 XX XX XX XX 90) 2 WanArp.sys 코드영역 (FF 75 14 50 FF 50 54 => E8 XX XX XX XX 90 90) 패치된바이너리코드는네트워크접속 (Connection) 이이루어지는곳으로판단되며, 후에 스펨메일발송과외부접속에따른데이터위 / 변조를위한함수코드로디투어패치 (Detour Patch) 된다. < 그림 8-1 > Tcpip.sys 에대한 Detour Patch Tcpip.sys 프로토콜드라이버에대해서는다음의함수에대해서 IMPORT Address Table 에대한변경으로 IAT 후킹을더하였다. 1 NdisCloseAdapter 2 NdisOpenAdapter < 그림 8-2 > 는윈도우의네트워크시스템에대해서형상화한것이다. Rustock 은 Tcpip, WanArp 프로토콜드라이버의 NDIS_PROTOCOL_CHARACTERISTICS 구조체를변경하여네 트워크통신콜백 (CallBack) 함수에대한후킹을시도한다. 9
Rustock 루트킷드라이버 (PE386) 는 TDI(Transport Data Interface) 이하프로토콜 (Protocol) 드라이버단에서네트워크패킷 (NDIS_Packet) 에대한 Send/Receive 핸들러를통해 Services.exe에인젝션 (Injection) 시킨라이브러리 (A.DLL) 의스팸메일, 백도어 (Backdoor) 통신을방화벽 (Firewall), 모니터링 (Monitoring) 으로부터우회하도록하였다. < 그림 8-2 > 9. 진보된기술및기법 스팸메일 스팸메일을발송하고외부연결을위한백도어포트를오픈하는것은모두시스템프로세 스인 Services.exe 에인젝션된라이브러리 (A.DLL) 에서담당한다. 스팸메일을생성하고발송 하는순서는다음과같이표현된다. 1 다음의확장자를가진파일에서전송대상메일주소를추출한다. (wab,tbb,tbi,doc,xls,txt,csv,htm,html,xml,adb,asa,asc,asm,asp,cgi,con,csp,dbx,dlt,dwt,edm,hta,htc,inc,jsp,jst,lbi,php,rdf,rss,sht,ssi,stm,vbp,vbs,wml,xht,xsd,x st) 2 추출된메일주소중에서다음의문자열이포함된주소는제외시키는것으로판단된다. 10
(admin,info,support,soft,webmaster,help,web,postmaster,root,bugs,rating,site,c ontact,privacy,service,abuse,register,sales,cisco,gnu.org,bsd.it,debian,linux,ber keley,google,fido,ibm.com,microsoft.com,php.net,.mil,.gov,borland.com,sun.co m,xinul.com,virus,kaspersky,sophos,ripe.,iana.,drweb,secure,avp.,.arpa) 3 다음의단어들에대한 Google 검색을통해서메일본문을동적으로생성한다. (download,free,stuff,forum,politic,soft,crack,news,love,leave,games,enter,book, music,sport,console,editor) 4 SMTP(mx1.mail.yahoo.com) 서버에스팸메일을전송한다. 10. 진보된기술및기법 백도어 (Backdoor) 외부연결포트오픈역시시스템프로세스인 Services.exe에인젝션된라이브러리 (A.DLL) 에서이루어진다. 외부연결에따른모니터링및감지를피하기위해라이브러리에서는자체암호화를사용하는것으로보인다. 다음의 < 그림10-1 > 은시만텍자료에서추출한백도어공격세션연결통신에대한그림이다. 감염된시스템에접속하기위해암호화된키로구성된 HTTP 세션연결을시도한다. 인증이성공되면 RC4 암호화데이터로통신을유지하는것으로보인다. < 그림 10-1 > 11. 그밖의기법들 1 ~ 10 까지열거한기법들은상세분석당시에이제까지의다른악성코드에서보지못하 였거나특이한기법들에대해서나름대로 ( 주관적으로 ) 설명한것이다. 이외에도많은안티 디버깅, 안티디텍션, 정보은닉등의방법이사용되었으며몇가지를열거하면다음과같이 11
표현할수있다. 1 새로메모리에로드되는모듈에대한검사를통해디텍션툴을감지 (Rootkitrevealer, BlackLight, PKDetector, gmer, endoscope, DarkSpy, Anti- Rootkit) 2 Kaspersky 커널방화벽모듈무력화 (klif.sys) 3 안티디텍션 (Anti-Detection) 을위해로드된자체모듈 (lzx32.sys, A.DLL) 에대한 MZ, PE, NewHeader Offset에대한삭제. < 그림11-1 > 참조. < 그림11-1 > 4 안티디버깅을위한 VM-ware, Virtual PC, Softice 감지 (vmscsi.sys, vmx_fb.dll, vmmouse.sys, vmx_svga.sys, siwvid.sys, siwsym.sys, ntice.sys) 5 안티디텍션을위한레지스트리백업및복구 - ZwSaveKey, ZwDeviceIoControlFile에대한서비스호출시, 레지스트리키 HKLM\SYSTEM\CurrentControlSet\Services\PE386 를삭제 / 백업한후, 리턴될때다시복구하는방법으로은닉 12. 결론 이제까지 Rustock.B라불리는커널스팸메일러에대해서분석한결과를설명하였다. 현재 V3 엔진에는안정화문제가남아있어적용되지않았으며, 다만웹페이지에서다운로드가능한전용백신에는진단, 치료가적용되어있다. 완벽하고안정적인진단 / 치료를위해서는아직더많은시간과노력이필요할것으로보인다. 일반사용자들은 Rustock 자체가사용하는중복감염체크방법을이용하면쉽게감염여부를알수있을것도같다. Rustock은차체중복감염을이벤트오브젝트 (Event Object) 를통해서하기때문이다. 12
국내에는현재얼마나많이감염되어있는지보고된바가없다. 회사같은경우는게이트 웨이나라우터를통해서과다한 SMTP 네트워크가사용되면의심할만하다. 개인 PC 사용자 라면웹에서다운로드가능한전용백신으로체크해보는것도좋겠다. 13