3、固件获取与提取:从零开始搞到固件

好,咱们进入实战环节了。前面两章聊了理论基础和硬件接口,这一章我带你亲手搞到固件,再把它拆开看看里面到底装了啥。

说实话,固件分析的第一步往往是最卡人的——你连固件都拿不到,后面全是白搭。我早期做项目时,经常花好几天就为了从一个设备里把固件"抠"出来。今天我把这些经验浓缩一下,咱们按获取途径和解包工具两条线走。

固件获取与提取 固件获取途径 官网下载 OTA 包抓取 编程器读取 串口转储 固件解包工具 binwalk firmware-mod-kit jefferson 实战:解包路由器固件 识别文件系统 提取文件系统 分析文件结构

3.1 固件获取的四种途径

获取固件,说白了就四条路。我按推荐优先级排个序:

途径 难度 适用场景 我的评价
官网下载 ★☆☆☆☆ 品牌设备,有技术支持 首选,省时省力
OTA 包抓取 ★★☆☆☆ 智能设备,有升级功能 需要抓包工具
编程器读取 ★★★★☆ 无源码、无升级功能 硬核但可靠
串口转储 ★★★☆☆ 设备有调试串口 需要硬件动手能力

3.1.1 官网下载——最省心的路子

大部分厂商都会在官网提供固件下载。去支持中心找「固件下载」或「Firmware」栏目就行。我个人习惯先看官网,毕竟这是官方发布的,最干净。

但注意,有些厂商只提供最新版,老版本得去第三方存档找。我曾经为了找一个特定漏洞版本,翻遍了各大镜像站。

3.1.2 OTA 包抓取——中间人攻击的活儿

设备在线升级时,会从服务器拉取固件包。你可以在路由器和设备之间做中间人,用 Wireshark 或 tcpdump 抓包。升级请求通常是 HTTP 或 HTTPS 的,如果是 HTTP 直接就能拿到 URL。

嗯,这里要注意:很多厂商现在用 HTTPS 了,你得先搞定证书劫持。我早期做 IoT 安全时,遇到一个奇葩厂商,固件包分片传输,还得自己拼起来。

3.1.3 编程器读取——硬核玩家的选择

当上面两条路都走不通时,就得动硬件了。把 Flash 芯片吹下来,用编程器(比如 CH341A、TL866)直接读。这招虽然粗暴,但绝对可靠——你拿到的是芯片里的原始二进制。

⚠️ 警告: 吹焊 Flash 有风险,温度控制不好容易焊盘脱落。我建议先拿废旧板子练手,别直接上目标设备。

3.1.4 串口转储——U-Boot 的福利

很多嵌入式设备启动时会通过串口输出信息。如果你能进入 U-Boot 命令行,用 mdnand read 命令就能把固件 dump 出来。这需要你找到板子上的串口焊点,用 USB 转 TTL 模块连接。

我曾经在分析一个老款路由器时,串口没焊排针,自己飞线搞了半天才连上。结果发现 U-Boot 被锁了,只能读不能写——白忙活一场。

3.2 固件解包工具全家桶

拿到固件文件后,下一步就是拆开它。固件通常是个大二进制,里面塞了 bootloader、内核、文件系统、配置分区等。解包工具就是帮我们把这些东西分开。

3.2.1 binwalk——瑞士军刀

binwalk 是我最常用的工具,没有之一。它能自动识别固件里的文件签名,比如 uImage、SquashFS、JFFS2、Zlib 压缩数据等。

# 安装
git clone https://github.com/ReFirmLabs/binwalk.git
cd binwalk
sudo python3 setup.py install

# 扫描固件
binwalk firmware.bin

# 提取所有文件
binwalk -e firmware.bin

binwalk 的 -e 参数会自动解包,但有时候它依赖的 sasquatch 或 jefferson 没装好,会报错。我遇到过好几次,明明有 SquashFS 签名,但解不出来——后来发现是 sasquatch 没编译成功。

3.2.2 firmware-mod-kit——老牌工具集

这是一个工具集合,里面封装了各种解包和打包脚本。适合对固件做修改后重新打包的场景。

# 解包
./extract-firmware.sh firmware.bin

# 重新打包
./build-firmware.sh firmware/ new_firmware.bin

说实话,firmware-mod-kit 的代码有点老了,对新版 SquashFS 支持不好。我一般只用它做快速解包,复杂场景还是用 binwalk。

3.2.3 jefferson——专解 JFFS2

JFFS2 是嵌入式设备常用的文件系统,尤其老设备。jefferson 就是专门对付它的。

pip install jefferson
jefferson jffs2_image.bin

注意,jefferson 需要 Python 3,而且依赖 pycryptodome。我踩过坑:有些 JFFS2 镜像有压缩,jefferson 默认不处理,得加 --compress 参数。

3.2.4 sasquatch——SquashFS 的救星

SquashFS 是现在最流行的嵌入式文件系统。但厂商经常用非标准参数压缩,导致 binwalk 解不开。sasquatch 是 unsquashfs 的魔改版,支持更多变种。

# 编译安装
git clone https://github.com/devttys0/sasquatch.git
cd sasquatch
./build.sh

我个人建议,遇到 SquashFS 解不开时,先试试 sasquatch。它支持 LZMA、LZO、XZ 等多种压缩算法。

3.3 实战:解包一个路由器固件

好,理论说完了,咱们动手干一票。我拿一个常见的 TP-Link 路由器固件做演示。

3.3.1 第一步:下载固件

去 TP-Link 官网下载 TL-WR841N 的固件。文件名一般是 wr841nv14_en_3_16_9_up_boot[170905].bin

3.3.2 第二步:用 binwalk 扫描

$ binwalk wr841nv14_en_3_16_9_up_boot[170905].bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TP-Link firmware header, ...
131072        0x20000         uImage header, ...
131200        0x20080         LZMA compressed data, ...
1052672       0x101000        SquashFS filesystem, little endian, ...

看到了吗?固件里有三个主要部分:TP-Link 头部、uImage 内核、SquashFS 文件系统。偏移量 0x101000 就是文件系统的起点。

3.3.3 第三步:提取文件系统

$ binwalk -e wr841nv14_en_3_16_9_up_boot[170905].bin

# 会在当前目录生成 _wr841nv14_en_3_16_9_up_boot[170905].bin.extracted/
# 里面有个 squashfs-root/ 目录

如果 binwalk 解不开,就用 sasquatch 手动指定偏移量:

$ dd if=firmware.bin bs=1 skip=1052672 of=squashfs.bin
$ unsquashfs -d squashfs-root squashfs.bin

3.3.4 第四步:查看文件结构

$ ls -la squashfs-root/
drwxr-xr-x  bin/
drwxr-xr-x  dev/
drwxr-xr-x  etc/
drwxr-xr-x  lib/
drwxr-xr-x  usr/
drwxr-xr-x  www/
-rwxr-xr-x  sbin/init
-rwxr-xr-x  sbin/httpd

文件系统出来了!这里面有 /bin 放二进制程序,/etc 放配置文件,/www 放 Web 管理页面。我一般先看 /etc 里的配置文件,找硬编码密码或调试接口。

💡 小技巧: 解包后先 grep 一下 "password" 和 "admin",很多厂商会留后门。我曾经在一个路由器里找到 root 密码直接写在 /etc/shadow 里,连哈希都没加密。

3.4 避坑指南

最后,我总结几个常见坑,都是我用血泪换来的:

  • 签名校验: 有些固件有头部签名,binwalk 可能识别不了。用 hexdump -C 手动看头部,或者用 file 命令先猜一下。
  • 加密固件: 厂商越来越精了,开始用 AES 加密固件。这时候你得先逆向 bootloader 找密钥。我遇到过密钥藏在 U-Boot 环境变量里的。
  • 多分区固件: 有些固件把多个分区拼在一起,binwalk 可能只解出第一个。用 -M 参数递归扫描。
  • 文件系统损坏: 从 Flash 读出来的数据可能有坏块。用 nanddump 时加 --skipbad 跳过坏块。

嗯,这一章的内容就到这。固件获取和解包是后续所有分析的基础,你花时间把这步练熟,后面挖漏洞会顺手很多。下一章咱们聊固件模拟,把解出来的文件系统跑起来——那才是真正开始玩的时候。


公众号:蓝海资料掘金营,微信deep3321