[MRU(Most Recently Used)]
윈도우는 사용자가 특정 행위를 하였을 때 마지막 행위를 레지스트리에 기록해 두는데 이 목록이 MRU List이다.
이제부터 소개하는 것들이 MRU List에 포함 되는 것들이다.

[검색 목록]
윈도우의 검색 목록은 레지스트리에 XP의 경우 검색 종류에 따라 각각 기록되는 서브키가 다르며, Win 7의 경우 통합적으로 기록이 된다.

키(XP) : HKCU\Software\Microsoft\Search Assistant\ACMru\5603  --> 모든 파일과 폴더 검색 기록
키(XP) : HKCU\Software\Microsoft\Search Assistant\ACMru\5001  --> 로컬 인터넷 검색
키(XP) : HKCU\Software\Microsoft\Search Assistant\ACMru\5647  --> 컴퓨터와 사람들 검색
키(XP) : HKCU\Software\Microsoft\Search Assistant\ACMru\5604  --> 음악, 그림, 동영상 검색


[그림 1 - ACMru 키의 서브키]


키(Win 7) : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\WordWheelQuery

[그림 2 - Win 7의 WordWheelQuery 키]

위 이미지에 나와 있는 것처럼 검색 순서는 MRUListEx data에서 알 수 있다. 

* 참고 : Vista는 검색 기록을 레지스트리에 남기지 않는다. 

 

[최근 문서]
윈도우 버튼을 누르면 각 윈도우마다 내 최근 문서라고 하여 최근에 열었던 파일들을 나열해주는 기능이 있다.
이 기능또한 레지스트리를 참조하는 기능으로서 레지스트리를 통해 확인이 가능하다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RecentDocs
 

[그림 3 - RecentDocs 키]

각 Value의 data를 확인 해 보면 파일을 확인 할 수 있으며 순서는 MRUListEx를 참고하면 된다. 


[최근 실행명령어]
윈도우 버튼을 누르면 실행이란 부분을 볼 수 있다. 일반 사용자들은 이 부분을 잘 사용하지 않지만 관리자나 컴퓨터에 대해서 조금만 알고 있는 사람들은 이 실행창을 자주 이용한다. 이 실행창에서의 명령어 리스트를 아래 키에서 볼 수 있다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\RunMRU

[그림 4 - RunMRU 키]

이 키의 MRUList Value는 위의 MRUListEX Value와 다르게 순서가 알파벳으로 저장된다. 물론 실행된 기록들 또한 알파벳으로 저장된다.


[원격 데스크탑 연결 목록]
이 기능도 의외로 많이 사용하는 기능중 하나이다. 이 기능을 사용하여 원격 PC에 접속하고 나중에 다시 접속하려고 보면 예전에 접속했던 IP가 목록화 되어 남아 있는 것을 볼 수 있는데 이 정보 또한 레지스트리에 기록되는 정보이다.

키 : HKCU\Software\Microsoft\Terminal Server Client\Default

MRUx 형태로 Value가 되어 있는데 x는 0부터 시작한다. 숫자가 작을수록 최근에 접속한 IP이다. 


[대화상자를 통한 접근 기록]
대부분 프로그램에서 사용자에게 파일을 열도록 유도할 때 대화상자를 이용하는데 대부분의 프로그램이 윈도우 기본 대화상자를 사용한다. 이 대화상자를 통해 접근한 최근 폴더나 파일의 기록 또한 레지스트리에 남는다.

키(Vista/7) : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\LastVisitedPidMRU --> 최근 접근한 폴더
키(Vista/7) : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\ComDlg32\OpenSavePidlMRU --> 최근 저장하거나 읽은 파일


이 키의 Value 또한 알파벳으로 표현되며, 두 키의 내용은 거의 비슷하나 OpenSavePidlMRU의 경우 확장자 별로 확인 할 수 있다. 

* 참고 : XP의 경우 키 이름에서 Pid만 제거하면 XP의 키 이름이 된다. 


[네트워크 드라이브 맵핑 정보]
윈도우는 원격에 있는 다른 컴퓨터의 하드디스크나 폴더를 로컬 컴퓨터의 드라이브로 맵핑 하여 사용한 정보를 레지스트레 기록한다. 

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Map Network Drive MRU

이 키또한 Value가 알파벳으로 표현된다. 



[마지막으로 접근한 레지스트리 키 정보]
아래 키에서 확인 할 수 있다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Applet\Regedit

LastKey Value의 data로 알 수 있다. 


[파일 접근 시간 업데이트 여부]
이 기록은 Win Vista/7에서만 사용하는 것으로 아래 키에서 확인 할 수 있다.

키 : HKLM\System\CurrentControlSet\Control\FileSystem

[그림 5 - FileSystem 키]

NtfsDisableLastAccessUpdate Value의 값에 따라 업데이트 여부가 결정 된다.
 - 0 : 업데이트
 - 1 : 업데이트 하지 않음(Default) 


디렉토리 리스닝의 속도를 빠르게 하기 위해 기본적으로 사용하지 않음. 


[휴지통 우회]
휴지통을 통해 삭제가 되는가, 휴지통을 거치지 않고 삭제가 되는가를 결정해주는 키가 있다.

키(XP) : HKLM\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket
키(Vista/7) : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\BitBucket\Volume\<GUID>


[그림 6 - Volume 키]

 - 0 : 삭제시 휴지통으로 이동(Default)
 - 1 : 삭제시 휴지통을 거치지 않고 바로 삭제 


XP의 경우 레지스트리 한번의 설정으로 모든 사용자가 동일하게 적용 받지만, Vista/7은 Volume과 사용자 별로 설정 할 수 있다.


[삭제된 프로그램 정보]
원래 이 키의 목적은 프로그램의 이름을 다국적 언어로 지원하기 위해 한번 실행된 프로그램의 이름을 이 키에 저장해 두었다가 후에 해당 프로그램이 실행되면 이 키를 읽어 프로그램의 이름을 다국적 언어로 표현하기 위한 것이다.
하지만 이 키에 등록된 Value는 한번만 등록되더라도 지워지지 않는 특성이 있어 포렌식적으로 중요한 의미를 지닌다.

키 : HKCU\Software\Classes\Local Setting\Software\Microsoft\Windows\Shell\MuiCache

[그림 7 - MuiCache 키]

실행 전체경로와 실행 파일명까지 나와 있는 것을 볼 수 있다. 


지금까지 알아 본 레지스트리들만이 포렌식적으로 의미를 갖는 것은 아니다.

여기서 다루지 않은 레지스트리 키들도 다른 정보와 결합하거나 의미를 갖지만 아직 알려지지 않았을 뿐이다. 

'[+] Forensic' 카테고리의 다른 글

휴지통 분석  (0) 2012.01.10
윈도우 계정  (0) 2012.01.10
Registry (11)  (0) 2012.01.07
Registry (10)  (0) 2012.01.07
Registry (9)  (0) 2012.01.06

[이동형 저장장치 정보]
이동형 저장장치는 USB 썸 드라이브(Thumb Drive)나 외장 하드 드라이브처럼 한곳에 고정되어 있지 않고 편하게 휴대하여 다닐 수 있는 저장장치들을 말한다. 요즘은 이러한 저장장치들의 크기가 커지면서 활용도가 엄청 높아져서 이로인한 보안사고도 빈번하게 일어난다. 회사들의 경우 이동형 저장장치의 반입을 물리적으로 차단하기도 하고 컴퓨터의 USB 포트를 봉인해두기도 한다. 이동형 저장장치가 컴퓨터에 연결되면 Plug & Plug Play Manager가 이벤트 알림신호를 받고 연결된 이동형 저장장치에 장치 정보들을 요청한다. 이 정보를 바탕으로 PnP Manager는 Device Class ID를 부여하고 적절한 드라이버를 찾은 후 해당 드라이버가 현재 로드되어 있지 않으면 해당 드라이버를 로드하여 준다. 이러한 과정이 끝나면 PnP Manager는 아래 키에 Device Class Identifier 키와 서브키들을 생성한다.

키 : HKLM\System\CurrentControlSet\Enum\USBSTOR\<Device Class Identifier>\<Unique Instance ID>

[그림 1 - USBSTOR 키]

위 이미지에서 Disk로 시작하는 서브키가 Device Class Identifier이며, 위 이미지에는 없지만 Device Class Identifier 하위키로 Unique Instance ID가 존재한다.

Device Class Identifier 서브키의 이름에는 규칙이 있는데 그 규칙은 아래 이미지와 같다.

[그림 2 - Device Class Identifier 이름 생성 규칙]

 

 이번에는 Unique Instance ID를 알아볼 차례이다. 이 서브키의 이름도 규칙이 있는데 그 규칙은 아래와 같다.
1. 저장장치의 Device ID나 Serial Number로 Unique Instance ID를 부여하는데 만약에 없다면 PnP Manager가 임의로 부여한다.
 - Device ID나 Serial Number가 있을 경우 형식 : XXXXXXXXXX&X
 - PnP Manager가 임의로 생성할 경우 형식 : X&XXXXXXXXXX&X


레지스트리에는 위와 같은 이름들을 한번에 볼 수 있는 키도 존재한다.

키 : HKLM\System\CurrentControlSet\Control\DeviceClasses\{53f56307~, 53f5630d~}

[그림 3 - DID와 UID를 한번에 볼 수 있는 키]

53f56307-b6bf-11d0-94f2-00a0c91efb86 키의 서브키들의 이름은 디스크의 GUID를 의미하며 53f5630d-b6bf-11d0-94f2-00a0c91efb86는 볼륨 디바이스 인터페이스의 GUID를 의미한다.
이 두 키의 하위키의 data에서 시스템에 연결된 장치들의 DID와 UID를 확인 할 수 있다.

 

[그림 4 - 확인 할 수 있는 data에서의 DID와 UID]

만약 이러한 정보들만으로 증거로 수집된 수많은 이동형 저장장치 어느것이 쓰였는지 판단하려면 정보가 부족한 감이 없지 않다. 이럴때 제조사의 ID와 제품의 ID 정보를 수집하여 조회 한다면 찾고자 하는 이동형 저장장치의 범위가 좁혀질 것이다.

키 : HKLM\System\CurrentControlSet\Enum\USB

위 키의 서브키 이름은 아래와 같은 규칙을 갖는다.

[그림 5 - USB 키의 하위키들 이름 생성 규칙]

USBSTOR에서의 정보와 위 생성 규칙으로 생성되는 서브키들의 연관성은 UID로 이루어 진다.

[그림 6 - USB키의 하위키들과 USBSOTR키의 하위키들의 연관성]


이동형 저장장치의 특정 사용시간을 알아내려면 최초 연결 시간과 마지막 연결 시간을 알아보면 된다.
최초 연결 시간은 아래 키 서브키의 마지막 수정 시간(Last Writteen Time) 을 보면 된다.
 

키 : HKLM\Software\Microsoft\Windows Potable Devices\Devices

마지막 연결 시간은 아래 키 서브키의 마지막 수정 시간을 보면 된다.

키 : HKU\<user>\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoint2
      HKLM\System\ControlSetXXX\Enum\USB\VID_XXXX&PID_#### 


위 키의 하위키들 중 Volume GUID나 Serial Number를 찾아 마지막 수정 시간을 보면 된다.
하지만 정확한 사용시간은 알아내지 못하며, 시간 범위를 유추하기 위하여 정보를 수집하는 것이다.

[연결된 저장장치 정보]
연결된 모든 저장장치(로컬, 이동형)의 연결 정보는 아래 키에서 확인 할 수 있다. 

키 : HKLM\System\MountedDevices
 

[그림 7 - MountedDevices 키]

이 키의 Value와 data를 보면 어떠한 이동형 저장장치나 로컬 저장장치가 어떠한 드라이브 문자와 맵핑되었는지 알 수 있다.
 

 

[그림 8 - 연결된 저장장치와 드라이브 문자와의 맵핑 정보]

유니코드로 기록된 문자열을 읽어보면 USBSTOR#Disk&Ven_SAMSUNG&Prod_YP_PB2&Rev_1.00~ 이란 문자열이 나온다. 


[계정 정보]
계정 정보의 경우 SAM 키의 하위키에 존재하는데 SAM 키의 접근 권한은 시스템 계정뿐이 없다. 하지만 활성시스템에서 권한 상승을 하기란 여러모로 문제가 있어 대부분의 계정 정보는 포렌식 이미징에서 획득하는 것이 좋다.
포렌식 이미지에서 SAM 파일의 복사본을 파싱 할 수 있는 레지스트리 파싱 도구들이 몇가지 있다.
따로 툴들에 대해서는 다루지 않겠다. 또 구조에 대해서도 따로 다루지는 않겠다. 


[실행정보]
윈도우 키를 누르면 아래와 같이 자주 실행되는 프로그램이 나타나는데 이 기준은 실행 횟수이다.

[그림 9 - 자주 실행되는 애플리케이션]

이렇듯 윈도우는 자주 실행된 애플리케이션들을 기억하며 애플리케이션들의 정보도 레지스트리에 기록해 둔다.
아래는 이 정보들을 저장하는 키의 위치이다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorers\UserAssist\<GUID>\Count

위 키의 Value를 보면 XP의 경우 아래와 같은 Value를 볼 수 있으며 각 오프셋이 뜻하는 의미는 이미지에 설명 해 두었다.

[그림 10 - XP offset]

Vista/7의 경우는 조금 다르다.

[그림 11 - Vista/7 offset]

 
Vista/7의 경우 실행 횟수의 초기값이 어플리케이션마다 다르기 때문에 정확하게 파악하기는 힘들다. 





'[+] Forensic' 카테고리의 다른 글

윈도우 계정  (0) 2012.01.10
Registry (11)  (0) 2012.01.07
Registry (10)  (0) 2012.01.07
Registry (9)  (0) 2012.01.06
Registry (8)  (2) 2012.01.06
계속해서 포렌식적으로 의미있는 레지스트리들을 살펴보겠다.

[서비스 및 드라이버 목록]
이 정보는 라이브 리스폰스 단계에서 수집되는 정보이며, 레지스트리에서도 수집 할 수 있는 정보이다.
아래 키로 가면 서비스와 드라이버 목록들이 서브키로 나열되어 있다.
드라이버 목록과 서비스를 구별하는 방법은 각 서브키의 Value 중 type이란 Value의 값을 보면 판단 할 수 있다.

키 : HKLM\System\CurrentControlSet\Service

 [그림 1 - 레지스트리에서의 서비스 및 드라이버 목록]

Start Value 값에 따라 자동 시작되는 서비스가 될 수도 있고 안될 수도 있다.

* 타입별 자세한 설명은 http://support.microsoft.com/kb/103000 참조하기 바란다. 


[로그온 자동 시작점]
윈도우는 사용자가 로그온을 하면 HKCU 레지스트리 해당 사용자의 하이브 파일을 읽고 그 안에 있는 자동시작 항목등을 차례대로 실행한다. 사용자별 자동시작 프로그램 목록은 서로 다르며, 그 이유는 아래처럼 여러가지의 키가 존재하기 때문이다.

키 : HKLM\Software\Microsoft\Windows\CurrentVersion\Run
키 : HKLM\Software\Microsoft\Windows\CurrentVersion\Runonce

이 두 키의 경우 로그온한 사용자 상관없이 프로그램이 실행되게끔 하는 키이다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Run
키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Runonce

이 두 키의 경우 해당 사용자가 로그온 했을 때만 실행되게끔 하는 키이다.

그리고 Run, Runonce 서브키로 나뉘는 것을 볼 수 있는데 Run 키의 경우 시스템이 부팅될 때마다 실행시키는 키 이고,
Runonce는 한번만 실행되게끔 하는 키이다.

그리고 RunonceEx 라는 키가 HKLM과 HKCU에 또 존재한다. 이 키는 Runonce와 같은 성격의 키 이지만, 프로그램을 처리하는 방식이 다르다. Runonce의 경우 프로그램의 연관성을 무시하고 실행시키지만, RunonceEx의 경우 연관성 있는 프로그램끼리 그룹으로 묶어 처리하고, 처리 과정을 GUI 방식으로 사용자에게 보여 줄 수 있다.


[감사 정책]
다른 OS와 마찬가지로 윈도우도 시스템 내부에서 일어나는 여러 이벤트에 대한 보안 로그를 남긴다. 
보안 로그 기록의 기준이 감사 정책인데 관리자 도구를 이용해서도 알 수 있지만, 레지스트리에서도 알 수 있다.

키 : HKLM\Security\Policy\PolAdtEv
Value : (기본값)


Windows 버전마다 레지스트리에서의 감사정책별 offset이 다르다. 아래는 XP의 감사정책 별 오프셋 목록표 이다.

[그림 2 - 감사 정책별 offset(출처 : Forensic-Proof(FP-15-레지스트리-포렌식-분석.pdf))]

아래는 Win Vista/7의 감사 정책 별 offset이다.

[그림 3 - 감사 정책별 offset(출처 :  Forensic-Proof(FP-15-레지스트리-포렌식-분석.pdf)]


모든 버전의 윈도우들은 위 오프셋중에서 0을 제외한 나머지 오프셋의 값들은 아래와 같은 의미를 지닌다.

 - 0x00 : 감사 정책 없음
 - 0x01 : 성공 이벤트 감사
 - 0x02 : 실패 이벤트 감사
 - 0x03 : 성공, 실패 이벤트 감사 

감사별 자세한 항목은 아래 문서를 참조하면 된다.
 


[무선 네트워크 정보]
만약 공격자의 컴퓨터를 조사한다고 하였을 때 대부분의 용의자는 공개 AP등을 이용하여 자신의 위치정보를 속여 공격을 하려고 할 것이다. 이러한 이유를 근거로 공격자는 범죄 행위를 부인 할 것이며, 조사관은 공격자가 어느 장소에서 접속했다는 증거를 공격자에게 제시하여 공격자의 주장을 무효화 시킬 수 있다.. 이러한 경우 공격자의 컴퓨터에서 용의자가 접속한 AP 정보를 찾아야 하며 윈도우의 경우 레지스트리에 그 정보가 있다.
해당 정보는 아래의 키에 있다.

키(XP) : HKLM\Software\Microsoft\WZCSVC\Parameters\Interface\{GUID}
Value : Static#000X

키(Vista/7) : HKLM\Software\Micrsoft\Windows NT\NetworkList\Nla<Wireless, Signature, Profile>


XP의 경우 해당 Value의 데이터만 보면 SSID 문자열을 찾을 수 있다.
하지만 Vista/7의 경우 Profile과 GUID(Globally Unique Identification Number)등이 나눠져 있어 한번에 SSID를 찾기가 쉽지 않다. 아래에는 Vista/7에서 네트워크 정보에 관한 서브키들의 연관성을 보여주는 이미지이다.

 

[그림 4 - 각 서브키의 연관성]

해당 순서는 서브키의 값을 따라 이동한 순서로 아래에 이미지를 참고하면 이해가 갈 것이다.

[그림 5 - 서브키의 연관성 1번]

Wireless 서브키의 하위키의 이름이 무선 네트워크 식별자이며 Unmanaged와의 연관성으로 여러 정보를 확인 할 수 있다.
Unmanaged 하위키에서 찾고자 하는 무선 네트워크 식별자를 찾은 뒤 Value와 data를 확인 해 보면 아래와 같다.

[그림 6 - Unmanaged 키의 하위키 내용]

ProfileGuid의 data 값을 Profile 서브키에서 찾아 data를 보면 접속한 AP에 대한 정보가 나온다.
이 순서가 2번 순서이다.

[그림 7 - 무선 AP의 정보]

 

Value를 보면 AP의 이름과 마지막 접속 시간등이 나와 있다.

마지막 접속시간의 경우 hex값을 우리가 알아 볼 수 있는 시간으로 바꾸려면 아래와 같은 과정을 거쳐야 한다.

1. 기존의 값을 2바이트씩 끊어 Little Endian 방식을 적용하여 변경한 뒤 10진수로 바꿔준다.

[그림 8 - 10진수로 변환하는 python 코드]


2. 변환한 값을 각 자리가 뜻하는 것으로 맞추면 된다.

[그림 9 - 각 자리가 뜻하는 의미]

어디에 접속했는지 알았다면 이제는 접속했을 때의 정보를 알아야 한다. IP가 대표적이다.

각 네트워크 카드를 확인하여 해당 네트워크 카드에 할당된 네트워크 정보를 보면 된다.

키 : HKLM\Software\Microsoft\Windows NT\CurrentVersion\NetworkCards

 

[그림 10 - 네트워크 카드 GUID]

위 빨간색 박스안에 있는 문자열이 네트워크 카드 GUID이다. 해당 GUID를 아래 키에서 찾으면 된다.

키 : HKLM\System\CurrentControlSet\Service\Tcpip\Parameters\Interface\<GUID>

[그림 11 - 네트워크 카드에 할당 된 네트워크 정보]

Value 중에 DhcpIPAddress가 있는데 이것이 해당 네트워크카드에 dhcp가 할당해준 IP 주소이다.
이 Value 말고 IPAddress가 있을수도 있는데 이 Value는 사용자가 직접 수동으로 설정해준 IP주소를 뜻한다.

하지만 여기서 끝이 아니다. 위 처럼 사설아이피라면 모든 공유기와 연결지어도 말이 되기 때문에 증거로서 효력이 없다.
정확하게 특정한 AP와 아이피를 연결시켜야한다. 이는 DhcpNetworkHint에 나와있다.
DhcpNetworkHint Value의 data를 2자리씩 끊어 리틀엔디안으로 변환하면 다음과 같다.

 

[그림 12 - DhcpNetworkHint Value Little Endian]

이렇게 변환한 값을 가지는 Wireless의 서브키를 찾으면 된다.

 [그림 13 - DhcpNetworkHint Value Little Endian 값을 갖는 Wireless 서브키]

이런 후에 위에 AP찾는 방법을 이용하여 찾으면 모든 네트워크 정보가 연결 된다.

'[+] Forensic' 카테고리의 다른 글

Registry (11)  (0) 2012.01.07
Registry (10)  (0) 2012.01.07
Registry (9)  (0) 2012.01.06
Registry (8)  (2) 2012.01.06
Registry (7)  (0) 2012.01.04
지금까지 레지스트리의 구조와 레지스트리를 이루고 있는 하이브의 구조를 알아보았다.

하지만 레지스트리의 구조는 복잡하고 양은 너무 많아 포렌식적으로 접근하기에는 너무 무모한 감이 없지 않다.

또 어떠한 것을 의미하는지 아직 알려지지 않은 부분도 있어 정확하게 분석하기가 아직까지는 힘들다.

그렇기에 지금부터 알아보는 포렌식적 의미의 레지스트리를 잘 알아두어야 할 것이다.

* 참고 :  레지스트리는 윈도우 버전마다 조금씩 다른 부분이 있음. 

[시스템 정보]
시스템 정보는 컴퓨터 포렌식 조사에서 수집되어야 할 정보들 중 기본에 속하는 정보이다. 이 정보는 라이브 리스폰스 단계에서도 획득 할 수 있지만, 라이브 리스폰스를 수행할 시간이 없다거나 시스템이 해킹으로 인해 전원 차단 상황등에 놓이게 되면 정보를 획득하지 못한다. 이러한 경우에는 포렌식 이미징 레지스트리의 시스템 정보를 수집하면 된다. 라이브 리스폰스로 얻어지는 결과물도 결국 레지스트리를 통한 수집이기에 정보는 동일성을 갖는다.

키 : HKLM\Software\Microsoft\WindowsNT\CurrentVersion

[그림 1 - 레지스트리에서의 시스템 정보 수집]

위 레지스트리 키에서는 컴퓨터 이름이 제외되어 있는데 컴퓨터의 이름은 아래 키에 존재한다.

키 : HKLM\System\CurrentControlSet\ComputerName\ActiveComputerName
Value : ComputerName


 [그림 2 - 레지스트리에서의 컴퓨터 이름 수집]

컴퓨터의 이름은 단일 컴퓨터를 대상으로 하는 포렌식 조사에서는 의미가 없어보이지만, 네트워크를 대상으로 하는 포렌식 조사에서는 컴퓨터와 컴퓨터간의 연결에서 컴퓨터 이름으로 로그가 남기 때문에 컴퓨터 간의 관계를 밝히기 위해 필요하다. 


[시간 정보 수집]
시간정보도 시스템 정보와 마찬가지로 기본적으로 수집해야 할 정보이다. 하지만 수집한 시간의 무결성 여부는 확정짓지 못한다. 악성코드나 해커가 시스템의 시간을 수정하지 않았다고 확정지을 수 없기 때문이다.
시간 정보 수집은 두가지로 나뉘는데 시스템이 사용하는 표준 시간대 정보 수집과 시스템의 현재 시간 정보 수집으로 나뉜다. 표준 시간대의 경우 레지스트리로 수집이 가능하지만 현재 시간 정보는 메모리에서만 수집이 가능하다.
현재 시간을 변경하였다는 정확한 증거는 아직까지 수집할 수 없지만, 언제 시스템 현재 시간을 담당하는 애플릿에 접근하였는지는 레지스트리를 통해 알 수 있다.
애플릿에 접근하는 방법은 두가지이며, 제어판을 통해서 접근하는 것과 시작표시줄에서 접근하는 방법이 있다.
하지만 레지스트리에는 작업표시줄로 접근하는 횟수만 기록이 된다.
일단 표준 시간대가 기록된 레지스트리는 아래와 같다.

키 : HKLM\System\CurrentControlSet\control\TimeZoneInformation
Value : StandardName 


[그림 3 - 레지스트리에서의 표준시간대 정보]


그리고 다음은 현재 시간을 수정하기 위해 언제 접근하였는지 보여주는 레지스트리이다.

키 : HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\UserAssist\{75048700-EF1F-11D0-9888-006097DEACF9}\count
Value : HRZR_EHAPCY:gvzrqngr.pcy Value 


[그림 4 - 레지스트리에서의 시간정보 수정 횟수 정보]

위 value를 더블클릭하면 아래 이미지와 같이 나오는데 각 오프셋이 뜻하는 의미를 함께 표시 해 두었다.

[그림 5 - HRZR_EHAPCY:gvzrqngr.pcy Value]

위 이미지를 보면 수정 횟수가 "0x00000008" 로 되어 있는데 이 부분의 기본값은 "0x00000005" 이기 때문에 이 값을 현재 값에서 빼주어야 실제 접근 횟수가 나온다. 그러므로 위에서의 접근 횟수는 3이다.

 
Win7의 경우 이 Value가 존재하지 않는데, 정확한 이유는 모르지만 개인적으로는 작업표시줄로 시간정보를 수정 할 수 없어 해당 Value가 생성되지 않는 것 같다.

* 참고 : HRZR_EHAPCY:gvzrqngr.pcy(ROT-13) --> UEMERUNCPL:timedate.cpl


[마지막으로 로그온한 사용자]
하나의 시스템을 여러사람이 공동으로 사용한다면 마지막으로 로그온한 사람의 정보는 매우 중요한 정보가 될 수 있다.

키 : HKLM\Software\Microsoft\Windows NT\CurrentVersion\Winlogon
Value : DefaultUserName


[그림 6 - 레지스트리에서의 마지막 로그온 사용자 정보]


[시스템 마지막 종료 시간]
시스템 마지막 종료시간은 ControlSetXXX 마다 다를 수 있고 같을 수도 있다.

키 : HKLM\System\ControlSetXXX\control\windows
Value : ShutdownTime


[그림 7 - 레지스트리에서의 마지막 종료 시간 정보]


[공유 목록]
윈도우는 기본적으로 공유목록이 있으며, 예전 윈도우들은 이 공유목록을 통해 해킹을 당하기도 했었다(XP SP2 이전)
하지만 지금은 패치가 되어 그러한 일은 거의 없다. 공유 목록은 라이브 리스폰스 단계에서도 얻을 수 있는 정보이며, 레지스트리로 이와 같은 정보를 얻기 위해서는 아래와 같은 키로 가면 된다. 하지만, 이 키는 사용자가 직접 추가한 공유목록만 보여주고 윈도우가 기본적으로 지원하는 공유 목록은 보여주지 않는다.
하지만 윈도우에서 기본적으로 지원하는 공유 목록은 정해져 있기 때문에 아래 레지스트리 키를 참고하므로써 사용자가 직접 추가한 목록과 기본 목록을 구별 할 수 있게 된다.

키 : HKLM\System\CurrentControlSet\Service\lanmanserver\Shares
Value : <공유 폴더의 이름>


[그림 8 - 레지스트리에서의 공유 폴더 목록 정보(사용자가 추가한)]

만약 명령 프롬포트로 공유 목록을 확인하지 못하는 상황이라면 위 키의 value만으로 윈도우에서 기본적으로 지원하는 공유 목록을 알 수 없다. 이러한 경우 아래 키의 Value 중 AutoShareServer가 있는지 확인하고, 있다면 1로 설정되어 있는지 0으로 설정되어 있는지 확인하면 된다.

키 : HKLM\System\CurrentControlSet\Service\lanmanserver\parameters
Value : AutoShareServer


만약 value가 있는데 0으로 설정되어 있다면 기본적인 공유목록은 비활성화 상태인 것이고, 1이거나 이 Value가 없다면 활성화 상태인 것이다. 


'[+] Forensic' 카테고리의 다른 글

Registry (10)  (0) 2012.01.07
Registry (9)  (0) 2012.01.06
Registry (8)  (2) 2012.01.06
Registry (7)  (0) 2012.01.04
Registry (6)  (0) 2012.01.04
  1. 익명 2012.08.08 18:25

    비밀댓글입니다

    • Favicon of https://maj3sty.tistory.com BlogIcon MaJ3stY 2012.08.08 12:31 신고

      음 거기까지는 잘 모르겠네요. 레지스트리를 통해서 암호 설정 여부까지 판단해야 하는 상황이 흔치 않은데..

지금까지는 레지스트리의 구조를 알아 봤다면 이젠 각 하이브들의 구조를 알아볼 차례이다.

하이브의 구조를 파악함으로써 비할당영역이나, 메모리등에서 하이브를 추출(카빙)할 수 있게 되고, 해당 하이브가 어떠한 이름을 가지고 있는지 어떠한 데이터를 가지고 있는지 파악 할 수 있게 된다.

하이브의 파일 구조 베이스블록, 하이브빈, 셀, 셀맵으로 이루어져 있다.

이해가 빠르도록 그림으로 표현하자면 아래와 같다.

[그림 1 - 하이브 가식화]

이제 위에서 나온 것들을 하나씩 상세히 분석할 것이다.

[블록]
하이브는 파일 시스템이 클러스터라 불리는 논리적 저장 단위를 사용하는 블록이라는 논리적 단위를 사용한다.
블록의 크기는 4킬로바이트이며, NTFS에서의 일반적인 클러스터 크기와 같다.
파일시스템의 경우 클러스터가 4킬로 바이트일 경우 모든 파일의 물리적 크기가 4킬로바이트씩 증가하고, 클러스터가 1비트이면 파일의 물리적 크기가 1비트씩 증가하지만, 하이브는 파일의 크기 증가 기준이 논리적 바이트이기 때문에 언제나 4바이트씩 증가한다.



[베이스 블록]
하이브의 첫번째 블록이며, 하이브의 여러 정보들이 들어있다. 베이스 블록은 하이브의 시작이 되는 부분이기 때문에 하이브 헤더 역할을 한다. 하지만 아직까지 완벽히 연구된 영역이 아니기 때문에 각 오프셋이 뭘 의미하는지 모두 알수는 없다.
아래는 지금까지 알려진 오프셋에 대해서 강조하여 놓은 것이다.

[그림 2 - 베이스 블록 offset]

애매모호한 offset 설명은 제외하였다. 


[하이브 빈]
레지스트리는 4kb를 기준으로 증가하는 동시에 내부에서 4kb크기의 하이브 빈이라는 논리적 단위를 생성한다.
블록과 하이브 빈의 크기는 4kb로 동일하기 때문에 블록하나가 하이브 빈 하나를 구성할 수도 있고 여러 블록이 하이브 빈 하나를 구성 할 수도 있다. 하이브 빈은 하이브의 크기를 결정짓는 블록과 다르게 하이브의 논리적 구조를 결정짓는 요소로 작용한다. 또 베이스 블록은 시그니처가 달라 하이브 빈이라고 부르지 않는다. 각각의 하이브 빈은 다음 하이브 빈까지의 상대적 거리를 저장하고 있으며, 윈도우는 레지스트리를 읽어들일 때 하이브 빈을 기본 단위로 삼는다. 셀이라는 논리적 단위를 사용하게 되면 잦은 호출로 인해 시스템의 속도저하를 일으킬 수 있고 단편화가 발생 할 수 있다. 이러한 이유로 윈도우에서는 빈 하이브 빈이 생기면 인접 하이브 빈과 결합시키고, 마지막 하이브 빈이 비게 되면 하이브를 축소시킨다.
참고로 하이브 빈의 크기는 가변적이다.

[그림 3 - 하이브 빈의 offset]

위 하이브의 크기를 보면 0x00001000의 값을 가지고 있는데 이는 10진수로 4096이다.
기본적인 크기로 생성되었음을 알 수 있다.


[셀 맵]
셀 맵은 레지스트리를 불러올 시 매번 접근하지 않기 위해서 사용하는 것이다.
하이브의 일부분을 메모리에 맵핑하여 메모리 내의 불연속적인 하이브 데이터를 참조하기 위해 셀 맵을 사용 함.
아래 그림은 셀 맵을 가식화 한 것이다.

[그림 4 - 셀 맵 가식화(출처 : Forensic-Proof(FT-15-레지스트리-포렌식-분석.pdf))] 



'[+] Forensic' 카테고리의 다른 글

Registry (8)  (2) 2012.01.06
Registry (7)  (0) 2012.01.04
Registry (6)  (0) 2012.01.04
Registry (5)  (0) 2012.01.04
Registry (4)  (0) 2012.01.03

+ Recent posts