固件解包与文件系统分析
拿到一个固件,第一件事是什么?不是直接扔进反汇编器,而是先看看它里面到底装了些什么。说白了,固件就是一个大包裹,里面藏着操作系统、文件系统、配置脚本、二进制程序。你得先把它拆开,才能知道漏洞可能藏在哪。
我个人习惯,拿到固件先跑一遍 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 的兼容性不一样,别搞混了。
知识体系结构图
下面这张图,把固件解包到文件系统分析的整个流程串起来了。你可以把它当作操作手册来用:
文件系统浏览:找什么?
挂载或解压完文件系统,接下来就是翻目录了。我一般会重点关注这几个地方:
/bin、/sbin、/usr/bin:可执行文件,尤其是网络服务、管理后台的二进制程序/etc:配置文件,包括passwd、shadow、config.xml、lighttpd.conf等/lib、/usr/lib:动态链接库,看看有没有过时的 OpenSSL 版本/www、/htdocs:Web 管理界面文件,经常能找到硬编码的后门/tmp、/var:运行时数据,有时候会残留调试日志
重要提醒:别只看文件名字。我见过厂商把后门程序命名为 systemd 或者 ntpd,伪装成系统服务。一定要用 file 命令确认文件类型,用 strings 扫描可疑字符串。
嗯,到这里,固件解包和文件系统分析的基础操作就讲完了。你想想看,其实核心就三步:扫描、识别、挂载。但每一步都有坑,厂商不会乖乖地把文件系统摆好等你来拆。多动手,多踩坑,经验就是这么积累起来的。