윈도우에서 USB 흔적 추적하기 (USB Device Tracking on Windows)

by 파시스트 posted Jul 21, 2018
?

단축키

Prev이전 문서

Next다음 문서

ESC닫기

크게 작게 위로 아래로 댓글로 가기 인쇄

앞으로 3번에 걸쳐 윈도우, 리눅스, 맥에서 USB 장치의 흔적을 추적하는 내용을 포스팅할 예정이다. 그 첫번째로 윈도우 환경에서 USB(범용 직렬 버스, Universal Serial Bus) 흔적을 살펴보자.


윈도우 환경에서 USB 흔적과 관련된 자료는 많이 나와있음에도 불구하고 뭔가 조금 아쉬울 정도로 정리가 되어 있지 않은 느낌이다. 그래서 그 동안 포스팅한 내용을 기반으로 정리를 해보려고 한다. 우선 왜 많은 장치 중에 USB 인가?


외부 저장매체 인터페이스는 현재 USB로 바통이 넘어간 상태이다. 이전만 해도 IEEE 1394(FireWire), eSATA가 경쟁하는듯 했지만, 벤더에서 USB를 밀었던 점과 간편하다는 점에서 USB가 외부 인터페이스의 사실상 표준으로 자리잡고 있다. 따지고 보면 USB는 국제 표준이 아니다. IEEE 1394가 국제 표준임에도 불구하고 인텔을 중심으로 한 많은 제조업체의 연합이 산업 표준으로 밀고 왔다. 최근 USB 3.0이 출시되면서 USB의 독주체제는 당분간 계속 지속될 것이다.


시스템에서 USB 흔적을 파악해야 하는 중요한 이유는 USB가 외부 저장매체의 주 인터페이스이기 때문에 외부 저장매체를 이용하는 많은 사고와 관련이 있기 때문이다. 예를 들어, 기밀 유출의 경우 저장매체를 이용했다면 USB 인터페이스를 사용하는 저장매체일 것이다. 또한, USB의 자동 실행 기능은 악성코드 전파의 주요 원인이 되고 있다. 이로 인해 망분리가 된 시스템에서도 USB와 같은 외부 저장매체의 관리가 매우 중요하다.


다음은 각 윈도우 XP, Vista, 7, 8(RP)에서 USB 장치 흔적을 확인할 수 있는 경로이다.


USB Device Tracking Artifacts.pdf


다음은 USB 장치가 남기는 흔적에 관해 윈도우 7을 기준으로 설명한 내용이다. 기존에 알고 있는 정보에 추가적으로 검증을 위해 3개의 USB로 테스트를 해 보았다. 다음은 테스트셋이다.


usb device tracking test set on windows 7.xlsx

 


1. USB 장치 인식 절차 (USB Device Installation)
USB 장치를 시스템에 꼽았을 때 어떤 일이 벌어지는가?

usb_connect.png



  1. USB 장치를 시스템에 꼽으면 버스 드라이버(Bus Driver)는 PnP 관리자(PnP Manager)에게 장치의 고유한 식별정보(device descriptor)를 보내 장치의 연결을 알린다.
    • 식별 정보 (device descriptor) : 제조사, 일련번호 등
  2. 커널 모드 PnP 관리자는 전달받은 정보를 기반으로 Device Class ID를 구성하고 레지스트리에서 ID에 맞는 적절한 드라이버(driver)가 시스템에 이미 설치되어 있는지 검색한다.
  3. 드라이버가 있다면 로드하고 드라이버가 없을 경우, 커널 모드 PnP 관리자는 장치 펌웨어에게 드라이버를 요청하고 전달받은 드라이버를 사용자 모드 PnP 관리자에게 전달한다.
  4. 사용자 모드 PnP 관리자는 전달받은 드라이버를 설치하고 레지스트리에 기록한다. 드라이버 설치에 따라 생성되는 레지스트리를 순서대로 나열한 것이다.
    • HKLM\SYSTEM\ControlSet00#\Enum\USB\{Vendor ID & Product ID}\{Serial Number}
    • HKLM\SYSTEM\ControlSet00#\Enum\USBSTOR\{Device Class ID}\{Serial Number}\Properties
    • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{Device Entry}
    • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\
      {10497B1B-BA51-44E5-8318-A65C837B6661}(WpdBusEnumRoot GUIDs)
    • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\
      {53F56307-B6BF-11D0-94F2-00A0C91EFB8B}(Disk GUIDs)
    • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\
      {53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}(Volume GUIDs)
    • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\
      {6AC27878-A6FA-4155-BA85-F98F491D4F33}(Portable Device GUIDs)
    • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\
      {A5DCBF10-6530-11D2-901F-00C04FB951ED}(USB GUIDs)
  5. 장치 드라이버 설치 과정은 로그 파일에도 기록된다.
    • Windows 2000/XP : %SystemRoot%\Setupapi.log
    • Windows Vista/7/8(RP) : %SystemRoot%\inf\Setupapi.dev.log
  6. 드라이버 설치가 완료되면 USB 장치를 시스템에 마운트하고 관련 정보를 레지스트리와 이벤트 로그에 기록한다.
    • HKLM\SYSTEM\MountedDevices
    • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Device Entry}
    • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\Devices\{Device Entry}
    • HKU\{USER}\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\MountPoint2
    • %SystemRoot%\System32\winevt\Logs\
      Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx
  7. 장치가 연결 해제되면 관련 정보를 이벤트 로그에 기록한다.
    • %SystemRoot%\System32\winevt\Logs\
      Microsoft-Windows-DriverFrameworks-UserMode%4Operational.evtx

 

2. 펌웨어 정보 확인 (Get USB Information from firmware)
앞서 드라이버 설치 시 펌웨어로부터 정보를 얻어온다고 언급했다. USB 펌웨어에 어떤 정보가 포함되어 있는지 한번 확인해보자. USBView 도구를 활용하면 손쉽게 USB 펌웨어 정보를 확인할 수 있다.

usbview.png


위 정보 중 눈에 띄는 정보는 다음과 같다.

  • idVendor : 0x090c (Feiya Technology Corporation)
  • idProduct : 0x1000
  • iManufacturer : 0x0409 “General”
  • iProduct : 0x0409 “USB Flash Disk”
  • iSerialNumber : 8011050000025710

이렇게 얻어낸 정보를 기반으로 레지스트에 키와 값을 생성한다.

 

3. USB 흔적 추적하기 (USB Device Tracking)
USB 설치 과정에 따르면 드라이버 설치 로그 파일과 레지스트리를 확인하면 USB 장치의 흔적를 알 수 있을 것이다. 로그 파일과 레지스트리에서 확인할 수 있는 흔적은 다음과 같다.

  • Device Class Identifier
  • Unique Instance Identifier (include Serial Number)
  • Vendor Name & Identifier
  • Product Name & Identifier
  • Volume Label
  • Driver Letter
  • Volume Serial Number
  • Username
  • Volume GUID
  • First Connection Time
  • First Connection Time After Booting
  • Last Connection

그럼 어떻게 흔적을 찾을 수 있는지 하나씩 살펴보자.

 
(1) 장치 클래스 ID (Device Class Identifier)
장치 클래스 ID는 펌웨어로부터 얻은 장치의 형식, 제조사명, 상품명, 버전을 가지고 만드는 ID로 보통 다음과 같은 형태를 띄고 있다.

  • Disk&Ven_{Vendor Name}&Prod_{Product Name}&Rev_{Version}

다음은 장치 클래스 ID의 예이다.

  • Disk&Ven_Corsair&Prod_UFD&Rev_0.00
  • Vendor Name : Corsair
  • Product Name : UFD
  • Version : 0.00

장치 클래스 ID는 다음 경로에서 확인할 수 있다.

  • SetupAPI Logfile
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{10497B1B-BA51-44E5-8318-A65C837B6661}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{6AC27878-A6FA-4155-BA85-F98F491D4F33}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\USBSTOR\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\{Sub Keys}

 
(2). 고유 인스턴스 ID (Unique Instance Identifier)
고유 인스턴스 ID는 같은 제조사에서 만든 동일 제품이더라도 모두 다른 값을 가지는 장치 시리얼 번호가 포함된 고유의 값이다. 하지만, 모든 USB 장치가 시리얼번호를 포함하고 있는 것은 아니다. 따라서, 시리얼 번호가 있는지 여부에 따라 인스턴스 ID의 형태는 다음과 같이 달라진다.

  • Serial Number (O){Serial Number}&#
  • Serial Number (X) – #&{Random Number by PnP Manager}&#

다음은 시리얼번호가 존재할 때, 인스턴스 ID의 예이다.

  • 545A235F&0
  • Serial Number : 545A235F

시리얼번호는 장치의 고유한 값이기 때문에 시스템에 연결했던 장치를 구별할 수 있다. USB 연결 정보를 확인하고 USB를 제출하라고 요청했는데 용의자가 동일한 제조사의 제품을 제출했다면 시리얼번호를 보고 시스템에 연결한 것과 동일한 것인지 구별해낼 수 있다.

고유 인스턴스 ID는 다음 경로에서 확인할 수 있다.

  • SetupAPI Logfile
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{10497B1B-BA51-44E5-8318-A65C837B6661}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{6AC27878-A6FA-4155-BA85-F98F491D4F33}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{A5DCBF10-6530-11D2-901F-00C04FB951ED}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\USBS\{Vendor ID & Product ID}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\USBSTOR\{Device Class ID}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\{Sub Keys}

 
(3). 제조사 ID와 제품 ID (Vendor Identifier & Product Identifier)
레지스트리를 확인해보면 USB의 제조사 ID와 제품 ID를 알 수 있다. 제조사명과 제품명은 앞서 살펴본 장치 클래스 ID (Device Class Identifier)에 포함되어 있었다. 제조사 ID와 제품 ID는 다음과 같은 형태로 구성된다.

  • VID_{Vendor ID}&PID_{Product ID}

다음은 제조사 ID와 제품 ID의 예이다.

  • VID_090C&PID_1000
  • Vendor Identifier : 0x090c (idVendor)
  • Product Identifier  : 0x1000 (idProduct)

이 정보는 앞서 살펴본 USBView 도구를 이용해 가져온 정보와 동일하다.

제조사 ID와 제품 ID는 다음 경로에서 확인할 수 있다.

  • HKLM\SYSTEM\ControlSet00#\Enum\USB\{Sub Keys}

 
(4). 볼륨 레이블과 드라이브 문자(Volume Label & Drive Letter)
각 장치는 기본적으로 운영체제에서 할당한 문자로 마운트된다. 볼륨 레이블을 별도로 지정하지 않을 경우는 드라이브 문자만 나타나지만, 볼륨 레이블을 지정해놓을 경우 볼륨 레이블과 함께 드라이브 문자가 나타난다. 볼륨 레이블과 드라이브 문자도 레지스트리에서 확인할 수 있다.

볼륨 레이블을 다음 경로에서 확인할 수 있다.

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\Devices\{device entry}\FriendlyName
  • HKLM\System\{CurrentControlSet}\Enum\WpdBusEnumRoot\UMB\{device entry}\FriendlyName
  • HKLM\SOFTWARE\Microsoft\Windows Search\VolumeInfoCache\{drive letter}

드라이브 문자는 다음 경로에서 확인할 수 있다.

  • HKLM\System\MountedDevices\{Sub Values}
  • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\Devices\{device entry}\FriendlyName
  • HKLM\System\{CurrentControlSet}\Enum\WpdBusEnumRoot\UMB\{device entry}\FriendlyName

볼륨 레이블 경로와 드라이브 문자 확인 경로 중에 중복되는 경로가 있다. 해당 경로에는 볼륨 레이블이 존재할 경우 볼륨 레이블이, 존재하지 않을 경우 드라이브 문자가 남는다.

 
(5). 볼륨 시리얼 번호 (Volume Serial Number)
레지스트리에는 USB의 볼륨 시리얼 번호도 저장된다. USB를 FAT12/16/32, NTFS, exFAT 으로 포맷하면 VBR(Volume Boot Record)의 부트 섹터에 볼륨 시리얼번호가 기록된다. USB를 연결하면 해당 볼륨 시리얼번호도 가져와 레지스트리에 기록한다.

볼륨 시리얼 번호는 다음 경로에서 확인할 수 있다.

  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Sub Keys}

다음은 EMDMgmt 하위 키의 예이다.

  • _??_USBSTOR#Disk&Ven_SMI&Prod_USB_DISK&Rev_3000#2011072800001332&0#{53f56307-b6bf-11d0-94f2-00a0c91efb8b}PR0NEER_346682584
  • Device Class Identifier – Disk&Ven_SMI&Prod_USB_DISK&Rev_3000
  • Serial Number : 2011072800001332
  • Volume Label : PR0NEER
  • Volume Serial Number : 346682584 (0x14A9F4D8)

 
(6). 사용자명과 볼륨 GUID (Username & Volume GUID)
다중 사용자가 사용하는 윈도우 시스템일 경우, 마운트된 USB가 어떤 사용자에 의해 마운트되었는지 알 필요가 있다. 마운트된 장치는 모두 고유한 볼륨 GUID를 가진다. 마운트된 장치의 볼륨 GUID는 다음 경로에서 확인할 수 있다.

  • HKLM\SYSTEM\MountedDevices\{Sub Values}

하위 값은 “\??\Volume” 접두사와 함께 GUID 정보를 가진다.  해당 볼륨 GUID 값의 데이터를 확인하면 어떤 장치가 마운트되었었는지 확인할 수 있다. 다음은 마운트된 USB의 값과 데이터의 예이다.

  • Value : \??\Volume{20f16aa5-b42f-11e1-91e0-1c6f65d71f1a}
  • Data : _.?.?._.U.S.B.S.T.O.R.#.D.i.s.k.&.V.e.n._.S.M.I.&.P.r.o.d._.U.S.B._.D.I.S.K.&.R.e.v._.3.0.0.0.#.2.0.1.1.0.7.2.8.0.0.0.0.1.3.3.2.&.0.#.{.5.3.f.5.6.3.0.7.-.b.6.b.f.-.1.1.d.0.-.9.4.f.2.-.0.0.a.0.c.9.1.e.f.b.8.b.}.

위에서 볼륨 GUID는 “{20f16aa5-b42f-11e1-91e0-1c6f65d71f1a}”이다. 해당 볼륨 GUID 정보가 다음 경로에 있는지 확인해보자.

  • HKU\{USER}\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{Volume GUID}

볼륨 GUID 값이 존재한다면 해당 경로의 {user} 값이 해당 장치를 마운트한 사용자이다.

 
(7).  최초 연결 시각 (First Connection Date/Time)
윈도우 시스템에 USB 장치를 처음 연결한 시점을 알아보자. USB를 처음 연결한 시점은 드라이버 설치 로그파일을 확인하면 정확하게 알 수 있다.

  • SetupAPI Logfile – Section Start
  • Windows 2000/XP : %SystemRoot%\Setupapi.log
  • Windows Vista/7/8(RP) : %SystemRoot%\inf\Setupapi.dev.log

로그 파일 없이 레지스트리만으로도 알 수 있다. 레지스트리의 포맷을 살펴보면 각 키에 “마지막 수정 시간(Last Written Time)”이 저장된다. USB를 최초 연결할 때만 생성되고, 이후에는 수정되지 않는 키의 “마지막 수정 시간”을 확인하면 USB의 최초 연결 시각을 알 수 있다.

다음은 USB의 최초 연결 시각을 알 수 있는 키 목록이다. 다만, “HKLM\SYSTEM\ControlSet00#\Enum\USB 또는 USBSTOR”는 Vista/7 이후 보안정책에 의해 PnP 관리자가 수시로 접근하여 시간이 변경될 수 있기 때문에 신뢰적이지 못하다.

  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{10497B1B-BA51-44E5-8318-A65C837B6661}\{Sub Keys}
  • HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\EMDMgmt\{Device Entry}
  • HKLM\SOFTWARE\Microsoft\Windows Portable Devices\Devices\{Device Entry}
  • HKLM\SYSTEM\ControlSet00#\Enum\USBSTOR\{Device Class ID}\{Unique Instance ID}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\USB\{Vendor ID & Product ID}\{Serial Number}\{Sub Keys except for “Device Parameters”}

 
(8). 부팅 후 최초 연결 시각 (First Connection Time After Booting)
USB와 관련된 키 값 중에 어떤 키는 부팅 후 최초 연결했을때만 “마지막 수정 시간”을 갱신하고, 이후에는 재부팅할때까지 갱신하지 않는 키가 있다. 이런 키의 “마지막 수정 시간”의 의미는 “부팅 후 최초 연결 시각”이 된다.

다음은 부팅 후 최초 연결 시각을 알 수 있는 키 목록이다. 앞서 언급한 같은 이유로 “USB와 USBSTOR” 하위키는 제외해야 한다.

  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F56307-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{53F5630D-B6BF-11D0-94F2-00A0C91EFB8B}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{6AC27878-A6FA-4155-BA85-F98F491D4F33}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Control\DeviceClasses\{A5DCBF10-6530-11D2-901F-00C04FB951ED}\{Sub Keys}
  • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{Device Entry}
  • HKLM\SYSTEM\ControlSet00#\Enum\USBSTOR\{Device Class ID}\{Unique Instance ID}

 
(9). 마지막 연결 시각 (Last Connection Time)
USB와 관련된 키 값 중에 USB를 연결할 때마다 갱신되는 키가 있다. 이런 키의 “마지막 수정 시간”의 의미는 “마지막 연결 시각”이 된다.

다음은 마지막 연결 시각을 알 수 있는 키 목록이다. 앞서 언급한 같은 이유로 “USB와 USBSTOR” 하위키는 제외해야 한다.

  • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{device entry}\Device Parameters
  • HKLM\SYSTEM\ControlSet00#\Enum\WpdBusEnumRoot\UMB\{device entry}\Properties\{80d81ea6-7473-4b0c-8216-efc11a2c4c8b}
  • HKU\{USER}\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\{Volume GUID}
  • HKLM\SYSTEM\ControlSet00#\Enum\USB\{Vendor ID & Product ID}\{Serial Number}


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






Articles

2 3 4 5 6 7 8 9 10 11