第二章:固件获取与基础分析

好,咱们正式开始动手。这一章要解决一个最实际的问题——固件从哪来,拿到手之后怎么拆开看。

说实话,我刚开始做IoT安全那会儿,最大的坑就是找不到固件。明明设备就在手边,但固件就是拿不到。后来摸清了门道,才发现其实渠道比想象中多。

2.1 固件获取渠道

固件获取,说白了就两条路:官方渠道和第三方源。我个人的习惯是优先走官方,实在不行再找第三方。

2.1.1 思科官网

思科的官方固件发布在 software.cisco.com 上。你需要一个思科账号,有些老固件还需要有效的服务合同才能下载。

具体操作步骤:

  1. 登录思科官网,进入「Download Software」页面
  2. 按产品型号搜索,比如 RV320SG300
  3. 选择对应的固件版本,下载 .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

怎么判断?我一般用两种方法:

  1. 看 binwalk 输出:它会直接告诉你文件系统类型
  2. 手动检查:用 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 核心工具:binwalk + unsquashfs/jefferson 输出结果 解包后的文件系统目录 + 文件类型信息

你看,整个流程其实就三步:拿到固件 → 拆包 → 识别文件系统。每一步都有对应的工具和方法。我个人觉得,最难的不是技术本身,而是遇到异常情况时能快速定位问题。

本章小结:
  • 固件获取优先走官方渠道,第三方源要校验完整性
  • binwalk 是解包的核心工具,支持递归解包
  • SquashFS 和 JFFS2 是最常见的文件系统,各有特点
  • 遇到解包失败时,检查偏移量或文件头是否被修改

好了,这一章就到这里。拿到固件并解包之后,下一步就是深入分析文件系统里的内容了。不过那是后面章节的事,咱们先把基础打牢。

专注资料整理