mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
235 lines
15 KiB
Markdown
235 lines
15 KiB
Markdown
# 分区/文件系统/雕刻
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|
||
|
||
## 分区
|
||
|
||
硬盘或**SSD磁盘可以包含不同的分区**,目的是物理上分隔数据。\
|
||
磁盘的**最小**单位是**扇区**(通常由512B组成)。因此,每个分区的大小需要是该大小的倍数。
|
||
|
||
### MBR(主引导记录)
|
||
|
||
它分配在**引导代码后的第一个扇区的446B**。这个扇区对于指示PC应该从哪里挂载分区至关重要。\
|
||
它最多允许**4个分区**(最多**只有1个**可以是活动的/**可引导的**)。但是,如果需要更多分区,可以使用**扩展分区**。这个第一个扇区的**最后一个字节**是引导记录签名**0x55AA**。只能标记一个分区为活动。\
|
||
MBR允许**最大2.2TB**。
|
||
|
||
.png>)
|
||
|
||
.png>)
|
||
|
||
从MBR的**440到443字节**可以找到**Windows磁盘签名**(如果使用Windows)。硬盘的逻辑驱动器字母取决于Windows磁盘签名。更改此签名可能会导致Windows无法启动(工具:[**Active Disk Editor**](https://www.disk-editor.org/index.html)**)**。
|
||
|
||
.png>)
|
||
|
||
**格式**
|
||
|
||
| 偏移量 | 长度 | 项目 |
|
||
| ----------- | -------- | ------------------- |
|
||
| 0 (0x00) | 446(0x1BE) | 引导代码 |
|
||
| 446 (0x1BE) | 16 (0x10) | 第一个分区 |
|
||
| 462 (0x1CE) | 16 (0x10) | 第二个分区 |
|
||
| 478 (0x1DE) | 16 (0x10) | 第三个分区 |
|
||
| 494 (0x1EE) | 16 (0x10) | 第四个分区 |
|
||
| 510 (0x1FE) | 2 (0x2) | 签名 0x55 0xAA |
|
||
|
||
**分区记录格式**
|
||
|
||
| 偏移量 | 长度 | 项目 |
|
||
| --------- | ------ | ------------------------------------------------------ |
|
||
| 0 (0x00) | 1 (0x01) | 活动标志 (0x80 = 可引导) |
|
||
| 1 (0x01) | 1 (0x01) | 起始磁头 |
|
||
| 2 (0x02) | 1 (0x01) | 起始扇区(位0-5);气缸的高位(6-7) |
|
||
| 3 (0x03) | 1 (0x01) | 起始气缸最低8位 |
|
||
| 4 (0x04) | 1 (0x01) | 分区类型代码(0x83 = Linux) |
|
||
| 5 (0x05) | 1 (0x01) | 结束磁头 |
|
||
| 6 (0x06) | 1 (0x01) | 结束扇区(位0-5);气缸的高位(6-7) |
|
||
| 7 (0x07) | 1 (0x01) | 结束气缸最低8位 |
|
||
| 8 (0x08) | 4 (0x04) | 分区前的扇区(小端) |
|
||
| 12 (0x0C) | 4 (0x04) | 分区中的扇区 |
|
||
|
||
为了在Linux中挂载MBR,您首先需要获取起始偏移量(可以使用`fdisk`和`p`命令)
|
||
|
||
 (3) (3) (3) (2) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png>)
|
||
|
||
然后使用以下代码
|
||
```bash
|
||
#Mount MBR in Linux
|
||
mount -o ro,loop,offset=<Bytes>
|
||
#63x512 = 32256Bytes
|
||
mount -o ro,loop,offset=32256,noatime /path/to/image.dd /media/part/
|
||
```
|
||
**LBA (逻辑块寻址)**
|
||
|
||
**逻辑块寻址** (**LBA**) 是一种常用的方案,用于**指定存储在计算机存储设备上的数据块的位置**,通常是硬盘驱动器等二级存储系统。LBA 是一种特别简单的线性寻址方案;**块通过整数索引定位**,第一个块为 LBA 0,第二个为 LBA 1,依此类推。
|
||
|
||
### GPT (GUID 分区表)
|
||
|
||
GUID 分区表,简称 GPT,因其相较于 MBR(主引导记录)具有更强的能力而受到青睐。GPT 以其**全局唯一标识符**为分区而独树一帜,具体体现在以下几个方面:
|
||
|
||
- **位置和大小**:GPT 和 MBR 都从**扇区 0** 开始。然而,GPT 采用**64位**,而 MBR 则是 32位。
|
||
- **分区限制**:GPT 在 Windows 系统上支持最多**128个分区**,并可容纳高达**9.4ZB**的数据。
|
||
- **分区名称**:允许使用最多 36 个 Unicode 字符为分区命名。
|
||
|
||
**数据弹性和恢复**:
|
||
|
||
- **冗余**:与 MBR 不同,GPT 不将分区和引导数据限制在一个地方。它在磁盘上复制这些数据,从而增强数据完整性和弹性。
|
||
- **循环冗余校验 (CRC)**:GPT 使用 CRC 来确保数据完整性。它主动监控数据损坏,一旦发现,GPT 会尝试从另一个磁盘位置恢复损坏的数据。
|
||
|
||
**保护性 MBR (LBA0)**:
|
||
|
||
- GPT 通过保护性 MBR 维持向后兼容性。此功能位于传统 MBR 空间内,但旨在防止较旧的基于 MBR 的工具错误地覆盖 GPT 磁盘,从而保护 GPT 格式磁盘上的数据完整性。
|
||
|
||
.png>)
|
||
|
||
**混合 MBR (LBA 0 + GPT)**
|
||
|
||
[来自维基百科](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||
|
||
在支持**通过 BIOS** 服务而非 EFI 的操作系统中,第一扇区仍可能用于存储**引导加载程序**代码的第一阶段,但**经过修改**以识别**GPT** **分区**。MBR 中的引导加载程序不得假设扇区大小为 512 字节。
|
||
|
||
**分区表头 (LBA 1)**
|
||
|
||
[来自维基百科](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||
|
||
分区表头定义了磁盘上可用的块。它还定义了构成分区表的分区条目的数量和大小(在表中的偏移量 80 和 84)。
|
||
|
||
| 偏移量 | 长度 | 内容 |
|
||
| --------- | -------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
|
||
| 0 (0x00) | 8 字节 | 签名 ("EFI PART", 45h 46h 49h 20h 50h 41h 52h 54h 或 0x5452415020494645ULL[ ](https://en.wikipedia.org/wiki/GUID_Partition_Table#_note-8)在小端机器上) |
|
||
| 8 (0x08) | 4 字节 | 版本 1.0 (00h 00h 01h 00h) 适用于 UEFI 2.8 |
|
||
| 12 (0x0C) | 4 字节 | 小端的头部大小(以字节为单位,通常为 5Ch 00h 00h 00h 或 92 字节) |
|
||
| 16 (0x10) | 4 字节 | [CRC32](https://en.wikipedia.org/wiki/CRC32) 的头部(偏移量 +0 到头部大小)的小端,计算时此字段置为零 |
|
||
| 20 (0x14) | 4 字节 | 保留;必须为零 |
|
||
| 24 (0x18) | 8 字节 | 当前 LBA(此头部副本的位置) |
|
||
| 32 (0x20) | 8 字节 | 备份 LBA(另一个头部副本的位置) |
|
||
| 40 (0x28) | 8 字节 | 分区的第一个可用 LBA(主分区表最后 LBA + 1) |
|
||
| 48 (0x30) | 8 字节 | 最后可用 LBA(辅助分区表第一个 LBA − 1) |
|
||
| 56 (0x38) | 16 字节 | 磁盘 GUID 的混合字节序 |
|
||
| 72 (0x48) | 8 字节 | 分区条目数组的起始 LBA(主副本中始终为 2) |
|
||
| 80 (0x50) | 4 字节 | 数组中分区条目的数量 |
|
||
| 84 (0x54) | 4 字节 | 单个分区条目的大小(通常为 80h 或 128) |
|
||
| 88 (0x58) | 4 字节 | 分区条目数组的小端 CRC32 |
|
||
| 92 (0x5C) | \* | 保留;对于块的其余部分必须为零(对于 512 字节的扇区大小为 420 字节;但对于更大的扇区大小可以更多) |
|
||
|
||
**分区条目 (LBA 2–33)**
|
||
|
||
| GUID 分区条目格式 | | |
|
||
| --------------------------- | -------- | ------------------------------------------------------------------------------------------------------------- |
|
||
| 偏移量 | 长度 | 内容 |
|
||
| 0 (0x00) | 16 字节 | [分区类型 GUID](https://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs)(混合字节序) |
|
||
| 16 (0x10) | 16 字节 | 唯一分区 GUID(混合字节序) |
|
||
| 32 (0x20) | 8 字节 | 第一个 LBA([小端](https://en.wikipedia.org/wiki/Little_endian)) |
|
||
| 40 (0x28) | 8 字节 | 最后 LBA(包含,通常为奇数) |
|
||
| 48 (0x30) | 8 字节 | 属性标志(例如,第 60 位表示只读) |
|
||
| 56 (0x38) | 72 字节 | 分区名称(36 [UTF-16](https://en.wikipedia.org/wiki/UTF-16)LE 代码单元) |
|
||
|
||
**分区类型**
|
||
|
||
.png>)
|
||
|
||
更多分区类型请见 [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||
|
||
### 检查
|
||
|
||
在使用 [**ArsenalImageMounter**](https://arsenalrecon.com/downloads/) 挂载取证镜像后,可以使用 Windows 工具 [**Active Disk Editor**](https://www.disk-editor.org/index.html)** 检查第一个扇区**。在下图中,**扇区 0** 检测到一个 **MBR** 并被解释:
|
||
|
||
.png>)
|
||
|
||
如果它是 **GPT 表而不是 MBR**,则在 **扇区 1** 中应出现签名 _EFI PART_(在前面的图像中是空的)。
|
||
|
||
## 文件系统
|
||
|
||
### Windows 文件系统列表
|
||
|
||
- **FAT12/16**: MSDOS, WIN95/98/NT/200
|
||
- **FAT32**: 95/2000/XP/2003/VISTA/7/8/10
|
||
- **ExFAT**: 2008/2012/2016/VISTA/7/8/10
|
||
- **NTFS**: XP/2003/2008/2012/VISTA/7/8/10
|
||
- **ReFS**: 2012/2016
|
||
|
||
### FAT
|
||
|
||
**FAT (文件分配表)** 文件系统围绕其核心组件——文件分配表设计,该表位于卷的开始。该系统通过维护**两个副本**的表来保护数据,即使其中一个损坏也能确保数据完整性。该表及根文件夹必须位于**固定位置**,这对系统的启动过程至关重要。
|
||
|
||
文件系统的基本存储单位是**簇,通常为 512B**,由多个扇区组成。FAT 经过多个版本的演变:
|
||
|
||
- **FAT12**,支持 12 位簇地址,处理最多 4078 个簇(4084 个与 UNIX)。
|
||
- **FAT16**,增强为 16 位地址,从而容纳最多 65,517 个簇。
|
||
- **FAT32**,进一步发展为 32 位地址,允许每个卷高达 268,435,456 个簇。
|
||
|
||
所有 FAT 版本的一个显著限制是**最大文件大小为 4GB**,这是由于用于文件大小存储的 32 位字段所致。
|
||
|
||
根目录的关键组件,特别是对于 FAT12 和 FAT16,包括:
|
||
|
||
- **文件/文件夹名称**(最多 8 个字符)
|
||
- **属性**
|
||
- **创建、修改和最后访问日期**
|
||
- **FAT 表地址**(指示文件的起始簇)
|
||
- **文件大小**
|
||
|
||
### EXT
|
||
|
||
**Ext2** 是最常见的**非日志**分区(**不经常更改的分区**)的文件系统,如引导分区。**Ext3/4** 是**日志**文件系统,通常用于**其余分区**。
|
||
|
||
## **元数据**
|
||
|
||
某些文件包含元数据。这些信息是关于文件内容的,有时对分析师可能很有趣,因为根据文件类型,它可能包含如下信息:
|
||
|
||
- 标题
|
||
- 使用的 MS Office 版本
|
||
- 作者
|
||
- 创建和最后修改日期
|
||
- 相机型号
|
||
- GPS 坐标
|
||
- 图像信息
|
||
|
||
您可以使用像 [**exiftool**](https://exiftool.org) 和 [**Metadiver**](https://www.easymetadata.com/metadiver-2/) 这样的工具来获取文件的元数据。
|
||
|
||
## **已删除文件恢复**
|
||
|
||
### 记录的已删除文件
|
||
|
||
如前所述,有几个地方在文件被“删除”后仍然保存该文件。这是因为通常从文件系统中删除文件只是将其标记为已删除,但数据并未被触及。因此,可以检查文件的注册表(如 MFT)并找到已删除的文件。
|
||
|
||
此外,操作系统通常会保存大量关于文件系统更改和备份的信息,因此可以尝试使用它们来恢复文件或尽可能多的信息。
|
||
|
||
{{#ref}}
|
||
file-data-carving-recovery-tools.md
|
||
{{#endref}}
|
||
|
||
### **文件雕刻**
|
||
|
||
**文件雕刻**是一种尝试在大量数据中**查找文件**的技术。此类工具的工作主要有三种方式:**基于文件类型的头部和尾部**、基于文件类型的**结构**以及基于**内容**本身。
|
||
|
||
请注意,这种技术**无法检索碎片化的文件**。如果文件**未存储在连续的扇区中**,则此技术将无法找到它,或至少无法找到其部分。
|
||
|
||
您可以使用多种工具进行文件雕刻,指明您要搜索的文件类型。
|
||
|
||
{{#ref}}
|
||
file-data-carving-recovery-tools.md
|
||
{{#endref}}
|
||
|
||
### 数据流 **C**arving
|
||
|
||
数据流雕刻类似于文件雕刻,但**不是查找完整文件,而是查找有趣的信息片段**。\
|
||
例如,代替查找包含记录的 URL 的完整文件,此技术将搜索 URL。
|
||
|
||
{{#ref}}
|
||
file-data-carving-recovery-tools.md
|
||
{{#endref}}
|
||
|
||
### 安全删除
|
||
|
||
显然,有方法可以**“安全地”删除文件及其部分日志**。例如,可以**多次用垃圾数据覆盖**文件的内容,然后**删除**关于该文件的**$MFT** 和 **$LOGFILE** 中的**日志**,并**删除卷影副本**。\
|
||
您可能会注意到,即使执行该操作,仍可能有**其他地方记录了文件的存在**,这确实是事实,取证专业人员的工作就是找到它们。
|
||
|
||
## 参考文献
|
||
|
||
- [https://en.wikipedia.org/wiki/GUID_Partition_Table](https://en.wikipedia.org/wiki/GUID_Partition_Table)
|
||
- [http://ntfs.com/ntfs-permissions.htm](http://ntfs.com/ntfs-permissions.htm)
|
||
- [https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html](https://www.osforensics.com/faqs-and-tutorials/how-to-scan-ntfs-i30-entries-deleted-files.html)
|
||
- [https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service](https://docs.microsoft.com/en-us/windows-server/storage/file-server/volume-shadow-copy-service)
|
||
- **iHackLabs 认证数字取证 Windows**
|
||
|
||
{{#include ../../../banners/hacktricks-training.md}}
|