固件解包与文件系统分析

拿到一个固件,第一件事是什么?不是直接扔进反汇编器,而是先看看它里面到底装了些什么。说白了,固件就是一个大包裹,里面藏着操作系统、文件系统、配置脚本、二进制程序。你得先把它拆开,才能知道漏洞可能藏在哪。

我个人习惯,拿到固件先跑一遍 file 命令,看看文件类型。然后就是 Binwalk 上场的时候了。

Binwalk 解包:第一把刀

Binwalk 是固件分析的瑞士军刀。它能扫描固件里的文件签名,把藏在里面的文件系统、内核、引导程序一个个挖出来。

核心用法:

# 扫描固件,看看里面有什么
binwalk firmware.bin

# 自动提取所有识别到的文件
binwalk -e firmware.bin

# 递归提取,连压缩包里的东西也一起解
binwalk -Me firmware.bin

我在项目中遇到过一台智能摄像头,固件只有 8MB,Binwalk 一扫描,发现里面塞了三个不同版本的文件系统。厂商估计是升级时没清理干净,旧版本的文件还留在里面。这种“历史遗留”问题,经常能挖到未修复的漏洞。

小技巧:如果 Binwalk 默认的签名库不够用,试试 binwalk -T 设置熵阈值,或者手动添加自定义签名。有些厂商会魔改文件系统头,这时候就得靠经验了。

文件系统识别:Squashfs、Cramfs、JFFS2

嵌入式设备最常用的文件系统就那几种。我整理了一个对照表,方便你快速判断:

文件系统 特点 常见设备 识别特征
Squashfs 只读、高压缩比、支持压缩算法 路由器、摄像头、智能家居 Binwalk 输出 "Squashfs filesystem"
Cramfs 只读、简单、老牌 老旧设备、低端 IoT Binwalk 输出 "Cramfs filesystem"
JFFS2 可写、磨损均衡、用于 NAND Flash 工业设备、高端路由器 Binwalk 输出 "JFFS2 filesystem"
UBIFS 新一代、大容量 NAND 优化 新式 IoT、Linux 设备 Binwalk 输出 "UBIFS filesystem"

为什么会这样?因为嵌入式设备存储空间有限,必须用只读压缩文件系统来省空间。Squashfs 是目前的主流,压缩率高,解压也快。Cramfs 已经很少见了,但老设备上还能碰到。

注意:有些厂商会把文件系统头魔改掉,Binwalk 识别不出来。这时候可以试试 binwalk -E 看熵值曲线,或者手动搜索文件系统魔数。Squashfs 的魔数是 hsqs,Cramfs 是 0x28cd3d45。

文件系统挂载与浏览

Binwalk 提取出来的文件系统,通常是一个目录树。但有时候提取不完整,或者你想修改文件系统再打包回去,就得手动挂载。

Squashfs 挂载

# 查看 Squashfs 信息
unsquashfs -s rootfs.squashfs

# 解压到目录
unsquashfs -d ./squashfs-root rootfs.squashfs

# 如果需要修改后重新打包
mksquashfs ./squashfs-root new-rootfs.squashfs -comp xz

Cramfs 挂载

# 解压 Cramfs
cramfsck -x ./cramfs-root rootfs.cramfs

# 重新打包
mkcramfs ./cramfs-root new-rootfs.cramfs

JFFS2 挂载(需要模拟 Flash)

# 使用 mtdram 模拟 Flash
modprobe mtdram total_size=16384 erase_size=256
modprobe mtdblock

# 写入 JFFS2 镜像
dd if=rootfs.jffs2 of=/dev/mtdblock0

# 挂载
mount -t jffs2 /dev/mtdblock0 /mnt/jffs2

我曾经在分析一台工业路由器时,Binwalk 提取出来的文件系统缺了几个关键目录。后来手动挂载 JFFS2 镜像,才发现厂商把配置文件放在了 JFFS2 的可写分区里,而 Binwalk 只提取了只读分区。这种坑,不手动挂载根本发现不了。

避坑指南:我曾经因为挂载 Squashfs 时没注意压缩算法,导致解压出来的文件全是乱码。后来养成习惯,先用 unsquashfs -s 查看压缩方式,再决定用什么参数解压。LZMA、XZ、Gzip 的兼容性不一样,别搞混了。

知识体系结构图

下面这张图,把固件解包到文件系统分析的整个流程串起来了。你可以把它当作操作手册来用:

固件解包与文件系统分析流程 固件文件 Binwalk 扫描与提取 文件系统类型识别 Squashfs Cramfs JFFS2 / UBIFS unsquashfs / mount cramfsck / mount mtdram + mount 文件系统浏览与分析 注意魔改文件系统头

文件系统浏览:找什么?

挂载或解压完文件系统,接下来就是翻目录了。我一般会重点关注这几个地方:

  • /bin、/sbin、/usr/bin:可执行文件,尤其是网络服务、管理后台的二进制程序
  • /etc:配置文件,包括 passwd、shadow、config.xml、lighttpd.conf 等
  • /lib、/usr/lib:动态链接库,看看有没有过时的 OpenSSL 版本
  • /www、/htdocs:Web 管理界面文件,经常能找到硬编码的后门
  • /tmp、/var:运行时数据,有时候会残留调试日志

重要提醒:别只看文件名字。我见过厂商把后门程序命名为 systemd 或者 ntpd,伪装成系统服务。一定要用 file 命令确认文件类型,用 strings 扫描可疑字符串。

嗯,到这里,固件解包和文件系统分析的基础操作就讲完了。你想想看,其实核心就三步:扫描、识别、挂载。但每一步都有坑,厂商不会乖乖地把文件系统摆好等你来拆。多动手,多踩坑,经验就是这么积累起来的。