1. 固件文件系统识别与提取

任务目标

给定一个IoT设备固件镜像文件,识别其内部文件系统类型(SquashFS、JFFS2等),并提取出完整的文件系统内容,以便后续进行固件分析、漏洞挖掘或配置提取。

环境准备

本案例使用 binwalk 作为主要分析工具,辅以 sasquatch(SquashFS解包工具)和 jefferson(JFFS2解包工具)。在Ubuntu/Debian系统上安装依赖:

sudo apt update
sudo apt install -y binwalk mtd-utils
# 安装sasquatch(SquashFS非标准格式支持)
git clone https://github.com/devttys0/sasquatch
cd sasquatch && sudo ./build.sh
# 安装jefferson(JFFS2解包)
sudo pip3 install jefferson

固件镜像准备

为便于演示,使用 firmware-mod-kit 中的工具构造一个包含SquashFS文件系统的测试固件,或直接下载已知的OpenWrt固件(如 openwrt-19.07.0-x86-64-generic-squashfs-combined.img.gz)。以下命令下载并解压一个真实固件:

wget https://downloads.openwrt.org/releases/19.07.0/targets/x86/64/openwrt-19.07.0-x86-64-generic-squashfs-combined.img.gz
gunzip openwrt-19.07.0-x86-64-generic-squashfs-combined.img.gz
mv openwrt-19.07.0-x86-64-generic-squashfs-combined.img firmware.bin

文件系统识别与提取

使用 binwalk 扫描固件,识别文件系统在镜像中的偏移位置和类型:

binwalk firmware.bin

预期输出中会包含类似以下关键行(具体偏移因固件而异):

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             U-Boot header, header size: 64 bytes
...
262144        0x40000         SquashFS filesystem, little endian, version 4.0, compression:lzma, size: 4194304 bytes

从输出中确认文件系统类型为 SquashFS,记录其偏移地址(如 0x40000)。

使用 binwalk -e 自动提取所有识别的文件系统内容:

binwalk -e firmware.bin

该命令会在当前目录创建 _firmware.bin.extracted 文件夹,其中包含按偏移命名的子目录,每个子目录内是提取出的文件系统内容。

若需要手动提取指定偏移处的SquashFS文件系统,可使用 dd 配合 unsquashfs:

dd if=firmware.bin of=squashfs.img bs=1 skip=$((0x40000)) count=$((0x400000))
unsquashfs -d rootfs squashfs.img

其中 skip 为文件系统起始偏移,count 为文件系统大小(可从binwalk输出中读取)。提取结果位于 rootfs/ 目录。

验证提取结果

检查提取出的文件系统内容是否完整:

ls -la rootfs/
cat rootfs/etc/openwrt_release  # 或查看其他关键配置文件

若能看到 bin/、etc/、usr/ 等标准Linux目录结构,且关键配置文件内容可读,说明提取成功。

JFFS2文件系统处理说明

若目标固件使用JFFS2(常见于老旧路由器),binwalk同样能识别。提取方式类似,但解包工具需替换为 jefferson:

binwalk firmware_jffs2.bin
# 假设输出显示 JFFS2 filesystem at offset 0x1f0000
dd if=firmware_jffs2.bin of=jffs2.img bs=1 skip=$((0x1f0000))
jefferson jffs2.img

jefferson 会在当前目录生成 jffs2-root/ 文件夹,内含解包后的文件系统。

常见问题

  • binwalk未识别文件系统:尝试 binwalk -A 使用熵分析,或手动指定文件系统特征(如SquashFS的magic hsqs)。
  • unsquashfs报错:部分固件使用非标准SquashFS块大小或压缩算法,需使用 sasquatch 替代系统自带的 unsquashfs。
  • 提取出的文件系统为空:确认偏移和大小参数正确,部分固件在文件系统前有引导头,需精确跳过。

判定标准

完成以下步骤即视为通过:

  1. binwalk firmware.bin 能明确输出文件系统类型及偏移;
  2. 提取出的目录中包含 etc/、bin/、usr/ 等标准目录;
  3. 能读取到固件内的关键配置文件(如 /etc/passwd、/etc/config/ 下的文件),证明文件系统内容完整可用。