보안 이슈

AhnLab 보안 전문가의 심층분석! 보안 이슈 정보를 전해드립니다.

[Threat Analysis] MBR 감염시키는 '공포의 부트킷' 등장

  • Facebook에 공유하실 수
    있습니다.

  • Twitter에 공유하실 수
    있습니다.

  • Linked in

    Linked in에 공유하실 수
    있습니다.

  • 붙여넣기

    블로그나 게시판에 붙여넣기 하실
    수 있습니다.

  • 안철수연구소
  • 2011-06-03

스미트닐 부트킷 분석 정보

7•7 DDoS 공격, 3•4 DDoS 공격, 농협 사태에서 공통적으로 등장하는 단어가 있다. 바로 마스터부트레코드(Master Boot Record, 이하 MBR)이다. 이들 사건을 비롯해 최근 발생한 사이버 공격에서는 MBR 영역을 파괴해 하드디스크 데이터를 못 쓰게 만드는 기능, 이른바 ‘하드디스크 파괴’ 기능을 포함하고 있다. 더욱이 최근에는 MBR 감염을 타깃으로 한 부트킷류까지 등장했다. 다행히도 이 부트킷에 의한 피해 사례는 아직 발생하지 않았다. 하지만 MBR의 특성상 진단/치료가 어렵기 때문에 감염되지 않도록 각별한 주의가 요구된다.
이 글에서는 MBR 부트킷의 일종인 스미트닐 부트킷(Smitnyl Bootkit)에 대해 자세히 알아보고자 한다.


마스터부트레코드(Master Boot Record, 이하 MBR)에는 운영체계가 어디에 어떻게 자리 잡고 있는지를 식별하여 컴퓨터의 주기억장치에 적재될 수 있도록 하기 위한 정보들이 있으며, 하드디스크의 첫 번째 섹터에 저장되어 있다. 이런 MBR을 감염시키는 경우는 PE(Portable Executable) 파일을 감염시키는 경우보다 흔하게 발견되지는 않았다. 왜냐하면 MBR은 복잡하고 크기 또한 제한적이라 이를 타깃으로 한 악성코드 제작 자체가 힘들기 때문이다.
하지만 최근에는 이런 MBR을 감염시키는 스미트닐 부트킷(Smitnyl Bootkit, 이하 스미트닐)이 발견되었다. 이 스미트닐은 다양한 악성코드를 다운로드해서 실행하는 다운로더로서 역할을 하고 있는 것으로 보인다. 다만, 다른 다운로더류의 악성코드들과 다른 점은 부트 섹터를 감염시킴으로써 백신 업체들이 진단/치료를 하기 어렵게 한다.
스미트닐은 아직 국내에 피해 사례는 보고되지 않고 있다. 하지만 이 다운로더가 어떠한 목적의 악성코드를 다운로드 받느냐에 따라 개인정보 탈취, 시스템 손상 등 다양한 피해를 입힐 수 있다. 이 스미트닐은 무료 파일 공유 네트워크를 통해 확산된 것으로 추정된다.


부트킷(Bootkit) 정의


부트킷이란 컴퓨터 하드디스크의 부트 섹터(Boot Sector)를 감염시키는 악성코드의 일종이다.
부트 섹터는 컴퓨터 프로그램이 제일 먼저 실행되는 부분으로 이 부트킷에 감염되면 정상적인 부팅과정을 거치지 않고 부트킷에 의한 부팅동작을 하게 된다.


1. 시스템의 감염 및 증상


스미트닐은 MBR과 섹터들에 감염 데이터를 저장한다. 그리고 재부팅시에 정상 userinit.exe 또한 감염시켜서 최종적으로는 특정 사이트에서 파일을 내려받아 실행하는 동작을 수행한다. [그림 1-1]과 [그림 1-2]를 보면 감염 전 후에 변화된 MBR의 상태를 확인할 수 있다.

[그림 1-1] 감염 전 원본 MBR                                    [그림 1-2]  감염 후 MBR
 

대부분의 감염 동작을 하는 메인 드롭퍼(Dropper/Smitnyl.37076)의 파일 구조는 [그림 2]와 같다. 메인 드롭퍼에는 MBR과 각 섹터, 그리고 정상 userinit.exe을 감염시키기 위한 페이로드들을 리소스 영역에 각각 저장하고 있다. 또한 다운로더도 인코딩되어 2개의 리소스 영역으로 나누어져서 저장되어 있다.

 


[그림 2] 메인 드롭퍼의 파일 포맷


[그림 2]에서 볼 수 있듯이 메인 드롭퍼는 원하는 동작을 위한 데이터를 리소스 영역에 저장해 둔 것을 알 수 있다. 이렇게 저장해 둔 리소스 영역의 데이터를 로드하면서 감염 동작을 수행해 나가는데 그 동작들을 차례대로 살펴보면 다음과 같다.


① 원본 MBR을 5번 섹터에 저장
② 리소스영역(Name=’71’)에서 userinit.exe infector payload를 로드해서 39번 섹터에 저장
③ 리소스영역(Name=’72’)에서 인코딩된 데이터를 로드해서 45번 섹터에 저장
④ 리소스영역(Name=’6E’)에서 인코딩된 데이터를 로드해서 46번 섹터에 저장
 45, 46번 섹터에 저장된 데이터들을 0x7F을 값으로 XOR 연산을 하면 Downloader 기능을 하는 하나의 실행 파일이 생성됨
⑤ 리소스영역(Name=’70’)에서 ‘0x200(512byte)’ 만큼의 데이터를 읽어서 MBR에 덮어씀
⑥ 리소스영역(Name=’70’)에서 ‘0x200(512byte)’ 이후의 데이터(MBR 파일 시스템 Infector Routine)를 읽어서 32번 섹터에 저장


이렇게 각 섹터에 저장된 데이터들은 내려받기 등의 기능을 위한 파일을 생성할 때나 부팅 시에 정상 userinit.exe를 감염시키는데 사용된다. 이렇게 MBR 감염을 통해 윈도우 시스템 파일인 userinit.exe를 감염시키는 이유는 안티바이러스 제품들이 감염 여부를 쉽게 파악할 수 없게 하고, 윈도우의 WFP(Windows File Protection)를 우회하기 위한 것으로 볼 수 있다.


2. 각 모듈별 주요 특징과 기능


2.1 메인 드롭퍼 (Dropper/Smitnyl.37076)


메인 드롭퍼(진단명 Dropper/Smitnyl.37076)의 주요 동작은 [그림 3]과 같다. 먼저 중국산 하드디스크 모니터링 도구인 HDDGMON.exe와 DF5Serv.exe가 시스템에서 실행되고 있는지 확인하고 실행 중이라면 리소스에서 ‘Name=6F’로 검색/로드한 후 pcidump.sys, beep.sys, DeviceCutter.sys 등 3가지 파일명으로 저장한다. 이때 3가지 파일명 중 특정 조건에 맞는 파일명을 선택하여 1가지 파일명으로 저장된다. 그리고 각 파일명의 서비스를 등록한다.

 

 
[그림3] 메인 드롭퍼의 주요 동작


이후의 대부분 동작은 리소스에 있는 데이터들을 MBR, userinit.exe 감염 및 특정 섹터들에 저장시키기 위해 메모리에 로드한다. 이 과정이 완료되면 메인 드롭퍼는 자신을 삭제하고 동작을 끝낸다.


A. 윈도우 파일 보호 우회


SFC.dll 파일은 시스템 파일 체커(System File Checker) 기능을 하는 윈도우 시스템 파일로 ‘%SYSTEM%’ 폴더에 저장되어 있다. 메인 드롭퍼는 ‘%SYSTEM%’ 폴더에 자신이 원하는 파일을 생성하기 위해 SFC.dll 파일의 5번째 함수인 ‘sfcFileException’ 함수를 이용해서 윈도우 파일 보호를 우회한다.

 

[그림 4] SFC.dll _ sfcFileException 함수를 이용한 파일 보호 우회

 

B. 정상 MBR 백업


MBR을 감염시키기 위해 가장 먼저 정상 MBR을 5번 섹터에 백업해 놓는데 그 방법은 먼저 CreateFileA API에 Filename 파라미터로 ‘\\.\PHYSICALDRIVE0’를 줘서 512바이트(byte)인 MBR을 읽어서 스택에 저장해 놓는다.
 

 

[그림 5] 512byte의 정상 MBR을 스택에 저장


SetFilePointer API를 이용해서 파일 포인터를 5번 섹터로 이동하고 ‘(0xA00 = 2560, 2560/512 = 5(번 섹터))’ 스택에 저장해 놓았던 512byte의 원본 MBR을 덮어쓴다.

 

[그림 6] 512byte의 정상 MBR을 5번 섹터에 백업 

 

C. 리소스 영역의 데이터 로드


앞서 설명했듯이 메인 드롭퍼의 주요 동작은 리소스 영역에서 데이터들을 로드하고 각 섹터에 저장 및 파일로 생성하는 것이다. 데이터를 로드하는 방법은 대부분 비슷하다. 대표적으로 ‘0x71’ 이름의 리소스를 39번 섹터에 저장시키는 방법을 알아보자.
먼저 FileResourceA API를 이용해 파일 내의 리소스 영역에서 ‘Type = ‘RES’, Name = ‘71’’ 조건에 해당하는 데이터(Size=0xA00, Address=0x00407050)를 찾아서 로드한다. 그리고 SetFilePointer API를 이용해서 파일포인터를 39번 섹터로 이동하고 ‘(0x4E00 = 19968, 19968/512 = 39(번 섹터))’에 로드해놓은 0x00407050에 있는 0xA00 만큼의 데이터를 저장한다. 이때, WriteFile API를 사용하여 ‘512byte(0x200)’씩 쓰기 때문에 0xA00을 다 쓰기 위해서는 다섯 번을 반복한다.

 

[그림 7] Type = ‘RES’, Name = ‘71’ 리소스 데이터를 39번 섹터에 저장


D. 정상 MBR 감염


FileResourceA API를 이용해 파일 내의 리소스 영역에서 Type = ‘RES’, Name = ‘70’ 인 조건에 해당하는 데이터(Size=0xF2A, Address=0x00406120)를 찾아서 로드하고 처음 512바이트를 정상 MBR 영역에 덮어쓴다.

 

[그림 8] 정상 MBR영역에 데이터를 덮어쓰는 과정


E. 메인 드롭퍼 자기 삭제
메인 드롭퍼는 ‘cmd /c del %Main Dropper 폴더%\MainDropper.exe > nul’ 명령어를 실행시켜서 자신을 삭제한다.

 

[그림 9] 메인 드롭퍼의 자기 삭제 루틴


2.2 감염된 ‘userinit.exe’ (Win-Trojan/Agent.25600.YE)


메인 드롭퍼의 리소스 영역에 ‘71’ 이름으로 저장된 데이터는 39번 섹터에 덮어씌우고 재부팅시 정상 userinit.exe에 또다시 덮어씌운다. 주요 동작은 [그림 10]과 같이 45번 섹터에 저장되어 있는 인코딩된 데이터를 디코딩해서 실행시킨다. 그 외에는 360Safe가 존재하면 360safe IE Protection을 종료시키고 임시 폴더(%Temp%)에 가짜 explorer.exe를 생성해서 디코딩한 45번 섹터의 내용을 씌운다. 그리고 정상 explorer.exe를 실행시켜서 explorer.exe의 실행이 정상적으로 된 것처럼 사용자를 속인다.

 

[그림 10] 39번에 저장되어 있는 userinit.exe 감염 코드의 동작


A. 360Safe IE Protection 종료

감염된 ‘userinit.exe’는 윈도우 함수인 RegOpenKeyExA API를 사용하여 ‘HKEY_LOCAL_MACHINE\SOFTWARE\360Safe\safemon’ 레지스트리를 확인해서 존재하면 ‘IEProtAccess’, ‘IEProtNotify’ 값을 ‘0’으로 설정하여 360Safe IE 프로텍션(Protection)을 종료한다. 참고로 360Safe IE 프로텍션은 중국산 백신 관련 제품이다.

 

[그림 11] 360Safe IE Protection 종료


B. 가짜 explorer.exe 생성 및 실행


감염된 ‘userinit.exe’는 가짜 explorer.exe를 저장하기 위해 임시 폴더 경로를 얻어 온 후에 45번 섹터로 접근해서 인코딩 데이터를 디코딩한다. 이후 임시 폴더 경로에 explorer.exe라는 파일명으로 가짜 파일을 생성 및 실행한다. 또한 이 과정에서 가짜 파일이 정상적으로 실행된 것으로 보이게 하기 위해 실제 정상 explorer.exe도 동시에 실행시킨다. 이 중 디코딩 과정은 45번 섹터에서 512바이트를 읽어서 스택에 저장한 후 ‘7F’로 XOR 연산을 한다. 그리고 ‘MZ’, ‘PE’ 시그니처는 ‘4D5A’, ‘5045’으로 직접 보정한 후 가짜 explorer.exe에 덮어씌운다. 감염된 ‘userinit.exe’ 내에는 이 과정이 9번 실행되도록 하는 조건이 설정되어 있다.

  

 
[그림 12] 디코딩 루틴과 파일 변화


2.3 가짜 explorer.exe (Win-Trojan/Pincav.4608.AT)


메인 드롭퍼의 리소스 영역에 ‘72’ 이름과 ‘6E’ 이름으로 저장된 인코딩된 데이터는 45번과 46번 섹터에 덮어씌워진다. 이 인코딩된 데이터는 앞의 39번 섹터에 저장된 루틴에 의해 디코딩 후 가짜 explorer.exe로 생성되어 실행되고 [그림 13]과 같이 IEXPLORE.EXE에 인젝션되어 내려 받기 기능을 수행한다.
 

[그림 13] 가짜 explorer.exe의 동작


A. ‘Hidden’ 속성으로 IEXPLORE.EXE 실행 후 자신을 인젝션


먼저 ‘c:\program files\Internet Explorer\IEXPLORE.EXE’ 경로를 얻어와서 WinExec API를 이용해 ‘Hidden’ 속성으로 IEXPLORE.EXE를 실행한다. 그리고 VirtualAllocEx API로 실행 중인 IEXPLORE.EXE에 가상메모리 공간을 확보한 후 WriteProcessMemory API를 통해 자신을 인젝션한다.

 
 

[그림 14] IEXPLORE.EXE 실행 및 인젝션

 


B. 파일 내려받기 및 실행


‘CreateRemoteThread’를 통해 인젝션된 코드를 실행하고 ‘http://sb.perfectexe.com/cs.gif’를 내려받아 ‘C:\2008.exe’로 저장하고 실행한다.

 


 [그림 15] 파일 다운로드 및 실행


3. 감염된 MBR의 동작


정상 MBR의 주요 동작은 파티션 테이블에서 부팅 가능한 파티션을 찾아 해당 파티션의 부트 섹터를 호출해주는 역할을 한다. 반면 감염된 시스템의 MBR은 이런 동작 외에도 정상 userinit.exe를 감염시키기 위해 BOOT.INI 파일과 ‘WINDOWS’, ‘SYSTEM32’ 디렉터리 정보를 얻고 39번 섹터에서 감염하고자 하는 데이터를 읽어 정상 userinit.exe를 감염시킨다.


[그림 16] 정상 MBR 동작(左)과 감염된 MBR의 동작(右)


감염된 MBR의 코드 루틴을 보면 악성코드 제작자가 MBR의 구조뿐만 아니라 FAT와 NTFS 파일 시스템의 구조 또한 모두 파악하여 부트레코드의 값들과 MFT(Master File Table)의 헤더값, 속성값들을 이용해서 필요한 데이터들을 얻어 오는 것을 확인할 수 있다. 이렇게 획득한 데이터를 이용해서 최종적으로 userinit.exe에 대한 정보를 얻고 미리 39번 섹터에 저장해 놓은 페이로드(Payload)를 읽어와서 정상 userinit.exe에 덮어쓴다.
이렇게 감염된 userinit.exe와 정상 userinit.exe를 구분하는 간단한 방법은 파일의 등록 정보를 확인해 보는 것이다. 정상 파일에는 버전 등의 정보가 정확히 나타나고 있지만 감염된 파일에는 이러한 버전 정보들을 찾을 수가 없다. 그리고 헥스 뷰(Hex view) 도구를 통해 로우 데이터(raw data)를 보게 되면 감염된 파일의 0x28 오프셋에 ‘55 AA’ 시그니처가 있는 것을 확인할 수 있다. 이 시그니처는 실제 악의적인 코드 내에서 감염 여부를 확인하기 위해 사용된다.

 

 
[그림 17] 정상 userinit.exe와 감염된 userinit.exe 비교


A. 정상 userinit.exe 감염


감염된 MBR의 마지막 동작은 [그림 18]와 같이 파일의 속성을 확인하고 읽어야 할 섹터의 시작위치와 개수를 얻은 뒤에 ‘Extended Write Function (AH = 43h)’을 사용하여 39번 섹터에 저장된 데이터를 메모리 ‘0x8C00’ 영역으로 읽어오고 제대로 읽었는지 확인하기 위해 시그니처 값 ‘0xAA55’를 비교한다.

 

[그림 18] 감염된 MBR 내의 정상 userinit.exe 감염 루틴


4. 결론


악성코드 제작자들의 지능적인 공격이 날고 거세지고 있다. 초기 악성코드 제작자들은 애플리케이션 레벨을 공격하는 악성코드를 제작해왔다. 이후 루트킷으로 대표되는 커널 레벨을 이용한 공격이 주류를 이루고 있다. 여기에 더해 최근에는 MBR을 노리는 공격으로까지 진화하고 있다.


스미트닐 부트킷과 같이 MBR을 감염시키는 경우에는 윈도우 시스템 파일에 대한 손상 때문에 진단/치료 자체가 매우 까다롭다. 아직 국내에서 감염에 의한 피해 보고가 적지만 오히려 감염 여부도 알지 못하는 경우가 많을 수도 있다. 이렇게 감염 여부를 확인하기가 어렵기 때문에 많은 악성코드 제작자가 매력을 느끼기에 충분하다. 만약 이러한 부트킷이 확산이 된다면 안티바이러스 업체들은 진단/치료에 더욱 어려움을 겪게 될 것이다. 따라서 이러한 부트킷에 감염되지 않도록 PC 사용에 주의하는 것이 매우 중요하다.
안철수연구소는 스미트닐 부트킷 전용 백신을 제작하여 이를 진단/치료하고 있다.
전용백신에서는 부트킷에 의해 감염된 MBR의 특정 바이너리 영역(약 10바이트)을 시그니처로 잡고 부트킷 분석을 통해 다른 섹터에 백업되어 있는 정상 MBR을 찾는다.  그리고 백업되어 있는 정상 MBR을 감염된 MBR에 덮어씌워서 치료를 하게 된다. 이 과정에서 감염된 것으로 보이는 MBR과 백업되어 있는 정상 MBR을 비교하는데 이유는, 두 섹터가 같다면 이미 치료가 완료되었다는 것이므로 더 이상 진단/치료 과정을 거치지 않기 위함이다.
현재 발견된 스미트닐 부트킷의 경우는 내부에 중국산 하드웨어 모니터링 툴의 존재를 확인하고 중국 안티바이러스 업체인 ‘360Safe’의 프로그램 실행을 방해한다. 이러한 점을 고려해 봤을 때 이 부트킷은 중국 해커들에 의해서 제작/배포된 것으로 보인다. 이에 대해 해킹 관련한 중국 온라인 사이트나 커뮤니티에 대한 모니터링을 통해서 관련한 정보들을 얻을 수 있을 것이다. 또한 이를 바탕으로 부트킷 진단/치료 방법이 지속적으로 추가될 것으로 기대한다. @

  • 안철수연구소 로고
  • 안철수연구소 ASEC 분석1팀 이현목

보안정보의 저작권은 저자 및 ㈜AhnLab에 있으므로 무단 도용 및 배포를 금합니다.

  • Facebook에 공유하실 수
    있습니다.

  • Twitter에 공유하실 수
    있습니다.

  • Linked in

    Linked in에 공유하실 수
    있습니다.

  • 붙여넣기

    블로그나 게시판에 붙여넣기 하실
    수 있습니다.

지금 마케팅 안내 수신 동의하고
선물 받아가세요!

이벤트 내용 더 보기
세미나/제품/이벤트 안내

더 알아보기

개인정보 수집 및 이용 동의서

선물 발송을 위해 아래와 같이 개인정보를 수집 및 사용합니다.
동의를 거부할 수 있으나, 동의 거부 시 이벤트 참여가 불가능 합니다.

  1. ㆍ수집 항목 : 이름, 휴대전화번호
  2. ㆍ수집 목적 : 참여자 중복 확인, 공지 발송, 경품 발송
  3. ㆍ보유기간 : 이벤트 종료 후 지체 없이 파기(단, 당첨자의 경우 경품 배송 후 30일)
  4. ㆍ경품 발송 위탁: 쿠프마케팅 (모바일상품권 발송업체)
참여하기
닫기