본문 바로가기

Kitri_NCS3기 보안과정/디지털포렌식

170621 NTFS - MFT Entry 속성의 종류별 분석

속성의 종류별 분석 



$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 

파일 생성 시간 

Modified Time 

0x08 

파일 수정 시간 

MFT Modified Time 

0x10 

MFT 수정 시간 

Accessed Time 

0x18 

마지막 접근 시간 

Flags 

0x20 

해당 파일의 특성

플래그값

설명 

0x0001

읽기 전용(Read Only) 

0x0002

숨김 (Hidden) 

0x0004

시스템(System) 

0x0020

Archive 

0x0040

장치(Device) 

0x0080

일반(Normal) 

 

 Maximum number of version

0x24 

파일에 허용되는 최대 버전, 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 

해당 파일의 특성

플래그값

설명 

0x0001

읽기 전용(Read Only) 

0x0002

숨김 (Hidden) 

0x0004

시스템(System) 

0x0020

Archive 

0x0040

장치(Device) 

0x0080

일반(Normal) 

0x0100

임시(Temporary) 

0x0200 

Sparse 파일

0x0400 

Reparse Point 

0x0800 

압축됨

0x1000 

오프라인

0x2000 

인덱스에 담긴 내용이 아님

0x4000 

암호화 됨

0x10000000

Directory 

0x20000000

Index View 

 

Reparse Value

0x3C 

4

 Reparse Point를 담고있다. 어떤 형태의 Reparse Type인지 나타냄

이름의 길이 

0x40 

1

File name 속성이 담고 있는 이름의 길이 

이름의 형식 

(Name Space)

0x41 

1

File name 속성이 담고 있는 이름의 형식 

Name space

 형식

설명 

 0

POSIX 

Null 문자와 '/' 문자를 제외한 모든 문자 사용 가능하며 문자 길이는 255자 이다.

 1

Win32 

Null 문자 , /, \,:,>,<,? 를제외한 모든 문자 사용가능 파일이름이 '.' 이나 공백으로 끝나선 안된다. 

 2

DOS 

대문자만 가능. 대부분의 특수문자 사용 불가, 최대 파일명 8자, 확장자 3자까지 가능 

 3

Win32&DOS 

원래 파일 이름이 DOS 형식에 맞아서 2개의 이름을 저장할 필요가 없을 경우 여기에 해당한다.

이름 

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의 할당 정보와 일치하는걸 알 수 있다.