Keychain Forensics : Part I

디지털 포렌식 분석을 진행 과정에서 사용자의 기밀 정보는 매우 유용한 정보 중 하나이다. 보통 사용자는 자신에게 불리할 수 있는 증거를 숨기기 위해 데이터를 암호화하여 보관하거나, 인증을 통해서만 접근 가능한 환경에 보관하기 때문에 수사관 입장에서는 이러한 정보를 수집하기 쉽지 않다. 물론 갖은 회유와 협박을 통해 인증 정보를 수집할 순 있겠으나, 사용자가 이를 거부하는 경우에는 전수조사를 제외하곤 대책이 없다. (다른 방법이 있을 수 있으나, 적어도 내가 아는 상황에서는 그렇다.)

사용자는 자체적인 정보 암호화 알고리즘을 사용할 수도 있으나, 보통은 이미 안정성이 입증된 솔루션을 사용한다. 이러한 정보는 보통 다음과 같은 장소에 보관한다.

이런 다양한 정보 중에 오늘 글에서 다룰 내용은 키체인(Keychain) 분석이다. Mac OS X는 사용자 기밀 정보를 저장하기 위해 키체인(Keychain) 시스템을 운영하고 있다. 키체인 시스템은 사용자 정보를 3DES로 암호화하여 저장하고 있다. 키체인에는 Mac OS X에 저장되는 대부분의 기밀 정보를 저장한다. 대표적인 정보는 다음과 같다.

이 외에도 다양한 정보가 저장될 수 있다.

키체인은 데이터를 암호화하여 저장하기 때문에, 데이터를 분석하려면 암호화된 키체인 파일과 패스워드 또는 메모리 이미지에서 추출한 마스터 키가 필요하다. 메모리 이미지에서 마스터 키를 추출하는 방법은 예전에 설명한 적이 있으니, 해당 내용을 참조하기 바란다. [fusion_builder_container hundred_percent="yes" overflow="visible"][fusion_builder_row][fusion_builder_column type="1_1" background_position="left top" background_color="" border_size="" border_color="" border_style="solid" spacing="yes" background_image="" background_repeat="no-repeat" padding="" margin_top="0px" margin_bottom="0px" class="" id="" animation_type="" animation_speed="0.3" animation_direction="left" hide_on_mobile="no" center_content="no" min_height="none"][ref]

참고로 메모리 이미지는 사용자가 시스템을 조금만 건들더라도 데이터가 손상될 수 있으며, 행여나 시스템을 종료시키거나, 재부팅 시키는 경우에는 메모리 이미지에서 마스터 키를 추출할 수 없기 때문에, 라이브 데이터 수집과 더불어 가장 먼저 수집해야 한다. 메모리 이미지를 수집하는 방법은 다음과 같다.

메모리를 이미징하는 방법은 위와 같이 3가지 방법이 있으나, MacMemoryReader를 가장 많이 사용하며, 추천하는 도구이다. 해당 도구를 사용하면 다음과 같은 순서로 메모리를 이미징할 수 있다.

 n0fate@n0fate-ui-MacBook-Pro: ~/Downloads/MacMemoryReader$ sudo ./MacMemoryReader
n0fate@n0fate-ui-MacBook-Pro: ~/Downloads/MacMemoryReader$ sudo ./MacMemoryReader
Password:
ATC-NY Mac Marshal Mac Memory Reader 3.0.2 ($Revision: 1.24 $)
Copyright (c) Architecture Technology Corporation. All rights reserved.

Usage: ./MacMemoryReader [-g] [-d] [-H hashtype] [-r] [-p] [-P] [-k]

-g print progress messages suitable for parsing by a GUI
-d print verbose debugging information to stderr
-H compute the given hash on the output data (where hashtype
is one of MD5, SHA-1, SHA-256, or SHA-512); can be given
multiple times; hash is printed on stderr
-r also copy "reserved" areas of memory, such as that used
by shared-memory graphics adapters; EXPERIMENTAL
-p dump memory in plain raw DD format instead of Mach-O, then write
a table of contents to stderr listing file offsets versus
physical memory offsets
-P dump memory in plain raw DD format, inserting zeros for un-mapped
regions in the memory map; no table of contents is needed,
because file offsets will correspond to physical memory
off sets, but the resulting file may be much larger than RAM
-k load the RAM dump kernel extension and set up /dev/mem and
/dev/pmap, but do not dump memory; for EXPERTS ONLY

dumps physical memory to in Mach-O (the default) or
raw/DD format. The resulting file may be slightly larger than
physical memory due to the Mach-O header and alignment constraints.
If the filename is '-', memory is dumped to stdout.

메모리 이미지를 수집하려면 간단하게 실행 파일 인자로 메모리 이미지를 저장할 파일 명을 준다. 보통 메모리 이미지를 생성하는 시점에 해시를 생성하므로 -H 옵션을 같이주는 것도 좋다.

n0fate@n0fate-ui-MacBook-Pro: ~/Downloads/MacMemoryReader$ sudo ./MacMemoryReader test.mem
No kernel file specified, using '/mach_kernel'
Dumping memory regions:
available 0000000000000000 (572.00 KB) [WRITTEN]
ACPI_NVS 000000000008f000 (4.00 KB) [WRITTEN]
available 0000000000090000 (64.00 KB) [WRITTEN]
available 0000000000100000 (178.00 MB) [WRITTEN]
LoaderData 000000000b300000 (76.00 KB) [WRITTEN]
available 000000000b313000 (948.00 KB) [WRITTEN]
LoaderData 000000000b400000 (5.21 MB) [WRITTEN]
available 000000000b935000 (812.00 KB) [WRITTEN]
LoaderData 000000000ba00000 (33.00 MB) [WRITTEN]
RT_data 000000000daff000 (4.00 KB) [WRITTEN]
RT_code 000000000db00000 (20.00 KB) [WRITTEN]
RT_data 000000000db05000 (4.00 KB) [WRITTEN]
RT_code 000000000db06000 (4.00 KB) [WRITTEN]
RT_data 000000000db07000 (4.00 KB) [WRITTEN]
RT_data 000000000db08000 (4.00 KB) [WRITTEN]
...[SNIP]...
available 00000000bfe93000 (4.00 KB) [WRITTEN]
BS_data 00000000bfe94000 (40.00 KB) [WRITTEN]
available 00000000bfe9e000 (4.00 KB) [WRITTEN]
available 00000000bfe9f000 (152.00 KB) [WRITTEN]
ACPI_NVS 00000000bfec5000 (8.00 KB) [WRITTEN]
ACPI_recl 00000000bfec7000 (4.00 KB) [WRITTEN]
ACPI_NVS 00000000bfec8000 (8.00 KB) [WRITTEN]
ACPI_recl 00000000bfeca000 (12.00 KB) [WRITTEN]
ACPI_NVS 00000000bfecd000 (72.00 KB) [WRITTEN]
ACPI_recl 00000000bfedf000 (64.00 KB) [WRITTEN]
available 00000000bfeef000 (40.00 KB) [WRITTEN]
available 00000000bfeff000 (4.00 KB) [WRITTEN]
available 0000000100000000 (5.00 GB) [......... ] 28.2% /^available 0000000100000000 (5.00 GB) [WRITTEN]
Reported physical memory: 8589934592 bytes (8.00 GB)
Statistics for each physical memory segment type:
reserved: 2 segments, 268460032 bytes (256.02 MB) -- assigned to unreadable device
LoaderCode: 2 segments, 516096 bytes (504.00 KB) -- WRITTEN
LoaderData: 4 segments, 44355584 bytes (42.30 MB) -- WRITTEN
BS_code: 65 segments, 1388544 bytes (1.32 MB) -- WRITTEN
BS_data: 80 segments, 38965248 bytes (37.16 MB) -- WRITTEN
RT_code: 16 segments, 163840 bytes (160.00 KB) -- WRITTEN
RT_data: 15 segments, 135168 bytes (132.00 KB) -- WRITTEN
available: 43 segments, 8232214528 bytes (7.67 GB) -- WRITTEN
ACPI_recl: 3 segments, 81920 bytes (80.00 KB) -- WRITTEN
ACPI_NVS: 7 segments, 2211840 bytes (2.11 MB) -- WRITTEN
MemMapIO: 7 segments, 4198400 bytes (4.00 MB) -- assigned to unreadable device
Total memory written: 8320032768 bytes (7.75 GB)
Total memory assigned to unreadable devices (not written): 272658432 bytes (260.03 MB)
n0fate@n0fate-ui-MacBook-Pro: ~/Downloads/MacMemoryReader$

위와 같은 형태의 결과가 보이면, 메모리 이미지를 성공적으로 수행한 것이다. 다음 포스팅에서는 키체인 파일을 수집하는 방법을 알아보도록 하겠다.