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的magichsqs)。 - unsquashfs报错:部分固件使用非标准SquashFS块大小或压缩算法,需使用
sasquatch替代系统自带的unsquashfs。 - 提取出的文件系统为空:确认偏移和大小参数正确,部分固件在文件系统前有引导头,需精确跳过。
判定标准
完成以下步骤即视为通过:
binwalk firmware.bin能明确输出文件系统类型及偏移;- 提取出的目录中包含
etc/、bin/、usr/等标准目录; - 能读取到固件内的关键配置文件(如
/etc/passwd、/etc/config/下的文件),证明文件系统内容完整可用。