속성의 종류별 분석
$STANDARD_INFORMATION ( = 0x10 = Type number : 16 )
- 모든 파일과 디렉토리에 존재
- 파일의 생성 시간과 날짜, 소유자와 보안, 할당량에 관한 정보를 담고있다.
- 가장 맨앞에 위치함
- Base MFT Entry에만 존재
- 크기가 변하지않음 = 항상 Resident
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
속성의 헤더 | |||||||||||||||
Creation Time | Modified Time | ||||||||||||||
MFT Modified Time | Accessd Time | ||||||||||||||
Flags | Maximum number of version | Version Number | Class ID | ||||||||||||
Owner ID | Security ID | Quota Charged | |||||||||||||
Update Sequence Number |
|
|
|
|
|
|
|
|
Name | Offset | 길이(byte) | 설명 | ||||||||||||||
Creation Time | 0x00 | 8 | 파일 생성 시간 | ||||||||||||||
Modified Time | 0x08 | 8 | 파일 수정 시간 | ||||||||||||||
MFT Modified Time | 0x10 | 8 | MFT 수정 시간 | ||||||||||||||
Accessed Time | 0x18 | 8 | 마지막 접근 시간 | ||||||||||||||
Flags | 0x20 | 4 | 해당 파일의 특성
| ||||||||||||||
Maximum number of version | 0x24 | 4 | 파일에 허용되는 최대 버전, 0이면 비활성화 | ||||||||||||||
Version Number | 0x28 | 4 | 파일의 버전을 담고 있다. maximum number of version이 0 이면 이 값도 0 | ||||||||||||||
Class ID | 0x2c | 4 | Windows가 NTFS를 관리하는 정보인 Class ID를 담고있다. | ||||||||||||||
Owner ID | 0x30 | 4 | 해당 파일의 소유자 ID를 담고 있다. 0이면 비활성화 | ||||||||||||||
Security ID | 0x34 | 4 | $Secure 파일에 있는 $Sll index와 $SDS Data Stream 에 사용되는 값이다. | ||||||||||||||
Quota Charged | 0x38 | 8 | 사용자의 제한량에서 이 파일이 얼마나 차지하는지 나타낸다. 보통 파일의 크기가 있음. | ||||||||||||||
Update Secuence Number | 0x40 | 8 | 해당 파일의 마지막 업데이트 정보를 가지고 있다. $UsnJnrl 파일을 조사할때 사용 |
실습용으로 생성된 파일의 MFT 파일의 Creation, Modified, MFT Changed, Last Access 시간을 확인해 보았다.
Decode로 시간값을 검출해보고 NTFS Walker로 확인해본 결과 생성시간이 일치했다.
$FILE_NAME ( = 0x30 = Type number : 48 )
- 파일이나 디렉토리의 이름을 담는 속성
00 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 | 13 | 14 | 15 |
속성의 헤더 | |||||||||||||||
부모 디렉토리의 File Reference Address | Creation Time | ||||||||||||||
Modified Time | MFT Modified Time | ||||||||||||||
Accessed Time | 파일의 할당크기 | ||||||||||||||
파일의 실제 크기 | Flag | Reparse Value | |||||||||||||
이름의길이 | 이름의 형식 | 이름 (가변적 길이) ~ |
Name | Offset | 길이(byte) | 설명 | ||||||||||||||||||||||||||||||||
부모 디렉토리의 File Reference Address | 0x00 | 8 | 자신을 담고있는 디렉토리의 주소 | ||||||||||||||||||||||||||||||||
Creation Time | 0x08 | 8 | 파일 생성 시간 | ||||||||||||||||||||||||||||||||
Modified Time | 0x10 | 8 | 파일 수정 시간 | ||||||||||||||||||||||||||||||||
MFT Modified Time | 0x18 | 8 | MFT 수정 시간 | ||||||||||||||||||||||||||||||||
Accessed Time | 0x20 | 8 | 마지막 접근 시간 | ||||||||||||||||||||||||||||||||
파일의 할당 크기 | 0x28 | 8 | 해당 파일에 할당된 크기를 나타냄 | ||||||||||||||||||||||||||||||||
파일의 실제 크기 | 0x30 | 8 | 해당 파일의 실제 사용 크기를 나타냄 | ||||||||||||||||||||||||||||||||
Flags | 0x38 | 4 | 해당 파일의 특성
| ||||||||||||||||||||||||||||||||
Reparse Value | 0x3C | 4 | Reparse Point를 담고있다. 어떤 형태의 Reparse Type인지 나타냄 | ||||||||||||||||||||||||||||||||
이름의 길이 | 0x40 | 1 | File name 속성이 담고 있는 이름의 길이 | ||||||||||||||||||||||||||||||||
이름의 형식 (Name Space) | 0x41 | 1 | File name 속성이 담고 있는 이름의 형식
| ||||||||||||||||||||||||||||||||
이름 | 0x42~ | 가변 | File name 속성이 담고 있는 이름, UTF-16으로 인코딩 |
구조체 대로 마지막에 가변적인 크기로 파일의 이름이 온다. $MFT를 열어본 결과 $MFT가 들어가있음을 확인했다.
$DATA ( = 0x80 = Type number : 128)
- 파일의 내용을 담고 있는 속성
- 속성 헤더가 Resident 이냐 non-Resident 이냐에 따라 데이터가 저장되는 위치가 다르다.
(Resident라면 속성 헤더 다음에 데이터가 위치할 것이고, non-Resident라면 다른 곳에 데이터를 저장하고 그곳의 위치 정보를 속성의 구조체 요소중 runlist에 기록해 놓는다.)
ADS (Alternate Data Stream)
기본적으로 존재하는 속성 외에 같은 이름의 속성이 또 나오면 ADS라 한다. ADS는 이름을 지정해 주어야 한다.
파일에 값을 숨겨정의할 수 도 있다. 파일이나 디렉토리에 추가 가능한데 , 디렉토리에 추가할 경우 찾기 어렵다.
echo "내용" > 파일.확장자:이름
텍스트 파일을 하나 생성해서 ADS 값을 추가해보겠다. 처음 생성하고 확인했을 때는 그냥 ADStest.txt로 나온다.
echo ADS is here! > ADStest.txt:ADS ( : 을 주면 ADS 추가한다는 의미)
dir /r (ads 값 여부 확인가능)
ADS값을 추가하고 dir /r로 확인해보니 :ADS:%DATA가 추가로 생성된걸 확인했다.
보통 하나의 파일에 세개의 속성이 들어가는데 세개의 속성의 구조체가 끝나고 또다시 속성이 붙는 경우가 있다. 이런 경우 ADS 값이 정의되어 있는 것이다. $DATA로 표시되어 있으니 ADS로 0x80의 $DATA 속성이 추가된듯 하다.
HxD로 확인해보니 0x80 00 00 00 의 속성이 하나 더 붙어있는걸 확인했다. 이부분에 우리가 ADS 로 정의해놓은 ADS is here ! 문자열을 확인 할 수 있었다.
more < pw.txt:ADS (real 값 확인가능)
원래 출력되는 ADStest,txt의 내용과 ADS값으로 주어지는 ADStest.txt:ADS 의 차이를 확인 할 수 있었다.
type hihi.txt > pw.txt:real (파일을 ads에 추가)
파일단위로 ADS의 내용을 추가 할 수 도 있는데 b.txt 의 내용을 통채로 ADStest.txt:b 에 넣었다.
dir 로 확인해보니 b의 이름을가진 ADS가 추가 되었음을 확인 할 수 있었다.
이런식으로 ADS 는 파일의 부가적인 정보를 표시하는데 사용되는등 여러 형태로 사용될 수 있다. 하지만 악성코드를 심는 용도로도 사용 할 수 있다는걸 알아둬야 한다.
$Bitmap ( = 0xB0 = Type Number : 176 )
- 할당 정보를 관리한다.
$Bitmap 에는 비슷한 종류가 두가지 있다.
MFT Entry 예약영역 중 한자리를 차지하는 $Bitmap이 있고, MFT 내부에 속성으로 존재하는 Bitmap이 있다.
MFT Entry 중 하나인 Bitmap
$MFT 의 속성중 하나로 들어가 있는 Bitmap
이 두 bitmap이하는 일은 결국엔 할당정보를 관리하므로 하는 일은 같다고 볼수 있지만, 그 적용 대상이 다른것이다.
MFT Entry의 예약영역에 들어가는 Bitmap은 전체 클러스터의 할당 정보를 관리하고 , MFT의 속성으로 들어가는 Bitmap은 MFT의 할당정보를 관리하는 속성이다.
할당정보는 위와 같이 표기 된다. 이부분은 MFT 의 속성으로 들어가있는 Bitmap이기 때문에 Entry의 할당 정보를 나타낸다.
할당 정보는 비트단위로 표기되는데 한 비트에 하나의 엔트리가 할당된다.
F0 의 경우 1111 0000 ↓ 7 6 5 4 3 2 1 0 1 1 1 1 0 0 0 0 |
FF FF 00 FF FF 의 경우
1111 1111 1111 1111 0000 0000 1111 1111 1111 1111 이다. 0으로 표기되어있는 16~23번째(0부터 시작함) 까지는 Entry가 비어있을 것이다.
NTFSWalker로 확인해본 결과 16~23의 Entry영역이 사용중이지 않다 Bitmap의 할당 정보와 일치하는걸 알 수 있다.
'Kitri_NCS3기 보안과정 > 디지털포렌식' 카테고리의 다른 글
Ext File System -1- (0) | 2017.07.04 |
---|---|
170626 윈도우 포렌식 - 레지스트리 (0) | 2017.06.26 |
170620 NTFS의 구조 (0) | 2017.06.20 |
170619 배치파일로 데이터 수집하기 (0) | 2017.06.19 |
170619 휘발성/비휘발성 정보 수집 (0) | 2017.06.19 |