4、固件获取与提取:从设备芯片、官网、升级包中获取固件的方法,以及固件提取的常用工具(binwalk、dd、strings)
固件是物联网设备运行的核心软件集合,通常包含操作系统内核、文件系统、设备驱动、应用程序配置以及启动引导程序。在固件安全分析、漏洞挖掘、后门检测和OTA升级机制研究过程中,第一步也是最关键的一步,就是合法且完整地获取目标固件。固件的获取途径并非单一,不同途径得到的固件形态差异极大——可能是芯片上直接读取的裸二进制镜像,也可能是官网下载的加密压缩包,还可能是OTA传输过程中截获的差分升级包。理解这些获取路径的适用场景、技术约束和操作细节,是后续进行固件解包、文件系统提取、二进制比对和漏洞分析的前提。本章将系统讲解从设备芯片、厂商官网、OTA升级包三个维度获取固件的方法,并深入剖析binwalk、dd、strings三款核心工具在固件提取与初步分析中的实战用法。
4.1 从设备芯片直接读取固件
核心原理:物联网设备中的固件通常存储在板载非易失性存储器中,最常见的是SPI NOR Flash(如Winbond W25Q128、Macronix MX25L系列)、并行NOR Flash、NAND Flash以及eMMC。这些存储芯片通过SPI、并行总线或MMC接口与主控SoC相连。当设备处于断电状态时,存储器中的内容不会消失,因此可以通过外部编程器或调试接口直接读取芯片中的原始二进制数据。这种获取方式的最大优势在于:即使厂商不提供任何固件下载渠道,或者固件经过加密保护,只要芯片本身未加密(或已获取密钥),就能获得设备实际运行的完整固件镜像。
操作流程与工具选择:芯片级固件读取需要硬件层面的操作,具体步骤如下:
- 识别存储芯片型号:观察PCB板上的芯片丝印,确认型号、封装(SOIC-8、SOIC-16、TSOP-48等)和容量。例如,丝印“W25Q128FVSG”表示Winbond 128Mbit SPI NOR Flash。
- 选择读取方式:根据芯片封装和板级布局,可选择烧录夹(SOP8夹子)、飞线连接或热风枪拆焊后使用编程器座。对于量产分析,推荐使用免拆夹子;对于高密度引脚芯片,建议拆焊后读取。
- 连接编程器:常用编程器包括RT809H、CH341A、TL866II Plus等。以CH341A为例,将夹子正确连接芯片的CS、CLK、MOSI、MISO、VCC、GND引脚,注意1脚定位。
- 读取并保存镜像:在编程器软件(如AsProgrammer、NeoProgrammer)中选择芯片型号,执行“读取”操作,将数据保存为.bin文件。读取速度通常为几百KB/s到几MB/s,128Mbit芯片约需1-2分钟。
| 存储类型 | 接口 | 常见芯片 | 读取工具 | 注意事项 |
|---|---|---|---|---|
| SPI NOR Flash | SPI (1-1-4) | W25Q128, MX25L25645 | CH341A, RT809H | 电压3.3V,注意引脚顺序 |
| 并行 NOR Flash | Parallel AHB | JS28F128, PC28F256 | RT809H + TSOP适配器 | 引脚多,需拆焊 |
| NAND Flash | 8-bit Parallel | K9F2G08, MT29F2G | RT809H + BGA座 | 需处理坏块和OOB区域 |
| eMMC | MMC 4.5/5.1 | KLMBG4JETD, SDIN8DE2 | eMMC转SD座 + 读卡器 | 需先进入MMC模式 |
4.2 从官网与厂商渠道获取固件
核心原理:厂商官网、技术支持门户、开发者社区和开源仓库是获取固件最便捷的途径。许多IoT设备厂商会定期发布固件更新包,用于修复漏洞、增加功能或优化性能。这些固件包通常以压缩包(.zip、.tar.gz)、镜像文件(.img、.bin)或厂商自定义格式(.pkg、.swu、.rbi)发布。从官网获取固件的关键挑战在于:需要识别固件包的封装格式、是否加密、是否包含签名头,以及如何从容器中提取出真正的文件系统镜像。
判断方法与操作流程:
- 确定固件下载入口:访问厂商官网的“支持/下载”页面,输入产品型号或序列号,查找“固件”、“Firmware”、“升级包”等关键词。部分厂商(如TP-Link、D-Link)提供直接下载链接,而企业级设备(如Cisco、HPE)可能需要注册账号或签订NDA。
- 分析固件包格式:下载后使用
file命令查看文件类型。例如:file firmware.bin可能输出“data”(未知格式)或“gzip compressed data”。使用binwalk扫描固件内部结构,识别嵌入的文件系统(如SquashFS、JFFS2、CramFS)和引导加载程序(U-Boot、Barebox)。 - 处理加密与签名:部分固件包带有头部签名(如TP-Link的固件头包含型号标识和校验值),或整体加密(如某些路由器使用AES加密固件)。此时需要分析固件头的结构,查找密钥或利用已知漏洞绕过加密。例如,某些设备使用固定的XOR密钥或硬编码AES密钥。
- 提取文件系统:使用binwalk的
-e参数自动提取,或使用dd手动跳过头部偏移,再使用unsquashfs、jefferson(JFFS2)等工具解包文件系统。
binwalk update.img扫描,输出显示在偏移0x100处存在U-Boot镜像,在0x40000处存在SquashFS文件系统。执行binwalk -e update.img自动提取,得到_update.img.extracted/目录,其中包含squashfs-root文件夹,内部为完整的Linux根文件系统(/bin、/etc、/usr等)。进一步使用strings squashfs-root/etc/passwd可查看设备默认账号信息。
4.3 从OTA升级包中获取固件
核心原理:OTA(Over-The-Air)升级是物联网设备远程更新固件的标准机制。当设备收到升级通知后,会从厂商服务器下载升级包,进行校验、解密、写入Flash。安全研究人员可以通过搭建代理服务器(如mitmproxy、Burp Suite)或使用网络抓包工具(tcpdump、Wireshark)截获设备与服务器之间的HTTP/HTTPS流量,从而获取OTA升级包。此外,部分设备支持从本地SD卡或U盘导入升级包,这也是一种获取途径。OTA升级包可能是全量镜像,也可能是差分补丁(如bsdiff生成的.patch文件),需要根据具体格式进行处理。
操作流程与工具链:
- 搭建抓包环境:将设备网络流量导向分析机。常用方法:配置设备代理指向mitmproxy(需安装CA证书),或在路由器上端口镜像,使用tcpdump捕获流量。对于HTTPS流量,需提前将mitmproxy的CA证书安装到设备信任库中(部分设备允许导入证书)。
- 触发OTA升级:在设备管理界面点击“检查更新”,或通过厂商App触发升级。观察抓包工具中的流量,筛选包含“firmware”、“update”、“.bin”、“.pkg”等关键词的URL。
- 下载并保存升级包:使用curl或wget从截获的URL下载固件包,或直接在mitmproxy中右键保存响应体。
- 分析差分包:如果获取的是差分升级包(通常体积较小),需要结合设备当前运行的固件版本进行还原。使用
bspatch工具将差分包与旧固件合并,生成完整的新固件镜像。
| OTA包类型 | 特征 | 提取方法 | 典型工具 |
|---|---|---|---|
| 全量镜像包 | 体积大(数十MB),包含完整文件系统 | 直接binwalk扫描提取 | binwalk, unsquashfs |
| 差分补丁包 | 体积小(几KB~几MB),包含二进制差异 | 需与旧版本合并还原 | bspatch, bsdiff |
| 加密升级包 | 文件头有加密标识,数据段熵值高 | 需逆向解密算法或提取密钥 | openssl, findcrypt |
| 流式传输包 | 分块传输,无完整文件头 | 需重组TCP流 | Wireshark, tcpflow |
strings提取包中的可打印字符串,快速定位版本信息、文件路径和可能的硬编码密钥。例如,strings firmware.bin | grep -i "version"可能直接输出“V1.2.3”或“build_20240115”。
4.4 固件提取核心工具详解
binwalk——固件结构分析与自动提取:binwalk是固件分析领域最核心的开源工具,它通过扫描文件中的已知文件签名(magic bytes)来识别嵌入的文件系统、压缩数据、引导加载程序等。其原理是维护一个签名数据库,将目标文件与数据库中的特征码进行匹配。常用命令包括:binwalk firmware.bin(扫描)、binwalk -e firmware.bin(自动提取)、binwalk -M(递归扫描)、binwalk -A(CPU架构分析)。binwalk还支持自定义签名和熵分析(-E参数),用于识别加密或压缩区域。
dd——按偏移量精确切割:dd是Linux下的数据复制工具,在固件提取中用于从原始镜像中按指定偏移和大小提取特定分区。例如,如果binwalk扫描显示文件系统从偏移0x40000开始,大小为0x200000字节,可以使用dd if=firmware.bin of=rootfs.squashfs bs=1 skip=262144 count=2097152提取。dd的常用参数包括:bs(块大小)、skip(跳过输入的前N个块)、count(复制N个块)、if(输入文件)、of(输出文件)。在提取U-Boot、内核镜像或单独分区时,dd比binwalk更精确,因为它不会自动修改数据。
strings——快速定位关键信息:strings工具从二进制文件中提取可打印的字符串序列(默认长度≥4)。在固件分析中,strings用于快速发现文件路径、IP地址、URL、版本号、用户名、密码、密钥片段等敏感信息。常用参数:-n(指定最小字符串长度)、-t(显示偏移量)、-e(指定编码,如l用于16位小端)。例如,strings -n 8 -t x firmware.bin | grep -i "admin"可以定位包含“admin”的字符串及其偏移地址。
1.
binwalk smartplug.bin → 发现U-Boot(偏移0x0)、内核(偏移0x40000)、SquashFS(偏移0x200000)。2.
dd if=smartplug.bin of=kernel.bin bs=1 skip=262144 count=1048576 → 提取内核镜像。3.
binwalk -e smartplug.bin → 自动提取SquashFS到squashfs-root目录。4.
strings squashfs-root/etc/config/device.conf → 发现MQTT服务器地址和默认Topic。5.
strings kernel.bin | grep -i "linux-4" → 确认内核版本为Linux 4.14,便于后续漏洞匹配。
4.5 常见误区与总结复盘
误区一:认为binwalk能提取所有固件。binwalk依赖签名匹配,对于加密固件、自定义格式或非标准文件系统,binwalk可能无法识别。此时需要结合熵分析(高熵区域表示加密或压缩)和手动分析固件头结构。
误区二:忽略固件头部的校验和与签名。许多设备在启动时会校验固件头的CRC或RSA签名。如果直接修改固件内容而不更新校验值,设备将拒绝启动。在提取和分析固件时,应保留原始头部信息,并在修改后重新计算校验值。
误区三:混淆芯片读取与逻辑提取。通过编程器读取的是存储芯片的原始位流,可能包含未使用的空白区域(0xFF)和坏块标记。而通过OTA或官网获取的固件包通常是经过打包的镜像,可能不包含Flash的物理布局信息。两者在分析时需区别对待。
误区四:strings输出过多导致忽略关键信息。大型固件中strings输出可能达到数万行,直接grep关键词容易遗漏。建议先使用strings -n 10过滤短字符串,再结合grep -E使用正则表达式匹配IP、路径、密钥模式。