第二章:固件获取与基础分析
好,咱们正式开始动手。这一章要解决一个最实际的问题——固件从哪来,拿到手之后怎么拆开看。
说实话,我刚开始做IoT安全那会儿,最大的坑就是找不到固件。明明设备就在手边,但固件就是拿不到。后来摸清了门道,才发现其实渠道比想象中多。
2.1 固件获取渠道
固件获取,说白了就两条路:官方渠道和第三方源。我个人的习惯是优先走官方,实在不行再找第三方。
2.1.1 思科官网
思科的官方固件发布在 software.cisco.com 上。你需要一个思科账号,有些老固件还需要有效的服务合同才能下载。
具体操作步骤:
- 登录思科官网,进入「Download Software」页面
- 按产品型号搜索,比如
RV320或SG300 - 选择对应的固件版本,下载
.bin或.tar文件
小技巧: 思科官网的固件命名有规律。比如
RV320_FW_1.4.2.02.bin,型号+版本号一目了然。我建议下载时顺手记下MD5值,方便后续校验完整性。
2.1.2 第三方源
有些老设备,思科官网已经下架了固件。这时候就得靠第三方源了。我常用的有:
- 思科社区论坛:很多老工程师会分享历史固件
- 固件镜像站:比如
archive.org上有人备份 - GitHub:搜索
cisco firmware能发现不少仓库
注意: 第三方源的固件,一定要先做哈希校验。我曾经下载过一个被篡改的固件,里面被人植入了后门。嗯,从那以后我再也不敢跳过校验了。
2.2 使用 binwalk 进行解包
拿到固件之后,第一件事就是拆包。binwalk 是我最顺手的工具,没有之一。
安装很简单:
# 安装 binwalk
sudo apt-get install binwalk
# 或者从源码安装
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python setup.py install
解包命令:
# 基本用法
binwalk -e firmware.bin
# 递归解包(遇到嵌套固件时很有用)
binwalk -Me firmware.bin
# 只分析不解包
binwalk firmware.bin
运行之后,binwalk 会输出类似这样的信息:
DECIMAL HEXADECIMAL DESCRIPTION
--------------------------------------------------------------------------------
0 0x0 uImage header, header size: 64 bytes
64 0x40 LZMA compressed data, properties: 0x5D
2621440 0x280000 SquashFS filesystem, little endian, version 4.0
...
看到 SquashFS filesystem 了吗?这就是我们要找的文件系统。binwalk 会自动把它提取到 _firmware.bin.extracted 目录下。
核心要点: binwalk 的本质是扫描固件中的文件签名。它不依赖文件头,而是靠特征字节来识别。所以就算固件被加密或混淆,只要签名没被破坏,binwalk 就能找到。
2.3 识别文件系统类型
解包之后,你会看到一堆文件和目录。但关键是要搞清楚文件系统是什么类型。常见的就两种:SquashFS 和 JFFS2。
| 特性 | SquashFS | JFFS2 |
|---|---|---|
| 压缩方式 | gzip/lzma/lzo | zlib |
| 读写能力 | 只读 | 可读写 |
| 典型用途 | 固件根文件系统 | 配置分区、日志分区 |
| 解包工具 | unsquashfs | jefferson |
怎么判断?我一般用两种方法:
- 看 binwalk 输出:它会直接告诉你文件系统类型
- 手动检查:用
file命令查看提取出的文件
# 检查文件系统镜像
file rootfs.img
# 输出:SquashFS filesystem, little endian, version 4.0
# 或者直接看挂载点
mount | grep squashfs
如果是 SquashFS,可以用 unsquashfs 手动解包:
# 解包 SquashFS
unsquashfs rootfs.img
# 查看 squashfs 信息
unsquashfs -s rootfs.img
如果是 JFFS2,需要用 jefferson:
# 安装 jefferson
pip install jefferson
# 解包 JFFS2
jefferson rootfs.jffs2
避坑指南: 我曾经遇到过一个固件,binwalk 显示是 SquashFS,但 unsquashfs 死活解不开。后来发现是固件头被修改了,偏移量不对。解决办法是用
dd 命令跳过前几个字节再解包。嗯,这种坑多踩几次就长记性了。
2.4 知识体系总览
这一章的内容,说白了就是固件分析的「入口」。我画了一张图,帮你理清整个流程:
你看,整个流程其实就三步:拿到固件 → 拆包 → 识别文件系统。每一步都有对应的工具和方法。我个人觉得,最难的不是技术本身,而是遇到异常情况时能快速定位问题。
本章小结:
- 固件获取优先走官方渠道,第三方源要校验完整性
- binwalk 是解包的核心工具,支持递归解包
- SquashFS 和 JFFS2 是最常见的文件系统,各有特点
- 遇到解包失败时,检查偏移量或文件头是否被修改
好了,这一章就到这里。拿到固件并解包之后,下一步就是深入分析文件系统里的内容了。不过那是后面章节的事,咱们先把基础打牢。