루트킷을이용하는악성코드 NCSC-TR050024
M C S 심 층 분 석 1 루트킷을이용하는악성코드 안철수연구소주임연구원 고흥환 1. 개요 루트킷설치는 SunOS, Unix, Linux 등의루트권한을획득하기위한해커들의가장중요한목적이기도하다. 루트킷 이라는이름의유래도바로이러한루트액세스를위한공격에서유래된것이다. 루트킷의시초를보면공격대상의시스템 ( 주로 Unix였다 ) 에대한이더넷패킷의스니핑 1 이었다. 공격대상의시스템에루트킷코드를설치하여 Telnet, FTP 등의패킷을가로채대상시스템의접속아이디와패스워드를획득하는방법을사용하였다. 근래에와서는개인의 PC를대상으로하는윈도우루트킷이등장하였다. 윈도우루트킷코드는단순히루트의권한을획득하기위한것이라기보다는시스템이미지변경과악성코드에대한보호로이어지고있다. 개인 PC에서루트킷의역할은 80~90% 가악성코드 (IRCBot 또는 Backdoor) 에대한프로세스은닉으로나타나고있다. 최근에는소니 CD에포함된불법복사방지기법이루트킷으로작동될수있다고하여, 공개리콜에들어가기도하는등루트킷에대한관심이고조되고있는실정이다. 본글에서는윈도우커널루트킷에한정하여커널단에서의 API 후킹방법과루트킷탐지방법에대해서설명하고끝으로루트킷에대한대응방안에대해논의하고자한다. 2. 루트킷의발전 루트킷 에대한정의를내리자면 일관되게영구적으로시스템에서탐지되지않도록하는코드와프로그램의집합, 공격자가루트권한을획득하기위한작고실용적인프로그램으로구성된집합 이라할수있다. 1. 스니핑 (Sniffing) - Sniff( 냄새를맡다, 코를킁킁거리다 ) 의어원에서유래되어네트워크상의송수신데이터를도청하는행위를말한다. www.ncsc.go.kr 31
M C S 심 층 분 석 1 이러한루트킷에대한보안쟁점은 1994년초기로거슬러올라간다. 당시 CERT/CC(Computer Emergency Response Team/Coordination Center, 카네기멜론대 ), 미 CIAC(Computer Incident Advisory Capability) 에서는여러보안권고문을발표한바있다. CERT/CC Advisory CA-94:01, Ongoing Network Monitoring Attacks, Feb 3, 1994 CERT/CC Advisory CA-95-95:18, Widespread Attacks on Internet Sites, Dec 18, 1995 CIAC Advisory E-09, Network Monitoring Attacks, Feb 3, 1994 CIAC Advisory E-12, Network Monitoring Attacks Update, Mar 18, 1994 윈도우시스템이개인사용자에게보편화되고서버장비의 OS 로도운용되면서자연스럽게루트 킷의공격목표도윈도우로넘어오게되었다. 윈도우시스템은 Unix, Linux와달리 OS 소스코드나중요 API에대해공개를하지않아윈도우가개발된초기에는전체바이러스나악성코드가현저히줄어드는현상도나타났었다. 많은윈도우개발자가등장하고보편화되면서서서히악성코드도증가하게되었으며, 현대의대중적인터넷시스템에서는인터넷웜이중요한문제로대두되고있다. 또한현재의두드러진특징중하나는금전적이득을위한트로이목마의비중이커지고있다는것이다. 80 70 60 50 40 30 20 10 0 도표 1 2002 2003 2004 2005 옆의 [ 도표 1] 은안철수연구소에접수되어 Win-Trojan/Rootkit 으로진단된루트킷의연도별추가사항을그래프로나타낸것이다. 2005년이전에는웜또는트로이목마의진단명을그대로부여하여다소차이가나타날수있으나 2005년현재악성코드에서의루트킷사용증가는두드러지게나타나고있다. 현재루트킷사용증가의주요한특징을보면다음과같다. 1 루트킷을이용한웜 (IRCBot), 트로이목마 (Backdoor) 의증가 2 윈도우커널 SSDT(System Service Descriptor Table) 를후킹하여악성코드의프로세스및파일보호 3 루트킷소스의인터넷공개에따른중국제작의루트킷증가 4 스파이웨어에서의루트킷사용 3. 윈도우커널루트킷 루트킷본래의목적을위해서는안티바이러스나기타스캔도구에탐지되지않아야한다. 이를위해서는항시감시되고있는사용자모드의애플리케이션또는서비스모듈보다커널모드로구성 32 Monthly 사이버시큐리티
루트킷을이용하는악성코드 하는것이휠씬효과적일것이다. 물론몇몇의안티바이러스업체나스캔도구에서커널단에대해서감시를하기시작하였으나그것이널리보편적이지는않다. 그리고커널모드에서의루트킷구성은다양한방법으로시도되고있으며그에따른탐지도쉽지않은실정이다. 커널단의루트킷구성으로성취할수있는것을보면다음과같이나눌수있다. 1 프로세스제어 - 프로세스 / 스레드은닉 2 파일및레지스트리제어 - 파일 / 폴더 / 레지스트리은닉 3 보안변경 - 프로세스의보안설정변경및제거 4 메모리은닉 - 디버거 / 루트킷탐지프로그램에대한데이터은닉 5 네트워크제어 - TDI/TCPIP 드라이버후킹에따른소켓 / 패킷데이터스니핑 6 키보드제어 - 키보드필터에따른키데이터스니핑 커널모드루트킷의제작과동작은사용자모드에서의악성코드제작보다많은노력과시간이소비된다. 이에따른오동작은윈도우시스템의 BSOD(Blue Screen Of Death) 로이어지게마련이다. 그러나루트킷의소스가인터넷에공개되고작은크기의바이너리로시스템을제어할수있는장점으로인하여점점더많은악성코드에서이를악용하는사례가많아지고있는실정이다. 국내에서발견된루트킷의대부분은중국과유럽등에서공개소스를재컴파일하거나약간의수정을한상태로나타나고있다. 이에대한활용도도악성코드프로세스를은닉하는경우가대부분이다. 그러나점진적으로그사용용도에대한확장과동시에다양한기법들이이용될것으로예상되고있다. 4. 전형적인루트킷과트로이목마의연동 [ 그림 1] 트로이목마와의연동 www.ncsc.go.kr 33
M C S 심 층 분 석 1 위 [ 그림 1] 에서는트로이목마와루트킷의기본적인연동관계를그림으로나타낸것이다. 일반사용자는메일, 메신저, 게시판, 자료실등에서실행파일이다운로드되거나기타다른악성코드에의해설치될경우, [ 그림 1] 의왼쪽과같이하나의실행파일형태를이루고있다. 이러한트로이목마가실행될경우에는 [ 그림 1] 의오른쪽과같이사용자모드에서활동하는백도어 (Backdoor) 와커널모드에서활동하는루트킷 (Rootkit) 으로나뉘어시스템을장악하게된다. 설치된루트킷은백도어의프로세스와파일, 네트워크연결에대한은닉과보호를위해커널이미지코드를수정할것이다. 사용자모드의백도어는해커와연결될수있도록 TCP 포트를열고기다리게되며이에따라해커는자유자재로사용자의시스템을드나들수있게된다. 트로이목마로부터루트킷의분리와설치및실행순서를보면다음과같이나타낼수있다. 1 E-mail, 취약점, 파일다운로드등에의한트로이목마 ( 또는웜 ) 의실행 2 트로이목마파일리소스 (Resource) 에위치한루트킷분리 / 생성 - LoadResource, SizeofResource, LockResource, CreateFile 3 루트킷의서비스설치및실행 - Service Control Manager에의한설치 - Undocumented API인 SystemLoadAndCallImage에의한설치 4 트로이목마 / 시스템종료시루트킷서비스 & 파일제거 여기서한가지더살펴볼것은 3 루트킷의서비스설치및실행 에대한문제이다. 윈도우커널드라이버는서비스모듈과마찬가지로서비스로등록및실행된다. 그러나이와같은방법은레지스트리와서비스등록모듈감시로쉽게탐지될소지가있다. 그래서사용되는것이윈도우중요서브시스템인 NTDLL.dll의 Undocumented API이다. NTDLL.dll의 ZwSetSystemInformation의첫번째인자에 SystemLoadAndCallImage 서비스호출로서쉽게루트킷드라이버를시스템에서실행시킬수가있다. 이러한방법에도문제는따른다. 바로 BSOD이다. 실행된루트킷모듈은커널의페이지된메모리 (Paged Memory) 에올라가기때문에사용중이지않을때에는페이지아웃 ( 디스크로저장 ) 되어직접주소호출시문제가발생한다. [ 도표 2] 는 2005년마이크로소프트보안프로그램매니저 Alexey Polyakov의 Windows Rootkits 발표자료에서발취한것으로 SSDT(System Service Dispatch Table) 후킹에의한시스템크레쉬 (Crash) 발생원인의 API를그림으로나타낸것이다. 이후에설명할커널레벨후킹기법에서자세히다루겠으나 SSDT 후킹은현재악성코드에서사용되는루트킷의 80~90% 가사용하고있는기법이다. 34 Monthly 사이버시큐리티
루트킷을이용하는악성코드 Targeted API by groups Acl R/W 13% Stealth 6% Other 9% Registry Access 27% Process Control 45% [ 도표 2] 루트킷에의한시스템오류 API 5. 윈도우커널레벨후킹기법 이번장에서는윈도우커널레벨에서의다양한후킹방법에대해서논의하고자한다. 여러가지방법에대한논의에앞서윈도우시스템에서의사용자모드와커널모드에대한사전지식이필요하다. [ 그림 2] 는윈도우시스템의일반적인시스템서비스호출에대한흐름이다. [ 그림 2] Windows System Service 애플리케이션에서윈도우 API인 WriteFile을사용한경우, Kernel32.dll의 WriteFile이호출되고이는 NTDLL.dll의 NtWriteFile/ZwWriteFile을호출하게된다. 서브시스템인 NTDLL.dll은커널 www.ncsc.go.kr 35
M C S 심 층 분 석 1 단의시스템서비스호출을위해인터럽트 0x2E(Windows 2000) 또는 SYSENTER 2 (Windows XP) 를이용하게되며파라미터인자값으로 EAX 레지스터에서비스번호 / 인덱스, EDX 레지스터에파라미터의주소값을넘겨준다. 커널모드의 Ntoskrnl.exe에서는해당서비스번호 / 인덱스에대한디스패치테이블을참조하여실제서비스루틴의주소를얻어서비스하게된다. NTDLL.dll은 Windows NT/2000/XP/2003 과 OS/2, POSIX 등에대한각각의애플리케이션이공통으로사용될수있도록설계되었으며, Kernel32.dll은윈도우공통라이브러리인 NTDLL.dll을이용하는 Win32용진입단계로볼수있다. 그에반해 User32.dll, Gdi32.dll 3 같은경우는 Windows 만의 API로해당 DLL 자체에서커널단으로서비스호출을할수있도록설계되어있다. 이들의고유서비스는 Win32k.sys에서서비스해준다. 가. SSDT 후킹 SSDT(System Service Dispatch Table) 는서브시스템인 Ntoskrnl.exe가관리하는서비스호출주소테이블구조체이다. 이주소테이블은각서비스의주소를담고있기때문에테이블변조로간단히서비스내용에대한조작이가능하다. [ 그림 3] SSDT 후킹 KeServiceDescriptorTable 함수는 SSDT를참조하는구조체의주소 (KiServiceTable) 와 SSPT(System Service Parameter Table) 의구조체주소를포함하는테이블을얻을수있다. 여기서 SSDT의 4바이트리스트는서비스번호에따른서비스주소값을관리하며, SSPT의 1바이트리스트는해당서비스에대한파라미터바이트수를관리한다. 예를들어, 서비스인덱스 1번에대한서비스는 SSDT의첫번째리스트인 0x804AB3BF 위치에서비스코드가존재하며, 1번서비스에대한파라미터인자크기는 0x18 크기이다. 모든서비스의크기는 KeService 2. Windows XP 이상의 OS에서는 CPU의 IA32_SYSENTER_EIP 레지스터를이용한 Fast Call 방식을이용하여서비스호출을하도록하였다. 3. User32.dll은 Windows의 Message 처리관련, Gdi32.dll은 Windows Graphics Device Interface 관련 API를담당하고있고, 서브시스템 Advapi32.dll은레지스트리관련 API를담당하고있다. 36 Monthly 사이버시큐리티
루트킷을이용하는악성코드 DescriptorTable의 NumberOfService로알수있다. 이에따라 SSDT 서비스테이블의크기가 4바이트 ( 서비스주소값 ) NumberOfService 만큼의크기라는결과가된다. 또다른테이블인 KeServiceDescriptorTableShadow 함수는 User32, Gdi32 서비스에대한서비스참조구조체를관리한다. 이에대한서비스는모두 Win32k.sys에서구현될것이다. 그럼이제악성코드와연결된루트킷에서빈번히사용되는 NtQuerySystemInformation에대해서자세히알아보자. NtQuerySystemInformation 서비스호출은현재시스템의모든프로세스리스트를얻어알려주는기능을한다. 루트킷은이서비스를가로채자신이보호하려는악성코드 ( 트로이목마 ) 의프로세스정보를없애악성코드가돌고있는것을감춘다. 다음의예제코드는 SSDT의 NtQuerySystemInformation 서비스에대한서비스주소변경을가능하게한다. #define SYSTEMSERVICE(_api) KeServiceDescriptorTable.ServiceDescriptor[0].ServiceTable[*(DWORD*)((unsigned char*)_api + 1)] // 원본서비스주소값저장 NtQuerySystemInformation_Origin = (NTQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(NtQuerySystemInformation)); // SSDT 서비스주소를후킹함수주소로수정 (NTQUERYSYSTEMINFORMATION)(SYSTEMSERVICE(NtQuerySystemInformation)) = NtQuerySystemInformation_Hook 변경된서비스주소로인하여해당서비스호출시다음의코드주소가불려지게될것이다. 이후킹된코드에서실제데이터조작을통해악성코드 ( 트로이목마 ) 의프로세스를은닉시킬수있게된다. NTSYSAPI NTSTATUS NTAPI NtQuerySystemInformation_Hook ( ) { Status = NtQuerySystemInformation_Origin( ); if ( Status == STATUS_SUCCESS && SystemInformationClass == SystemProcessAndThreadsInformation ) { 얻어온프로세스정보조작 } return Status; } 결과적으로, [ 그림 4] 는 NtQuerySystemInformation 서비스를통해서받아온프로세스리스트에서트로이목마프로세스에대한리스트연결을다음프로세스로연결시켜줌으로해서프로세스정보를감추게된다. www.ncsc.go.kr 37
M C S 심 층 분 석 1 [ 그림 4] 프로세스은닉기법 나. Interrupt Descriptor Table 후킹 IDT(Interrupt Descriptor Table) 는하드웨어 / 소프트웨어인터럽트에대한주소를관리하며앞서살펴본바와같이커널서비스호출에대한인터럽트 0x2E 또는 SYSENTER를가로채서변경할수있다. IDT는 CPU마다따로관리하므로멀티프로세서환경에서는모든 IDT에대한변경을해주어야하며, 인터럽트특성상한번호출되면그에대한응답이나제어가넘어오지않으므로원본 API에대한결과값변경이나데이터필터링을할수는없으나특정소프트웨어 (PC Firewall 등 ) 의서비스호출을차단하거나알아낼수있다. WIN 2K, Ntdll.DLL 에서의 NtWriteFile 호출에대한시스템코드 MOV EAX, 0EDh LEA EDX, DWORD PTR SS:[ESP+4] INT 2E RETN 24 // EAX 서비스호출인덱스번호 // EDX 스택파라미터주소 WIN XP, Ntdll.DLL 에서의 NtWriteFile 호출에대한시스템코드 MOV EAX, 112h LEA EDX, 7FFE0300h CALL DWORD PTR DS:[EDX] ------ RETN 24 // EAX 서비스호출번호 // EDX 현재의스택주소 MOV EDX, ESP SYSENTER 위에서와같이시스템서비스에대한인터럽트후킹을위해 Windows 2000 이하에서는 INT 0x2E에대한 IDT 변경이필요하다. 다음의예제는그에따른코드이다. 38 Monthly 사이버시큐리티
루트킷을이용하는악성코드 asm { sidt IDTINFO // IDTINFO 구조체를얻는다. }... // INT 0x2E 에대한 IDTENTRY 주소를얻는다. asm { cli // 인터럽트서비스를잠시중단시킨다. lea eax, KiSystemService_Hook // 후킹될모듈의새로운진입점을만든다. mov ebx, Prt_Int2E // INT 2E 에대한진입점을얻는다. mov ebx, ax // INT 2E 호출시, 새로운진입점으로변경한다. shr eax, 16 mov [ebx+6], ax sti // 인터럽트서비스를다시시작한다. } 다음으로는 Windows XP 이상의시스템에서시스템서비스호출에대한 SYSENTER 후킹코드이다. asm { mov ecx, 0x176 rdmsr // IA32_SYSENTER_EIP 값을 eax 로읽어온다. mov SYSENTER_Origin, eax // 원본 SYSENTER 주소를따로저장한다. mov eax, SYSENTER_Hook // 새로운주소로진입점을변경한다. Wrmsr // 변경된주소를 IA32_SYSENTER_EIP 에기록한다. } 다. I/O Request Packet Function 후킹 커널단에서동작하는모든드라이버들은하드웨어또는다른드라이버와의통신을위한 Dispatch Routine을가지고있다. 그리고이러한통신을위해사용되는것이 IRP(I/O Request Packet) 구조체이다. I/O Manager에의해서관리되는 IRP는계층화되어있는드라이버각각에대한 I/O Stack 을구성하여각각의처리에맞는정보를전달하도록하고있다. [ 그림 5] 네트워크드라이버계층도 www.ncsc.go.kr 39
M C S 심 층 분 석 1 윈도우네트워크도마찬가지여서 NDIS Library를이용하는모든네트워크드라이버들도 [ 그림 5] 와같이계층적구조를이루고있다. NDIS 4 Library를이용하여이에대한함수호출만으로데이터를전송하는구조는 Miniport, Protocol 드라이버등이다. 그러나, TDI와 Protocol 드라이버에서는 IRP로데이터를교환한다. 루트킷은이러한 TDI(Tdi.sys) 또는 Protocol(Tcpip.sys) 드라이버의 Device Object로부터 Driver Object 구조체를얻고이구조체내에구성되어있는 Dispatch Routine을가로채서패킷스니핑또는네트워크패킷조작이가능하도록할수있다. 이러한방법이외에도네트워크, 키보드, 파일시스템등과같은계층적구조의드라이버들은윈도우 OS 에서제공하는필터 (Filter) 기능을이용하여자신의드라이버를등록시킬수가있다. 안티바이러스업체나대부분의보안, 모니터링프로그램등에서도이러한방법을이용하여각종서비스를제공한다. 라. Import Address Table 후킹 [ 그림 6] PE 파일의.idata 섹션 모든사용자모드프로그램 ( 애플리케이션 ) 들은시스템의서비스를이용하기위해 OS에서제공하는라이브러리파일을임포트 (Import) 하게된다. 라이브러리파일들은실행가능파일 (PE 파일 ) 5 4. NDIS(Network Driver Interface Specification) Library-MS Windows OS의계층적커널네트워크구조에대한표준인터페이스를제공한다. 5. Portable Executable - Windows 실행파일의구조로실행에필요한정보들과프로그램코드로이루어져있다. 40 Monthly 사이버시큐리티
루트킷을이용하는악성코드 의.idata 6 섹션에자신의익스포트 (Export) 함수에대한정보를담고있으며 IMAGE_ IMPORT_DESCRIPTOR 구조체의 FirstThunk에는 IAT(Import Address Table) 주소를함유하고있다. 이 IAT 구조체의 Import Address를수정하여간단하게후킹할수가있는것이다. 이러한 IAT 후킹방식은사용자모드에서도조작이가능하다. 그러나후킹함수를위치시키는데있어해당프로세스의핸들 (Handle) 을여는방식은안티바이러스제품이나기타탐지모듈에있어발견되기쉬운단점이존재한다. 이것을커널모드에서작성하여그에따른탐지를어렵게할수있다. 이에대한설명은다음과같다. PsSetImageLoadNotifyRoutine ( IN PLOAD_IMAGE_NOTIFY_ROUTINE NotifyRoutine ); VOID (*PLOAD_IMAGE_NOTIFY_ROUTINE)(IN PUNICODE_STRING FullImageName, IN HANDLE ProcessId, IN PIMAGE_INFO ImageInfo ); PsSetImageLoadNotifyRoutine은커널모드 Callback API 함수이다. 새로운프로세스, DLL 등이메모리에적재될경우에이 Callback 함수가호출될것이다. Callback 함수의파라미터인자에는로드된파일이름, 생성된프로세스 ID 그리고 IMAGE_INFO 구조체가존재한다. 이 IMAGE_INFO 구조체의정보에는 PE 파일의이미지주소가참조되어있기때문에쉽게 IMAGE_IMPORT_DESCRIPTOR의위치를찾아낼수있으며, 그에따라 IAT 위치도알수있다. 문제는실제후킹한모듈을어디에위치시키느냐가된다. 모든프로세스가참조할수있는사용자모드의메모리영역에존재하여야하지만해당프로세스영역에작성한다는것은위험이따른다. 그리하여 KUSER_SHARED_DATA라고명명된메모리영역을이용한다. 이영역은커널단에서는 0xFFDF0000 주소로, 사용자영역에서는 0x7FFE0000 주소로참조가능한물리적페이지메모리영역이며, 4 Kbyte의영역중 1 Kbyte만을시스템이사용중이므로나머지 3 Kbyte의공간이비어있다. 마. Inline Function (Detour Patch) 후킹크렉에서사용하는방법과유사하게어셈블된코드상에서함수의시작일정코드를자신의루트킷코드가존재하는주소로강제점프하여실행되도록하고본래의위치로다시점프되도록하는리버스엔지니어링 (Reverse Engineering) 기법이다. 6. 실행에필요한 DLL 의함수나변수에대한임포트정보로구성된 PE 파일의임포트섹션 www.ncsc.go.kr 41
M C S 심 층 분 석 1 [ 그림 7] Inline Function Hook [ 그림 7] 은 Detour Patch 방식을나타낸그림이다. 루트킷코드로제어권을넘겨받기위해원본코드의시작부분에서 FAR JMP 08:XXXXXXXX 해야만한다. FAR JMP 코드는 7 Byte면되지만위그림에서는 9 Byte를변경했다. 7 Byte만을 JMP 코드로변경한다면원본함수어셈블리코드의정렬 (Alignment) 이깨져 BSOD이발생될것이기때문이다. 7 Byte의 FAR JMP 변경과나머지 2 Byte에대한 NOP 7 Instruction을구성한것이중요포인트라할수있다. FAR JMP에의해루트킷코드를이행하고나서는제거된 9 Byte의원본시작코드를수행해주어야한다. 이는원본함수 9 Byte 이후로다시 FAR JMP 되기때문이며, 이로인해원본코드가문제없이수행된다. 바. Direct Kernel Object Manipulation 윈도우커널레벨의 Object Manager는시스템을구성하는다양한오브젝트객체에대한정보를관리한다. Device, Driver, EProcess, EThread등과같은오브젝트의정보를직접적으로수정함으로써후킹방식보다더탐지하기어려운루트킷을구성할수가있다. 이렇게커널의오브젝트를조작하는방식을 DKOM(Direct Kernel Object Manipulation) 이라한다. [ 그림 8] I 프로세스와스레드가연결된데이터구조 7. NOP Instruction 은어떠한처리도하지않는 1Byte CPU 명령코드이다. 42 Monthly 사이버시큐리티
루트킷을이용하는악성코드 커널단에서는 EPROCESS라는구조체를하나의객체로관리하며각각의 EPROCESS 구조체는서로이중연결리스트로연결되어있다. 이에반해사용자모드에서는 PEB(Process Environment Block) 이라하여사용자모드에서수정되는데이터정보를포함한다. 커널단에서관리되는 EPROCESS 구조체의정보를획득하여연결리스트를조작한다면시스템정보에서는조작된 EPROCESS를참조하지못하여해당프로세스 ( 트로이목마 ) 가존재하지않는것처럼만들수있을것이다. [ 그림 9] 은닉하려는대상프로세스의구조체를구하기위해서 PsGetCurrentProcess를이용할수있는데실제적으로 PsGetCurrentProcess는 IoGetCurrentProcess를호출한다. 다음의코드는 PsGetCurrentProcess를호출한상태에서디어셈블한결과이다. Ntoskrnl!IoGetCurrentProcess 0008:804ED364 MOV EAX, FS:[00000124] 0008:804ED36A MOV EAX, [EAX + 44] 0008:804ED36D RET FS 레지스터로부터 0x124번째의위치에는 ETHREAD에대한주소가위치하며, ETHREAD의 0x44의위치가바로현재 EPROCESS 구조체의주소값이된다. 구해진 EPROCESS 연결리스트링크주소를다음의 EPROCESS 링크주소로변경하여대상프로세스를은닉할수있게된다. 그러나, 윈도우 NT/2000/XP/XP SP2/2003 OS 마다 EPROCESS 구조체에위치한 Process ID와연결리스트위치가다르기때문에루트킷은디바이스초기화때해당 OS의버전정보를구해야할필요가있다. www.ncsc.go.kr 43
M C S 심 층 분 석 1 윈도우의버전정보는다음과같은레지스트리정보에서얻을수있으며, HKLM SOFTWARE Microsoft WindowsNT CurrentVersion CSDVersion HKLM SOFTWARE Microsoft WindowsNT CurrentVersion CurrentBuildNumber HKLM SOFTWARE Microsoft WindowsNT CurrentVersion CurrentVersion 커널 API인 PsGetVersion 또는 RtlGetVersion을통해서도알수있다. [ 그림 10] Offsets to the PID and FLINK within the EPROCESS Block 6. 루트킷탐지방법 후킹을이용한루트킷의탐지방법은오히려간단할수있다. 후킹된 API가존재하는모듈의메모리위치시작주소와크기를구하여 API가해당모듈의메모리영역내에존재하는지를비교하면된다. 또한어떤모듈이후킹을하였는가에대해서도같은방법으로찾을수있다. [ 그림 11] Softice 를사용한루트킷디버깅 [ 그림 11] 은커널디버거인 Softice를이용하여 SSDT 후킹에대한루트킷디버깅과정을나타내고있다. 붉은라인의코드부분이바로 SSDT의서비스 API인 ZwQuerySystemInformation에대한주소를루트킷자신의모듈주소로바꿔후킹하는부분이며, 메모리 0023:F8C698D8 8 (ZwQuerySystemInformation 서비스콜 ) 부분의 4 Byte 주소가루트킷모듈 (hideprocess) 의 8. 해당주소는 System Service Descriptor Table 의 Index 0xAD 번째 ZwQuerySystemInformation 서비스주소이다. 44 Monthly 사이버시큐리티
루트킷을이용하는악성코드 F8C72000 ~ F8C72A80 주소내로변경된것을확인할수가있다. 여러가지방식으로은닉된악성코드의실행프로세스를찾기위한방법으로는시스템프로세스인 CSRSS.exe의 HANDLE_TABLE을이용하여전체프로세스리스트를찾을수있는방법이있으나이또한 DKOM(Direct Kernel Object Manipulation) 방식으로은닉된프로세스는찾기어렵다. 마지막으로사용할수있는방법은 Thread Scheduling을이용하여 Dispatcher Ready Queue 에서대기중인 Thread를얻어오면이 Thread를통해 EPROCESS 구조체정보를획득할수있으므로은닉된실행프로세스의존재를확인할수있다. 이 Dispatcher Ready Queue의구조체정보는 KiDispatcherReadyListHead 9 에존재한다. 7. 향후전망 지금까지윈도우루트킷에대한다양한방식과트로이목마와의연동그리고이러한루트킷의탐지방법에대해서논의해보았다. 온라인상으로도다양한소스가공개되어있는현재실정에서루트킷에대한악용의소지는날로증가할예정이다. 글을작성하는지금이시간에도다양한루트킷이접수되고있으며온라인게임에대한트로이목마에서도활용되고있는실정이다. 최근들어루트킷을탐지하는여러소프트웨어도선보이고있으며, 안티바이러스업체에서도루트킷에대한탐지및제거에대한연구가계속되고있고그에따른결과물도속속나오고있다. 이에반해안티디버깅과암호화, 실행압축, 새로운방식의시스템커널이미지변경등날로발전해가는악성코드에대해보안을담당하고있는기관, 기업체등에서도이에대한대비를철저히준비하여야할것이다. Reference 1. ROOTKITS Greg Hoglund, James Butler 2. Inside Windows 2000 (Third Edition) David A.Solomon, Mark E.Russinovich 3. Windows Internals (Fourth Edition) David A.Solomon, Mark E.Russinovich 4. Windows Driver Model (Second Edition) Walter Oney 5. API 로배우는 Windows 구조와원리 야스무로히로카즈 6. Exploiting Software Grag Hoglund, Gary McGraw 7. www.rootkit.com 8. www.pcausa.com 9. www.sysinternals.com 10. Windows Rootkits PPT (MS 보안기술발표자료 ) Alexey Polyakov 11. http://www.cs.wright.edu/people/faculty/pmateti/courses/499/fortification/obrien.html 12. http://packetstorm.security-guide.de/hitb04/hitb04-chew-keong-tan.pdf 13. http://invisiblethings.org/papers/itunderground2004_win_rtks_detection.ppt 9. KiDispatcherReadyListHead 는 32 개의 List 로구성된대기중인 Thread Priority Queue 로이루어져있다. www.ncsc.go.kr 45