윈도우 7에서 지원하는 가상화 기법에 대해서는 이미 살펴보았다(http://forensic-proof.com/archives/1969).  가상화 기법을 사용하는 윈도우 7 시스템에서 포렌식 분석을 위해 알아야 할 내용에 대해 알아보자. 먼저, 윈도우 7의 가상화 기법의 중심에는 VHD(Virtual Hard Disk) 파일이 있다. 따라서, 가상화 기법을 분석을 위한 작업은 VHD 파일을 분석하기 위한 작업이라고 할 수 있다.
 
 


1. VHD 마운트 (Mounting VHD Files)

VHD 파일은 윈도우 7의 가상화를 가능하게 해주는 가상 하드 디스크 파일이다. 윈도우 7의 모든 가상화 기법에는 VHD 파일이 사용된다. VHD 파일의 명세는 다음에서 다운 받을 수 있다. 하지만 기본적인 내용만 공개하고 있을 뿐이다.http://www.microsoft.com/download/en/details.aspx?id=23850

VHD 파일 포맷을 상세하게 분석하는 일도 의미있을 수 있지만, 이미 많은 도구에서 마운트를 지원하고 있기 때문에 알려진 마운트 방법을 사용하는 것이 현명하다. VHD를 마운트 하는 방법에는 윈도우 7의 자체적인 마운트 기능을 사용하거나 마운트 전용 도구 또는 포렌식 도구를 사용할 수도 있다.
 
1) 윈도우 운영체제의 마운트 기능 사용하기

먼저 윈도우의 기능을 이용하여 VHD를 별도의 볼륨에 마운트 할 수 있다. 앞서 VHD를 생성하는 방법에 대해서 살펴본 적이 있다. “제어판 => 관리도구 => 컴퓨터 관리 => 디스크 관리”에서 가능하다.

create_vhd.png

“VHD 연결” 메뉴 선택하면 다음의 화면이 나온다. 위치에서 VHD 파일이 위치한 경로를 선택한 후 확인을 누르면 자동으로 시스템에 마운트가 된다. 보통 VHD 파일은 “.vhd” 를 확장자로 가지고 있다. 하지만 확장자에 대한 체크를 하지 않기 때문에 확장자가 다르거나 없어도 정상적인 VHD 파일이라면 마운트가 된다.

vhd_mount_readonly.png

한가지 주목할 점은 “읽기 전용” 마운트 기능이 있다는 것이다. 이것은 포렌식적으로 매우 중요한 기능이다. 별도의 포렌식 도구를 이용하지 않아도 “읽기 전용”으로 마운트 한 후 마운트된 볼륨을 조사할 수 있기 때문이다. 이와 같이 운영체제에 마운트를 한 후 분석할 때의 이점은 분석이 하나의 도구에 종속적이지 않다는 점이다. 다양한 도구를 이용해 쉽게 분석이 가능하기 때문이다. 실제 “읽기 전용” 기능을 통해 마운트를 수행한 후 해쉬(Hash) 값을 계산해 본 결과 마운트하기 이전과 이후의 차이가 없었다. VHD 마운트를 지원하지 않는 도구를 사용한다면 이 기능은 많은 도움이 될 것이다.

하지만 이 기능은 윈도우 7 시스템에서만 가능하다는 단점이 있다. 그렇다고 실망할 필요는 없다. 윈도우 7 이하의 운영체제에서는 Microsoft Virtual Server 2005 R2 SP1을 설치하면 된다. 해당 도구를 설치하면 VHDMount.exe라는 도구가 함께 설치된다. 이 도구를 이용하면 윈도우 7 시스템이 아닌 시스템에서도 VHD 마운트가 가능하다.
 
2) 마운트 전용 도구 사용하기

포렌식 분석을 수행하다보면 이미지를 포렌식 도구에 마운트하지 않고 운영체제의 볼륨에 마운트할 경우가 있다. 이 경우 이미지를 전용으로 마운트 해주는 도구를 이용하게 되는데 이런 도구에서도 VHD 마운트 기능을 제공한다. 대표적인 도구가 “Mount Image Pro“와 WinMount” 라는 도구이다.

“Mount Image Pro”는 GetData에서 개발한 도구로 4.x 버전부터 VHD 이미지 파일을 지원하고 있다. VHD 이외에도 다양한 포렌식 이미지(DD, .E01, .L01, .AFF, .ISO. VMWare, Apple DMG 등)를 지원한다. 개인적으로도 안정성과 성능이 좋아 많이 사용하고 있는 도구이다. “WinMount” 도구는 포렌식 이미지를 전용으로 지원하는 도구는 아니지만 다양한 압축파일, CD/DVD 이미지 형식, 그리고 가상화 소프트웨어 디스크 파일을 지원한다.
 
3) 포렌식 도구 사용하기

포렌식 도구에서도 자동으로 VHD 를 마운트할 수 있는 기능을 지원한다. 마운트 전용 도구는 도구에서 이미지를 해석하기 보다는 윈도우의 드라이버에 인식시켜주기 위한 작업만을 수행한다. 따라서, 윈도우에서 관련 이미지를 해석하는 라이브러리가 있을 경우 이용만 하면 된다. 하지만 포렌식 도구는 응용프로그램 자체적으로 가상 마운트를 지원하기 때문에 포맷을 해석해야 할 것이다. VHD를 인식할 수 있는 도구는 FTK(FTK Imager 포함)가 있다.
 
 


2. VHD 파일 포맷 (VHD File Format)

VHD 파일을 열어보면 구조가 디스크 구조가 실제 물리 디스크 구조와 큰 차이가 없는 걸 알 수 있을 것이다. MBR(GPT) 이후로 BR(Boot Record)와 MFT 엔트리들이 온다. BR의 오프셋이 실제 물리 디스크와 조금 차이는 있지만 큰 문제는 아니다. 실제 MBR, BR의 부트 코드들은 실제 디스크가 아니므로 마운트나 부팅 시 처리를 위해 조금 다르게 구성되어 있을 것이다. 따라서, 전체적인 구조는 포렌식적으로 큰 의미가 있어 보이지는 않는다. 파일을 마운트만 하면 기존의 분석 방법과 동일하게 분석이 가능하기 때문이다.

하지만 VHD 파일의 숨겨진 정보가 있다. 바로 VHD 푸터(Footer) 정보이다. VHD 푸터는 VHD 파일의 마지막 512 바이트이다. 다음은 VHD 푸터의 데이터 형식이다.

형식 위치 크기(바이트) 데이터
Header 0 – 7 8 connectix
Date and Time Stamp 24 – 27 4
Creator Application 28 – 31 4 win
Creator Host OS 36 – 39 4 Win2k
Original Size 40 – 47 8
Current Size 48 – 55 8
Unique ID (UUID) 68 – 83 16

헤더는 VHD 푸터의 헤더 시그니처로 “connectix” 값을 가진다. 그리고 오프셋 24-27의 시간 정보는 VHD 파일을 생성한 시간이 기록된다. VHD 명세서에 따르면 시간은 2000년 1월 1일 12:00:00 AM UTC를 기준으로 1초씩 카운트된 값이 저장된다. 오프셋 28-31은 생성 응용프로그램으로 윈도우 7의 경우 “win” 이라고 기록된다. 오프셋 36-39는 생성 운영체제를 나타내는 값으로 윈도우 7의 경우 “Win2k”로 기록된다. 오프셋 40-47은 파일의 원본 크기로 푸터 정보가 기록된 마지막 512 바이트를 제외한 크기가 저장된다. 그리고 48-55는 디스크를 고정식으로 생성하지 않고 동적으로 생성한 경우 현재의 크기 정보를 저장하고 있다. 그리고 마지막으로 16바이트의 UUID(Universally Unique IDentifier)가 기록된다.

다음은 실제 VHD 푸터 정보를 살펴본 것이다. 위 VHD 파일은 고정 크기로 생성했기 때문에 Origital Size와 Current Size가 동일하다.

vhdfooter.png
 
 


3. 가상화 포렌식 분석 (Virtual Forensics for VHD)

윈도우 7 가상화 기법과 관련한 포렌식 분석을 살펴보자. 만약 분석 시스템에서 VHD 파일을 발견했다면 해당 파일은 앞서 살펴본 마운트 방법을 통해 볼륨에 마운트 한 후 내용을 분석하면 될 것이다. 따라서, VHD의 내용 분석은 기존 분석과 큰 차이가 없다. 여기서는 VHD 파일이 해당 시스템에 존재하거나 사용했을 경우 어떤 흔적을 남기는지에 대해 중점적으로 살펴본다.
 
1) Virtual PC 관련 파일 조사

먼저 특정 시스템에서 가상화 기법이 사용되었다면 Virtual PC와 관련된 파일이 시스템에 존재할 것이다. 앞선 글에서 Virtual PC 구성 파일을 살펴보았다. 확장자로 (.vhd, .vmc, .vsv, .vud)를 가진다. 따라서, 시스템에 해당 확장자를 가지는 파일이 있는지 찾아보는 것이 우선일 것이다. 포렌식 도구에서는 마운트된 시스템의 파일 전체에서 검색할 수 있는 기법을 지원하므로 쉽게 해당 파일이 존재하는지 찾아 볼 수도 있다. 하지만 Virtual PC를 사용하지 않고 단순히 VHD 파일만 생성한 후 볼륨에 마운트 하고 데이터 백업용이나 특정 데이터 저장용으로 사용했다면 나머지 vmc, vsv, vud 파일은 존재하지 않을 것이다.

VHD 파일만 사용될 경우 주의할 점은 VHD 파일은 확장자를 제거해도 인식되기 때문에 고의로 확장자를 제거했을 가능성이 충분하다는 점이다. 따라서, 확장자만으로 특정 시스템에 가상화 기법을 사용했는지를 판단하는 것은 위험하다.
 
2) 파일 시그니처 검색

VHD 파일의 경우 초기 MBR 영역의 부트 코드를 자동으로 생성해주는 만큼 부트 코드의 값이 일정하다. 다음은 MBR 의 초기 8바이트 값이다.

  • 0x33C08ED0BC007C8E

8바이트 값을 시그니처로 검색한다면 VHD 파일을 찾을 수 있을 것이다. 이 경우에는 확장자 검색의 한계인 확장자 변경이나 파일을 삭제한 이후에도 검색이 가능하다. 그리고 VHD 푸터의 시그니처인 “connectix” 도 흔적을 찾는데 유용하게 사용될 수 있을 것이다.
 
3) 기본 폴더 조사

관련 파일과 함께 기본 폴더도 조사해 볼 수 있다. 사용자가 설치 시 변경할 수도 있겠지만 그렇지 않다면 기본 폴더에 설치될 것이다. 기본 폴더는 다음과 같다.

  • C:Users<username>AppDataLocalMicrosoftWindows Virtual PCVirtual Machines(가상 컴퓨터)

기본 폴더에 설치한 후 추후에 파일을 옮기고 기본 폴더를 삭제했다고 하더라도 기본 폴더의 경로 정보는 시스템의 비할당 영역이나 $LogFile에 존재할 가능성이 크므로 문자열 검색을 통해 흔적을 찾아낼 수도 있을 것이다. 모든 상황을 완벽하게 계산하여 설치시 부터 별도의 폴더를 사용한다면 모르겠지만 파일 이름과 폴더 이름 조사만으로도 어느 정도 VHD 파일의 존재 여부를 판단해 볼 수 있을 것이다.
 
4) 링크 파일 조사

VHD 파일을 사용하게 되면 윈도우 운영체제는 해당 파일에 대한 링크 파일을 “최근 문서 폴더(Recent)”에 기록한다. 최근 문서 폴더에는 사용자가 사용한 다양한 파일의 링크 파일이 저장된다. 다음은 링크 파일이 저장되는 폴더 경로이다.

  • Windows XP – C:Documents and Settings<username>Recent
  • Windows Vista/7 - C:Users<username>AppDataRoamingMicrosoftWindowsRecent

링크 파일은 볼륨 형식 뿐만아니라 볼륨 레이블, 시리얼 번호도 기록되므로 VHD 파일이 로컬에서 연결된 것인지 외장 저장매체, 혹은 네트워크에서 연결된 것인지도 알 수 있다.

5) 이벤트 로그 조사

윈도우 7에서 VHD 파일을 연결하거나 해제할 경우 관련 이벤트를 기록하게 된다. 윈도우 7에서는 이벤트를 카테고리로 구성해 세부적으로 분류해준다.  고맙게도 VHD 연결/해제를 관리해주는 이벤트 로그도 있다. 다음은 해당 이벤트의 경로이다.

  • Event Viewer (Local)Application and Services LogsMicrosoftWindowsVHDMPOperational

이벤트 뷰어를 통해 위 로그를 살펴보면 다음과 같다. VHD 파일의 연결/제거 뿐만아니라 로그를 남긴 날짜, 사용자 등의 정보도 알 수 있다.

eventviewer_vhdmp.png

6) 레지스트리 조사

드디어 레지스트리를 조사할 차례이다. 설명하는 레지스트리 값들과 의미에 대해서 잘 생각해보고 이전에 살펴본 레지스트리 분석(http://forensic-proof.com/archives/1515)과 비교해보자.

(1) RecentDocs
최근 실행한 파일에 대해서는 Recent 폴더 뿐만아니라 레지스트리에도 관련 목록과 실행 순서가 저장된다. 다음은 레지스트리 경로이다.

  • HKEY_USERS<user>SOFTWAREMicrosoftWindowsCurrentVersionExplorerRecentDocs

(2) MountedDevices
VHD 파일을 시스템에 마운트 했다면 MountedDevices 하위키에 마운트 정보가 기록되게 된다. 마운트 정보가 기록되는 MountedDevices 경로는 다음과 같다.

  • HKEY_LOCAL_MACHINESYSTEMMountedDevices

해당 키 하위에는 여러 값들이 존재하게 된다. DosDevices<driveletter> 로 존재하는 값은 현재 마운트되어 있거나 최근에 마운트된 정보가 저장된다. 로컬 드라이브가 C와 D라고 한다면 “DosDevicesC:”나 “DosDevicesD:” 값의 데이터는 변경되지 않을 것이다. 하지만 로컬 드라이브가 아닌 드라이브는 연결한 후 마운트 될때 자동으로 부여한 드라이브 문자(drive letter)의 값으로 “DosDevices<driveletter>” 데이터가 기록된다.

예를 들어, VHD를 F: 드라이브에 마운트 한 후 해제했다고 가정해보자. 그렇다면 이후에 다른 저장매체를 연결했을 때 F: 드라이브에 자동 마운트되어 “DosDevicesF:” 데이터가 덮어써지지 전까지는 DosDevices 값을 통해 VHD의 연결 정보를 알 수 있다. 게다가 VHD는 디스크 형식이기 때문에 MBR의 디스크 시그니처가 기록되게 되므로 연결한 VHD가 어떤 VHD인지도 알아 낼 수 있다(http://forensic-proof.com/archives/276).

하지만 “DosDevicesF:” 값이 덮어써진 경우는 어떡할까? 이 경우에도 걱정할 필요는 없다. MountedDevices 키의 하위 값들을 다시 보면 “DosDevices”를 접두어로 가지는 값 외에 “??Volume{GUID}”를 접두어로 가지는 값들도 존재한다. 이 값들은 처음 마운트 될때 기록되는 값으로 “DosDevices” 값들처럼 다른 값에 의해 덮어써질 염려가 없다. 따라서, “DosDevices” 값들 뿐만아니라 “??Volume{GUID}”의 값도 조사할 필요가 있다. 다음은 실제 VHD 연결된 시스템의 레지스트리 값이다.

mounteddevices1.png

VHD는 E 드라이브에 연결되었다. “DosDevices” 외에 동일한 데이터 값(MBR 디스크 시그니처)을 가지는 또 다른 값이 존재하는 것을 확인할 수 있다. 이 또 다른 값은 추가 저장매체의 연결로 덮어써질 염려가 없는 고유한 값이다.

(3) MountPoint2
MountedDevices의 키 값은 HKLM(HKEY_LOCAL_MACHINE) 하위에 존재하는 키이다. 따라서, 모든 사용자에게 공통으로 적용되는 값이다. 만약, 여러 사용자가 사용하는 시스템에서 MountedDevices 키를 통해 VHD 파일이 사용되었었다는 사실을 알아냈다. 이 경우 어떤 사용자가 VHD 파일을 사용했는지 알 수 있는가? 이것은 MountePoint2 키 값을 통해 확인이 가능하다.

  • HKEY_USER<user>SOFTWAREMicrosoftWindoowsCurrentVersionExplorerMountPoint2{GUID}

MountedDevices에서 살펴봤던 {GUID}를 포함하는 값과 연결하면 특정 VHD 흔적이 어떤 사용자와 연관된건지 쉽게 파악이 가능하다. 다음은 위와 동일한 시스템에서 MountPoint2 하위 키를 살펴본 것이다.

mountpoint21.png

동일한 {GUID}가 존재하는 것을 확인할 수 있다. 이 경우에 VHD를 연결한 사용자는 SID 1000번을 가지는 사용자이다. 이 키를 통해서는 사용자 뿐만아니라 {GUID} 키의 마지막 수정 시간을 통해 해당 장치의 마지막 연결 시각도 알 수 있다.

(4) EnumSCSI
VHD를 시스템에 마운트하면 또 하나의 키가 생성된다. Enum의 하위 키인 ACPI, HID, IDE, PCI, SCSI, USB 등의 키에 연결 형식에 따라 기록된다. VHD는 SCSI 하위 키로 연결 정보가 생성된다. 다음은 VHD 연결시 생성되는 키 정보이다.

  • HKEY_LOCAL_MACHINESYSTEMControlSet00XEnumSCSIDisk&Ven_Msft&Prod_Virtual_Disk

제조사 ID는 “Msft”이고 제품 ID는 “Virtual_Disk” 이다. 위 경로의 하위 키로 2K/XP에서 고유한 장치 인식정보로 사용된 Parent ID Prefix(PIP)와 유사한 형태의 키가 생성된다. 따라서, 해당 키의 존재 유무로 VHD의 사용 흔적을 파악할 수 있다.

enum_scsi.png

(5) DeviceClasses
다음으로  VHD 연결시 생성되는 또다른 키가 있다. 바로 DeviceClasses 키인데 해당 키를 마지막 수정 시간을 확인하면 시스템을 마지막으로 부팅한 이후 최초 연결된 시각을 알 수 있다.

  • HKEY_LOCAL_MACHINESYSTEMControlSet001ControlDeviceClasses{53f56307-b6bf-11d0-94f2-00a0c91efb8b}

그리고 하위의 Control 키의 마지막 수정 시간을 확인하면 장치가 마지막으로 연결/해제된 시간을 알 수 있다. 만약, 현재 장치가 연결되어 있다면 연결 시각을 의미하고, 연결되어 있지 않다면 해제 시각을 의미한다. 단, 이 정보는 활성 상태에서만 유지되는 정보이므로 시스템을 종료하면 사라지게 된다.

  • HKEY_LOCAL_MACHINESYSTEMControlSet001ControlDeviceClasses{53f56307-b6bf-11d0-94f2-00a0c91efb8b}##?#SCSI#Disk&Ven_Msft&Prod_Virtual_Disk#2&1f4adffe&0&000001#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}Control

(6) EMDMgmt
마지막으로 가상 디스크는 ReadyBoost 기능을 위해 다음의 키를 참조한다.

  • HKEY_LOCAL_MACHINESOFTWAREMicrosoftWindows NTCurrentVersionEMDMgmt

따라서, 위 키 하위에 앞서 살펴본 제조사 ID와 제품 ID를 포함하는 키가 있는지 살펴보면 VHD 사용 흔적을 알 수 있다.

지금까지 살펴본 대로 VHD 파일을 시스템에서 사용할 경우 많은 정보가 생성된다. 만약, VHD 사용을 숨기고 싶다면 VHD 사용 후 앞서 살펴본 모든 흔적을 지워야 할 것이다. 모든 흔적을 지우는 것이 가능할까? 레지스트리 키를 삭제한다고 해도 레지스트리 키가 실제 삭제되는 것은 아니다. 파일시스템에서의 삭제와 같이 링크 정보만 삭제하게 된다. 그렇다면 레지스트리 키 또한 완전 삭제(wiping)을 수행해야 할 것이다. 물론, 파일, 폴더, 링크파일, 이벤트 로그 또한 완전 삭제가 이루어져야 한다. 그렇지 않다면 비할당 영역 분석을 통해 흔적을 찾을 수 있을 것이다. 그렇다면 이 모든 정보를 완전 삭제할 경우 가상화 기법의 사용 흔적을 지울 수 있을까? 임시 파일, 휘발성 메모리 정보, 페이지 파일 정보까지 고려한다면 완벽하게 흔적을 삭제하기란 쉽지 않은 일이다.

 

출처 :http://forensic-proof.com/archives/2007