開機磁區 ($Boot)¶
什麼是 $Boot¶
$Boot 是每個 NTFS 磁碟區的 MFT 項目 7:即磁碟區最前面的 8 KiB。其第一個磁區,也就是
磁碟區開機記錄(volume boot record),保存了描述檔案系統的 BIOS 參數區塊:
- 磁區與叢集大小、磁碟區中的磁區數量,以及隱藏磁區 (磁碟上位於該磁碟區之前的磁區,也就是其分割區的起始位置);
$MFT與$MFTMirr的起始位置,以及 FILE 與 INDX 記錄的大小;- 64 位元的磁碟區序號,於格式化磁碟區時設定。
第一個磁區的其餘部分以及其後的 15 個磁區保存了載入 Windows 的開機程式碼。
序號的低 32 位元就是 Windows 以 XXXX-XXXX 形式顯示的值(vol、dir),也是
LNK 捷徑、Jump Lists 與 Prefetch 用來記錄
檔案所在磁碟區的值。$Boot 能將這些記錄連結到所收集主機的某個磁碟區。
最佳結論:與某個 $Boot 的 VolumeSerialNumber
相同的 LNK、Jump List 或 Prefetch 磁碟區序號,指向該磁碟區,或指向被設定為(或連同複製而得到)
相同序號的另一個磁碟區。序號可以被變更,且在不同主機之間並非唯一。
位置與收集¶
請使用支援原始存取的鑑識工具收集它,或讀取磁碟區映像檔的第一個磁區:兩者是相同的位元組。 Juntei 會讀取任何以 NTFS 開機磁區開頭的檔案,因此磁碟區映像檔也可以作為輸入。磁碟映像檔 則是以分割表開頭;請將分割區的磁碟區提供給 Juntei。
分析注意事項¶
- 磁碟區被格式化時,序號會改變。序號與目前任何磁碟區都不相符的 LNK 檔案,可能指向 卸除式媒體、網路共用資料夾的伺服器,或之後才被格式化的磁碟區。
- 由相同 Windows 格式化的磁碟區,其開機程式碼是相同的:DFIR Artifact Museum 中
Windows 10、11 與 Server 2012 R2 的
$Boot檔案,其開機程式碼完全一致。磁碟區開機記錄 bootkit 會變更開機程式碼,或變更開機程式碼用來尋找$Boot其餘部分的隱藏磁區欄位。 在下任何結論之前,請將BootCodeSHA256、JumpInstruction與HiddenSectors與其他主機 以及分割表進行比較:開機管理程式或加密軟體也可能變更開機程式碼。 - BitLocker 加密磁碟區的映像檔是以 BitLocker 自己的開機磁區開頭(OEM ID
-FVE-FS-)。以-f提供時,Juntei 會回報它,並在Problems中說明它不是 NTFS;NTFS 開機磁區位於加密資料中。從已解鎖磁碟區收集的$Boot則是 NTFS 的開機磁區。 Problems列出已辨識的結構不一致與截斷,而非提供完整的 Windows 可掛載性測試。請用它來 評估擷取出的磁區與副本,而不要單獨將其視為攻擊發現。開機程式碼雜湊不包含開頭的跳躍指令、 BIOS 參數區塊與結尾特徵碼;請一併檢查這些欄位。
使用 Juntei 剖析¶
Usage: juntei parse-ntfs boot <INPUT> [OPTIONS]
Input:
-d, --directory <DIR> Recursively find $Boot files (named $Boot, or starting with an NTFS boot sector)
-f, --file <FILE> Parse one $Boot file, or an NTFS volume image (its first sector)
Output:
-o, --output <FILE> Save every boot sector
-t, --output-type <TYPE> csv, json, or jsonl
juntei parse-ntfs boot -f '$Boot'
juntei parse-ntfs boot -d evidence/ -o boot.csv
juntei parse-ntfs boot -f volume.dd -t json
摘要會列出每個開機磁區的磁碟區序號(以 Windows 顯示的形式,以及 LNK 與 Prefetch 欄位
顯示的形式)、大小、叢集大小與 $MFT 叢集。解析多台主機時,它會依開機程式碼雜湊將它們分組,
讓開機程式碼與其他磁碟區不同的磁碟區能被突顯出來。
CSV 輸出欄位¶
| 欄位 | 判讀 |
|---|---|
SourcePath |
輸入檔案。 |
VolumeSerialNumber |
32 位元序號,以 LNK、Jump List 與 Prefetch 輸出顯示的形式呈現(180B1E67)。Windows 將其顯示為 180B-1E67。 |
VolumeSerialNumber64 |
完整的 64 位元序號。 |
OEM-ID |
在 NTFS 磁碟區上為 NTFS。 |
BytesPerSector、SectorsPerCluster、ClusterSize |
磁碟區的幾何配置。每叢集磁區數超過 128 時會以 2 的次方記錄,此處會加以解碼。無效時為空。 |
TotalSectors、VolumeSize |
磁碟區中的磁區數及其位元組大小,不含位於其末端的開機磁區副本。 |
HiddenSectors |
磁碟上位於該磁碟區之前的磁區:即其分割區的起始位置。 |
MFT-Cluster、MFT-Offset |
$MFT 的起始位置,以叢集及自磁碟區起點算起的位元組表示。 |
MFT-MirrorCluster、MFT-MirrorOffset |
$MFTMirr 的起始位置。 |
FileRecordSize、IndexRecordSize |
每個 FILE 記錄(通常為 1,024)與每個 INDX 記錄(通常為 4,096)的位元組數。 |
MediaDescriptor |
硬碟為 F8。 |
JumpInstruction |
最前面三個位元組(EB 52 90):越過 BIOS 參數區塊跳至開機程式碼的跳躍指令。 |
EndSignature |
有效開機磁區末端的 55 AA。 |
BootCodeSHA256 |
開機程式碼的 SHA-256:第一個磁區的位元組 0x54 至 0x1FD,以及 8 KiB 中的其餘部分。 |
Problems |
Windows 不會掛載的情況:NTFS 以外的 OEM ID、沒有 55 AA、無效的大小、NTFS 保持為零的 FAT 欄位被設定、$MFT 超出磁碟區末端;以及短於 8 KiB 的檔案。 |
JSON/JSONL 具有相同的欄位與名稱,數字以數值表示,未知的值為 null,Problems 則為清單。
調查策略¶
- 將每台主機的
VolumeSerialNumber與其 LNK 檔案、Jump Lists 與 Prefetch 檔案的 磁碟區序號並列比對:與任何已收集磁碟區都不相符的,就是其他磁碟區(USB 隨身碟、 共用資料夾、之後才格式化的磁碟區)。 - 在 USB 裝置的輸出中查詢其他序號,該輸出會列出已掛載之卸除式磁碟區的磁碟區序號。
- 比較各主機的
BootCodeSHA256與HiddenSectors。對於不同的開機程式碼,請以反組譯工具 與磁碟的分割表進行調查,並尋找與開機相關的事件記錄項目。 - 使用
MFT-Offset與ClusterSize在磁碟區映像檔中找出$MFT。
延伸資訊¶
- Microsoft:NTFS 概觀
- libfsntfs:NTFS 格式文件(磁碟區標頭)
- The Sleuth Kit:fsstat
- ys-ntfs-parser(其
bootcrate)