FORENSIC INSIGHT SEMINAR A Dig into the $LogFile blueangel blueangel1275@gmail.com http://blueangel-forensic-note.tistory.com
목차 1. 서론 2. $LogFile 구조 3. $LogFile 이벤트분석 4. $LogFile Parser 구현 5. 결론 forensicinsight.org Page 2 / 51
서론 - $LogFile 이란? - $LogFile 크기조절 forensicinsight.org Page 3 / 51
서론 $LogFile 이란? NTFS 트랜젝션로그파일 시스템오류나갑작스런전원차단발생시, 작업중이던파일복구를위해사용 모든트랜젝션작업을레코드단위로기록 새로운파일 / 디렉토리생성 파일 / 디렉토리삭제 파일 / 디렉토리내용변경 MFT 엔트리내용변경 각작업레코드는고유의 LSN($LogFile Sequence Number) 을가짐 순차적으로증가 복구를위해각레코드는작업데이터와작업전데이터를가짐 Redo : 작업한데이터 Undo : 작업전데이터 각볼륨마다하나씩존재 MFT 엔트리번호 2 에위치 forensicinsight.org Page 4 / 51
서론 - $LogFile 이란? - $LogFile 크기조절 forensicinsight.org Page 5 / 51
서론 $LogFile 크기조절 $LogFile 크기 일반적인하드디스크볼륨에서는 64M 크기 볼륨용량에따라크기가달라질수있지만기본적으로는최대 64M 이하임 크기조절 chkdsk 명령의 /L 옵션에따라크기조절가능 /L : 파일크기 (KB 단위 ) 형식으로지정 크기가지정되지않으면현재크기표시 forensicinsight.org Page 6 / 51
$LogFile 구조 - 전체구조 - 재시작영역구조 - 로깅영역구조 - 페이지구조 - 레코드구조 forensicinsight.org Page 7 / 51
$LogFile 구조 전체구조 재시작영역 (Restart Area) 와로깅영역 (Logging Area) 로나누어짐 각영역의구성단위는페이지 ( 크기 : 0x1000) 재시작영역 가장마지막 ( 현재작업중인 ) 작업레코드를가리킴 파일의첫두페이지영역 (0x0000~0x2000) 로깅영역 실제작업레코드들이기록됨 재시작영역바로다음부터시작 (0x2000~) 버퍼페이지영역과일반페이지영역으로나누어짐 forensicinsight.org Page 8 / 51
$LogFile 구조 - 전체구조 - 재시작영역구조 - 로깅영역구조 - 페이지구조 - 레코드구조 forensicinsight.org Page 9 / 51
$LogFile 구조 재시작영역구조 가장마지막 ( 현재작업중인 ) 작업레코드를가리킴 Current LSN 정보를통해가장마지막작업레코드의 LSN 번호를알수있음 연속된두페이지로구성, 두번째페이지는백업용 각페이지는매직넘버 (RSTR) 로시작됨 재시작영역헤더포멧 0 1 2 3 4 5 6 7 8 9 A B C D E F RSTR (Magic Number) Update Sequence Offset Update Sequence Count Check Disk LSN System Page Size Log Page Size Restart Offset Minor Version Major Version Update Sequence Array Current LSN Log Client Client List Flags forensicinsight.org Page 10 / 51
$LogFile 구조 - 전체구조 - 재시작영역구조 - 로깅영역구조 - 페이지구조 - 레코드구조 forensicinsight.org Page 11 / 51
$LogFile 구조 로깅영역구조 실제작업레코드들이기록됨 버퍼페이지영역과일반페이지영역으로나누어짐 버퍼페이지영역 첫두페이지 (0x2000~0x4000) 순차적으로레코드가기록됨 페이지가레코드로꽉차면페이지내용을일반페이지영역에기록 최근작업레코드들은버퍼페이지영역에존재 일반페이지영역 버퍼페이지영역을제외한나머지영역 (0x4000~) 순차적으로레코드가기록됨 파일끝까지기록되면다시영역앞에서부터덮어씀 forensicinsight.org Page 12 / 51
$LogFile 구조 - 전체구조 - 재시작영역구조 - 로깅영역구조 - 페이지구조 - 작업레코드구조 forensicinsight.org Page 13 / 51
$LogFile 구조 페이지구조 페이지구성 하나의헤더와다수의작업레코드들로구성됨 마지막레코드가페이지를넘어가면다음페이지에이어서기록됨 페이지헤더 : 페이지의메타데이터가저장됨 Magic Number : RCRD Last LSN : 페이지를넘어가는레코드를포함해서가장큰 LSN Next Record Offset : Last LSN에해당하는레코드의페이지내 Offset Last End LSN : 페이지를넘어가지않는레코드들중에가장큰 LSN 0 1 2 3 4 5 6 7 8 9 A B C D E F RCRD (Magic Number) Update Sequence Offset Update Sequence Count Last LSN or File Offset Flags Page Count Page Position Next Record Offset Word Align DWord Align Last End LSN Update Sequence Array forensicinsight.org Page 14 / 51
$LogFile 구조 - 전체구조 - 재시작영역구조 - 로깅영역구조 - 페이지구조 - 작업레코드구조 forensicinsight.org Page 15 / 51
$LogFile 구조 작업레코드구조 작업레코드 실제트랜젝션작업의내용이기록됨 여러작업레코드가순차적으로모여서하나의트랜젝션작업을이룸 Check Point Record : 트랜젝션시작레코드 Update Record : 중간작업레코드 Commit Record : 트랜젝션마지막레코드 Check Point Record 외레코드들은자신의이전작업레코드의 LSN 을가지고있음 forensicinsight.org Page 16 / 51
$LogFile 구조 작업레코드구조 작업레코드 ( 계속 ) 작업레코드구성 : 레코드헤더와데이터로구성됨 레코드헤더 : 레코드메타데이터저장, 고정크기 (0x58) 레코드데이터 Redo : 작업후내용 ( 예 : 쓰기작업이면쓰여진데이터 ) Undo : 작업전내용 ( 예 : 쓰기작업이면쓰여지기전데이터 ) 에러복구시의작업내용 Commit Record 부터이전 LSN 정보를이용, 역으로추적하면서 Undo 데이터적용 forensicinsight.org Page 17 / 51
$LogFile 구조 작업레코드구조 작업레코드헤더포멧 This LSN : 현재작업레코드의 LSN Previous LSN : 이전작업레코드의 LSN Client Undo LSN : 복구시, 다음 Undo 작업을가지고있는레코드의 LSN, 보통 Previous LSN과동일 Client Data Length : 레코드의크기, Redo Op 시작위치부터이값을더하면레코드끝을구할수있음 Record Type : 0x02 (Check Point Record), 0x01( 그외 Record) Flags : 0x01( 현재레코드가페이지를넘어감 ), 0x00( 현재레코드가페이지를넘어가지않음 ) 0 1 2 3 4 5 6 7 8 9 A B C D E F This LSN Previous LSN Client Undo LSN Client Data Length Client ID Record Type Transaction ID Flags Alignment or Reserved Redo OP Undo OP Redo Offset Redo Length Undo Offset Undo Length Target Attribute LCNs to follows Record Offset Attr Offset MFT Cluster Index Alignment or Reserved Target VCN Alignment or Reserved Target LCN Alignment or Reserved forensicinsight.org Page 18 / 51
$LogFile 구조 작업레코드구조 작업레코드헤더포멧 ( 계속 ) Redo Op : Redo 연산코드 Undo Op : Undo 연산코드 Redo Offset : Redo 데이터시작 Offset(Redo Op 위치부터 ) Redo Length : Redo 데이터길이 Undo Offset : Undo 데이터시작 Offset(Redo Op 위치부터 ) Undo Length : Undo 데이터길이 0 1 2 3 4 5 6 7 8 9 A B C D E F This LSN Previous LSN Client Undo LSN Client Data Length Client ID Record Type Transaction ID Flags Alignment or Reserved Redo OP Undo OP Redo Offset Redo Length Undo Offset Undo Length Target Attribute LCNs to follows Record Offset Attr Offset MFT Cluster Index Alignment or Reserved Target VCN Alignment or Reserved Target LCN Alignment or Reserved forensicinsight.org Page 19 / 51
$LogFile 구조 작업레코드구조 작업레코드헤더포멧 ( 계속 ) LCNs to Follows : 0x01( 이어지는레코드가있음 ), 0x00( 이어지는레코드가없음 ) Record Offset MFT 레코드에대한작업일경우, Redo/Undo 데이터가적용되는속성의 MFT 레코드내 Offset MFT 레코드에대한작업이아닌경우, 값은 0x00 Attr Offset MFT 레코드에대한작업일경우, Redo/Undo 데이터가적용되는속성내 Offset MFT 레코드에대한작업이아닌경우, Redo/Undo 데이터가적용되는클러스터내 Offset Taret LCN : Redo/Undo 데이터가적용되는디스크상의 LCN(Logical Cluster Number) MFT Cluster Index : MFT 엔트리가있는하나의클러스터내에서몇번째엔트리에해당하는지에대한값 1번째 (0x0000), 2번째 (0x0002), 3번째 (0x0003), 4번째 (0x0006) 0 1 2 3 4 5 6 7 8 9 A B C D E F This LSN Previous LSN Client Undo LSN Client Data Length Client ID Record Type Transaction ID Flags Alignment or Reserved Redo OP Undo OP Redo Offset Redo Length Undo Offset Undo Length Target Attribute LCNs to follows Record Offset Attr Offset MFT Cluster Index Alignment or Reserved Target VCN Alignment or Reserved Target LCN Alignment or Reserved forensicinsight.org Page 20 / 51
$LogFile 구조 작업레코드구조 Redo/Undo 연산코드 NTFS 로그동작 Noop CompensationlogRecord InitializeFileRecordSegment DeallocateFileRecordSegment WriteEndofFileRecordSegement CreateAttribute DeleteAttribute UpdateResidentValue UpdataeNonResidentValue UpdateMappingPairs DeleteDirtyClusters SetNewAttributeSizes Hex Value 0x00 0x01 0x02 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A 0x0B forensicinsight.org Page 21 / 51
$LogFile 구조 작업레코드구조 Redo/Undo 연산코드 ( 계속 ) AddindexEntryRoot DeleteindexEntryRoot AddIndexEntryAllocation SetIndexEntryVenAllocation UpdateFileNameRoot UpdateFileNameAllocation SetBitsInNonresidentBitMap ClearBitsInNonresidentBitMap PrepareTransaction CommitTransaction ForgetTransaction OpenNonresidentAttribute DirtyPageTableDump TransactionTableDump UpdateRecordDataRoot 0x0C 0x0D 0x0F 0x12 0x13 0x14 0x15 0x16 0x19 0x1A 0x1B 0x1C 0x1F 0x20 0x21 forensicinsight.org Page 22 / 51
$LogFile 이벤트분석 - 파일생성이벤트 - 파일삭제이벤트 - 파일데이터작성 / 수정이벤트 - 파일명변경이벤트 forensicinsight.org Page 23 / 51
$LogFile 이벤트분석 파일생성이벤트 Resident File 생성관련이벤트 Resident File 생성이벤트순서 (Redo/Undo) : 중간에들어갈수있는 OpenNonResidentAttribute Redo 작업은무시 1. 0x15/0x16(Set Bits In Nonresident Bit Map/Clear Bits In Nonresident Bit Map) 2. 0x00/0x03(Noop/Deallocate File Record Segment) 3. 0x0E/0x0F(Add Index Entry Allocation/Delete Index Entry Allocation) 4. 0x02/0x00(Initialize File Record Segment/Noop) 5. 0x1B/0x01(Forget Transaction/Compensation Log Record) forensicinsight.org Page 24 / 51
$LogFile 이벤트분석 파일생성이벤트 Resident File 생성관련이벤트에서얻어올수있는정보 1 MFT 레코드번호, 생성파일전체경로 0x15/0x16(Set Bits In Nonresident Bit Map/Clear Bits In Nonresident Bit Map) 작업의 Redo 데이터에서얻어옴 Redo 데이터의첫 4 바이트는작업대상 MFT 레코드번호임 MFT 레코드번호를통해해당파일의정보를가져올수있음 해당 MFT 레코드의 $FILE_NAME 속성에서생성파일명획득 MFT 번호를알면 MFT 해석을통해생성된파일의전체경로를가져올수있음 Current LSN Previous LSN Redo Op Undo Op forensicinsight.org Page 25 / 51
$LogFile 이벤트분석 파일생성이벤트 Resident File 생성관련이벤트에서얻어올수있는정보 2 파일생성시간과생성파일명, 전체경로 0x02/0x00(Initialize File Record Segment/Noop) 작업의 Redo 데이터에서얻어옴 Redo 데이터내용은 MFT 레코드의내용 $STANDARD_INFORMATION 속성에서파일생성시간을가져옴 $FILE_NAME 속성에서생성파일의이름을가져옴, Parent File Reference Address 값을통해부모디렉토리와전체경로를알수있음 $INDEX_ROOT 속성이있다면디렉토리생성임 Current LSN Previous LSN Redo Op Undo Op Redo Data forensicinsight.org Page 26 / 51
$LogFile 이벤트분석 파일생성이벤트 Non Resident 파일생성이벤트 Resident 파일과동일 MFT 레코드할당하는것에서는 Resident 파일생성작업과차이없음 Resident 파일생성경우와동일하게정보획득가능 forensicinsight.org Page 27 / 51
$LogFile 이벤트분석 파일생성이벤트 긴파일명의파일생성일경우 0x0E/0x0F(Add Index Entry Allocation/Delete Index Entry Allocation) 작업을한번더반복함 긴파일명이기때문에 Index Entry 를하나더할당 파일명을가져올경우, 두번째 $FILE_NAME 속성에서가져옴 forensicinsight.org Page 28 / 51
$LogFile 이벤트분석 - 파일생성이벤트 - 파일삭제이벤트 - 파일데이터작성 / 수정이벤트 - 파일명변경이벤트 forensicinsight.org Page 29 / 51
$LogFile 이벤트분석 파일삭제이벤트 Resident File 삭제관련이벤트 Resident File 삭제이벤트순서 (Redo/Undo) : 중간에들어갈수있는 OpenNonResidentAttribute Redo 작업은무시 1. 0x0F/0x0E(Delete Index Entry Allocation/Add Index Entry Allocation) 2. 0x03/0x02(Deallocation File Record Segment/Initialize File Record Segment) 3. 0x16/0x15(Clear Bits In Nonresident Bit Map/Set Bits In Nonresident Bit Map) 4. 0x1B/0x01(Forget Transaction/Compensation Log Record) forensicinsight.org Page 30 / 51
$LogFile 이벤트분석 파일삭제이벤트 Resident File 삭제관련이벤트에서얻어올수있는정보 삭제된파일명, 전체경로 0x0F/0x0E(Delete Index Entry Allocation/Add Index Entry Allocation) 작업의 Undo 데이터에서얻어옴 Undo 데이터의내용은 Index Entry 안의 Content 내용 ($FileName 속성 ) Parent File Reference Address 값을통해부모디렉토리와전체경로를가져옴 Name 값을통해삭제된파일명획득 Current LSN Previous LSN Redo Op Undo Op Undo Data forensicinsight.org Page 31 / 51
$LogFile 이벤트분석 파일삭제이벤트 긴파일명의파일을삭제할경우 0x0F/0x0E(Delete Index Entry Allocation/Add Index Entry Allocation) 작업이두번일어남 긴파일명이기때문에 Index Entry 가두개이기때문 삭제된파일명을가져오기위해서는두번째 0x0F/0x0E(Delete Index Entry Allocation/Add Index Entry Allocation) 작업의 Undo 데이터에서가져옴 forensicinsight.org Page 32 / 51
$LogFile 이벤트분석 파일삭제이벤트 Non Resident 파일삭제이벤트 Resident 삭제작업과동일하게판단 Resident 삭제작업과마찬가지로파일명이긴경우, Delete Index Entry Allocation 작업이두번일어남 삭제파일명, 전체경로는 Resident 파일삭제의경우와동일하게획득 Non Resident File 삭제이벤트순서 (Redo/Undo) : Delete Index Entry Root Redo 작업이들어갈수있음 1. 0x0F/0x0E(Delete Index Entry Allocation(or Root)/Add Index Entry Allocation(or Root)) 2. 0x03/0x02(Deallocation File Record Segment/Initialize File Record Segment) 3. 0x16/0x15(Clear Bits In Nonresident Bit Map/Set Bits In Nonresident Bit Map) 4. 0x1B/0x01(Forget Transaction/Compensation Log Record) forensicinsight.org Page 33 / 51
$LogFile 이벤트분석 - 파일생성이벤트 - 파일삭제이벤트 - 파일데이터작성 / 수정이벤트 - 파일명변경이벤트 forensicinsight.org Page 34 / 51
$LogFile 이벤트분석 파일데이터작성 / 수정이벤트 Resident File 파일데이터작성 Redo 작업이 Update Resident Value 이고 Record Offset 이 0xF8 이상, 그리고 Attr Offset 이 0x18 이상이면 $Data 속성에대한업데이트작업이라고볼수있음 파일명길이가 1 인경우 ( 짧은파일명 ), $Data 속성의시작위치는 0xF8 $Data 속성에서 0x18 위치부터실제데이터가들어감 Undo 의데이터가모두 0 이면새로운파일내용작성, 그렇지않으면파일내용수정 Current LSN Previous LSN Redo Op Undo Op Record Offset Attr Offset Redo Data Undo Data forensicinsight.org Page 35 / 51
$LogFile 이벤트분석 파일데이터작성 / 수정이벤트 Resident File 파일데이터수정 Undo 에데이터가있음 Undo 의데이터가수정전의내용 Redo 의데이터가수정후의내용 Current LSN Previous LSN Redo Op Undo Op Record Offset Attr Offset Redo Data Undo Data forensicinsight.org Page 36 / 51
$LogFile 이벤트분석 파일데이터작성 / 수정이벤트 대상파일찾기 Update Resident Value 작업의 Target LCN, MFT Cluster Index 값과 Initialize File Record Segment 작업의 Target LCN, MFT Cluster Index 값을비교 같은 Target LCN, MFT Cluster Index 값을가지고있으면 Initialize File Record Segment 작업을통해생성된파일의내용을작성 / 수정한것이라볼수있음 forensicinsight.org Page 37 / 51
$LogFile 이벤트분석 파일데이터작성 / 수정이벤트 Non Resident 내용 / 작성수정이벤트 Non Resident 파일의경우, 실제파일의내용이외부클러스터에저장됨 0x09/0x09(Update Mapping Pairs/Update Mapping Pairs) 작업을통해데이터작성위치를확인할수있음 Attr Offset 이 0x40 일경우, Cluster Run 작성내용을 Redo/Undo 데이터에서획득할수있음 (0x41 일경우, 확인불가 ) Redo/Undo 작업의데이터는 Cluster Run 작성내용임 아래의경우, 0x26 번째클러스터부터 2 클러스터가사용되었음 Current LSN Previous LSN Redo Op Undo Op Record Offset Attr Offset Redo Data Undo Data forensicinsight.org Page 38 / 51
$LogFile 이벤트분석 파일데이터작성 / 수정이벤트 Non Resident 파일생성시, 해당파일의데이터위치파악하기 Resident 파일내용작성의경우와마찬가지로 Target LCN, MFT Cluster Index 비교를통해데이터가작성되는파일을찾을수있음 일반적으로파일생성이벤트다음에바로오는 Update Mapping Pairs 작업이생성한파일의데이터쓰기작업임 Non Resident 파일생성시, 데이터작성이벤트 1. 0x06/0x05(Delete Attribute/Create Attribute) 2. 0x05/0x06(Create Attribute/Delete Attribute) 3. 0x15/0x16(Set Bits In Nonresident Bit Map/Clear Bits In Nonresident Bit Map) 4. 0x0B/0X0B(Set New Attribute Sizes/ Set New Attribute Sizes) 5. 0X09/0X09(Update Mapping Pairs/ Update Mapping Pairs) 6. 0x0B/0X0B(Set New Attribute Sizes/ Set New Attribute Sizes) 7. 0X1B/0X01(Forget Transaction/Compensation Log Record) forensicinsight.org Page 39 / 51
$LogFile 이벤트분석 - 파일생성이벤트 - 파일삭제이벤트 - 파일데이터작성 / 수정이벤트 - 파일명변경이벤트 forensicinsight.org Page 40 / 51
$LogFile 이벤트분석 파일명변경이벤트 파일명변경시, 일어나는작업 인덱스삭제, 추가작업 $FILE_NAME 속성삭제, 추가작업 Record Offset 이 0x98, Attr Offset 이 0x00 인 Delete Attribute 와 Create Attribute 작업이연속적으로오면파일명변경 일반적으로 $FILE_NAME 속성은 MFT 레코드에서 0x98 위치에있음 두작업의 Target LCN 이동일해야함 파일명변경이벤트순서 1. 0x0F/0X0E(Delete Index Entry Allocation/Add Index Entry Allocation) 2. 0x06/0x05(Delete Attribute/Create Attribute) 3. 0x05/0x06(Create Attribute/Delete Attribute) 4. 0x0E/0x0F(Add Index Entry Allocation/Delete Index Entry Allocation) 5. 0x1B/0x01(Forget Transaction/Compensation Log Record) forensicinsight.org Page 41 / 51
$LogFile 이벤트분석 파일명변경이벤트 Delete Attribute(0x06) Create Attribute(0x05) 각작업의 Redo Data 에서변경전파일명과변경후파일명을알수있음 Current LSN Previous LSN Redo Op Undo Op Record Offset Attr Offset Target LCN Redo Data forensicinsight.org Page 42 / 51
$LogFile Parser 구현 - 도구설계 - 기능설명 forensicinsight.org Page 43 / 51
$LogFile Parser 구현 도구설계 1. $MFT, $LogFile 을입력으로받음 2. $LogFile 작업레코드의 LSN과 $MFT의레코드의 LSN 비교하여파일명 / 전체경로 / 시간정보획득 3. $LogFile 작업레코드파싱중에얻는 Parent File Reference Address 값은 $MFT 모듈에넘겨전체경로획득 4. $LogFile 작업레코드를파싱하여파일생성, 삭제, 데이터작성, 파일명변경이벤트획득 forensicinsight.org Page 44 / 51
$LogFile Parser 구현 - 도구설계 - 기능설명 forensicinsight.org Page 45 / 51
$LogFile Parser 구현 기능설명 파일생성이벤트출력 Redo 작업데이터에서파일명, 생성시간획득 Redo 작업데이터의 Parent File Reference Address 값은 $MFT 모듈에넘겨전체경로획득 파일삭제이벤트출력 Undo 작업데이터에서파일명획득 Undo 작업데이터의 Parent File Reference Address 값은 $MFT 모듈에넘겨전체경로획득 삭제시간은알수없음 ( 앞뒤이벤트발생시간을통해대략적인삭제시간유추 ) forensicinsight.org Page 46 / 51
$LogFile Parser 구현 기능설명 파일데이터작성이벤트출력 Resident 파일데이터작성이벤트 작성된파일데이터의 $LogFile 파일내 Offset 값을출력 ( 추후에헥사값출력으로업데이트 ) 일반적으로생성이벤트바로뒤에데이터작성이벤트가따라서나옴 Non-Resident 파일데이터작성이벤트 파일데이터작성된 LCN 값출력 일반적으로는생성이벤트바로뒤에데이터작성이벤트가따라서나옴 forensicinsight.org Page 47 / 51
$LogFile Parser 구현 기능설명 파일명변경이벤트출력 변경전파일명과변경후파일명출력 MFT Modified Time을통해파일명변경시간획득 키워드검색 원하는키워드가포함된이벤트만필터링 필터링예.exe or.dll or.sys PE 파일행위분석에활용.lnk 문서열람흔적추적에활용.pf PE 파일실행흔적추적에활용 forensicinsight.org Page 48 / 51
결론 forensicinsight.org Page 49 / 51
결론 $LogFile 의포렌식적의미 NTFS 작업히스토리추적 파일 / 디렉토리생성, 삭제, 이름변경, MFT 수정작업의타임라인작성 MFT 에서발견하지못한삭제된파일흔적추적 삭제된파일의 MFT가덮여졌을경우라도 $LogFile 에는삭제기록이남아있음 Resident 파일의경우, 파일데이터확인가능 Non-Resident 파일의경우, 파일데이터가작성된클러스터위치확인가능 문서파일열람흔적, PE 파일실행및생성 / 삭제흔적추적에활용 forensicinsight.org Page 50 / 51
질문및답변 forensicinsight.org Page 51 / 51