3、固件获取与预处理:固件提取方法(芯片读取、OTA抓包、官网下载)、固件格式识别与解包(bin、hex、squashfs、cramfs等)
固件是嵌入式设备硬件与上层应用之间的“灵魂”,它直接决定了设备的功能、性能与安全性。在固件漏洞分析与利用的完整流程中,固件获取与预处理是后续静态分析、动态调试和漏洞挖掘的基石。如果拿不到正确的固件,或者无法从原始二进制中还原出文件系统与内核镜像,后续的一切分析都将无从谈起。本章将系统讲解固件获取的三大主流途径(芯片读取、OTA抓包、官网下载),并深入剖析固件格式识别与解包的核心技术,帮助读者建立起从“物理介质”到“可分析文件系统”的完整知识链路。
上图展示了固件获取与预处理的完整工程链路。从左侧的三大获取途径出发,经过中间的格式识别与预处理,再到右侧的解包与文件系统还原,最终输出可供后续分析使用的固件包。整个流程环环相扣,任何一个环节的疏漏都可能导致分析失败或误判。
3.1 固件提取方法:三大途径的实战对比
3.1.1 芯片读取:物理层级的“硬提取”
核心原理:芯片读取是最直接、最底层的固件获取方式,适用于设备未提供OTA升级功能、固件加密保护较弱或需要获取Bootloader等底层代码的场景。常见的芯片包括SPI NOR Flash、SPI NAND Flash、并行NOR Flash以及eMMC等。读取方式主要有三种:SPI Flash编程器读取、JTAG/SWD调试接口读取和ISP(In-System Programming)在线读取。
操作流程:以最常见的SPI Flash读取为例,具体步骤如下:
- 硬件准备:确认Flash芯片型号(如Winbond W25Q128、MXIC MX25L25645G等),准备对应的编程器(如RT809H、CH341A)和测试夹或热风枪。
- 连接与备份:使用测试夹夹住芯片(免拆焊)或将芯片焊下放入编程器座,读取前先读取芯片ID确认型号匹配,然后执行全片读取,保存为.bin文件。
- 校验与验证:读取完成后,建议连续读取两次并比对MD5值,确保数据完整性。若芯片有写保护或加密位,需先解除保护。
3.1.2 OTA抓包:网络侧的“软截获”
核心原理:现代物联网设备普遍支持OTA(Over-The-Air)固件升级。当设备发起升级请求时,固件包会通过网络传输。通过中间人代理或网络抓包工具,可以截获传输中的固件包。常见协议包括HTTP/HTTPS、TFTP、FTP以及厂商自定义的私有协议。
判断方法与操作流程:
- 环境搭建:将设备与PC接入同一局域网,使用Burp Suite、Fiddler或Wireshark进行抓包。对于HTTPS流量,需要将设备证书替换为自签名证书(若设备支持导入证书)。
- 触发升级:在设备管理界面点击“检查更新”或“立即升级”,同时观察抓包工具中的流量变化。
- 固件提取:在Wireshark中过滤
http或tftp协议,找到包含固件文件特征的请求(如URL中包含.bin、.img、.pkg等后缀),右键“导出对象”即可保存固件。
version.json),再根据其中的URL下载实际固件。务必同时抓取这两个请求,并关注响应头中的Content-Length字段,以判断固件包大小是否合理。
3.1.3 官网下载:最便捷的“白嫖”路径
核心原理:厂商官网、技术支持社区或GitHub官方仓库通常会提供固件下载。这种方式无需硬件操作,且固件版本明确,适合快速获取目标版本进行漏洞比对。
操作流程:访问厂商官网的支持/下载页面,输入产品型号或序列号,选择固件版本下载。部分厂商会提供固件校验和(MD5/SHA256),下载后务必校验完整性。
| 获取方式 | 适用场景 | 优点 | 缺点 | 工具/设备 |
|---|---|---|---|---|
| 芯片读取 | 无OTA、需Bootloader、加密固件 | 最底层、最完整 | 硬件操作风险、可能损坏设备 | 编程器、测试夹、热风枪 |
| OTA抓包 | 支持远程升级的设备 | 无需拆机、可获取最新版本 | HTTPS加密可能拦截失败 | Burp Suite、Wireshark |
| 官网下载 | 厂商公开提供固件 | 便捷、版本明确 | 可能缺少历史版本 | 浏览器、下载工具 |
3.2 固件格式识别:从二进制到结构化数据
3.2.1 文件类型探测与魔数分析
核心原理:固件文件本质上是一个二进制大对象(Blob),其内部可能包含Bootloader、内核、文件系统、设备树等多个部分。识别固件格式的第一步是确定文件类型和内部结构。Linux下的file命令和binwalk工具是首选。
操作流程:
# 使用file命令查看文件类型
file firmware.bin
# 使用binwalk扫描固件内部结构
binwalk firmware.bin
# 使用binwalk提取所有可识别的文件
binwalk -e firmware.bin
案例拆解:某路由器固件router.bin,file命令输出为data,说明是未知格式。使用binwalk扫描后,发现偏移量0x20000处有squashfs filesystem的魔数签名hsqs,偏移量0x10000处有uImage头部(27 05 19 56)。由此可以判断该固件包含一个Linux内核和一个SquashFS根文件系统。
3.2.2 熵值分析与加密判断
核心原理:熵值(Entropy)用于衡量数据的随机性。正常固件的熵值通常在0.5~0.8之间(压缩数据),而加密后的固件熵值接近1.0(高度随机)。通过计算固件各段的熵值,可以快速定位加密区域或隐藏数据。
操作流程:使用binwalk -E或ent工具计算熵值。若发现某段熵值异常高且无文件签名,则可能被加密或混淆。
3.3 固件解包:还原文件系统与内核
3.3.1 常见固件格式与解包工具
核心原理:固件内部常见的文件系统格式包括SquashFS、CramFS、JFFS2、UBIFS、EXT4等。每种格式都有其特定的头部魔数和压缩算法。解包的核心是识别格式并选择合适的工具。
| 格式 | 魔数/特征 | 解包工具 | 备注 |
|---|---|---|---|
| SquashFS | hsqs (0x68737173) | unsquashfs | 只读压缩文件系统,最常见 |
| CramFS | 0x28cd3d45 | cramfsck, cramfs-tools | 老式只读文件系统 |
| JFFS2 | 0x1985 (little-endian) | jefferson, jffs2dump | NOR/NAND Flash常用 |
| UBIFS | UBI# (0x55424923) | ubireader_extract_files | NAND Flash常用 |
| EXT4 | 0x53EF (superblock) | debugfs, mount | 较少见,多见于eMMC设备 |
3.3.2 解包操作实战
操作流程:以SquashFS为例,使用unsquashfs工具解包:
# 解包SquashFS文件系统
unsquashfs rootfs.squashfs
# 查看解包后的目录结构
ls -la squashfs-root/
案例拆解:完整固件分析闭环
某智能摄像头固件camera_fw.bin,大小16MB。分析过程如下:
- 初步识别:
binwalk camera_fw.bin显示在0x0处有uImage头部,0x40000处有squashfs签名。 - 分离内核与文件系统:使用
dd命令按偏移量切割:dd if=camera_fw.bin of=kernel.bin bs=1 skip=0 count=262144,dd if=camera_fw.bin of=rootfs.squashfs bs=1 skip=262144。 - 解包文件系统:
unsquashfs rootfs.squashfs,得到squashfs-root/目录。 - 分析关键文件:在
squashfs-root/etc/下发现shadow文件,squashfs-root/usr/bin/下发现主程序camera_app。使用strings命令搜索硬编码凭据:strings camera_app | grep -i "password\|secret\|key",发现硬编码的AES密钥。 - 结果:成功提取固件并定位到硬编码密钥,为后续漏洞利用(如固件解密、后门植入)奠定了基础。
1. 忽略Bootloader:Bootloader中可能包含硬件初始化代码、加密密钥和恢复模式,是漏洞挖掘的高价值目标。
2. 盲目使用binwalk -e:binwalk自动提取可能遗漏部分文件或产生错误提取,建议先手动分析偏移量,再使用dd精确切割。
3. 忽视文件系统挂载点:解包后应检查
/etc/init.d/、/etc/config/等目录,了解系统启动流程和配置项,这对后续漏洞利用至关重要。
3.4 总结与复盘
固件获取与预处理是嵌入式安全分析的“第一公里”。本章从三大获取途径出发,详细讲解了芯片读取、OTA抓包和官网下载的适用场景与操作要点;随后深入固件格式识别,介绍了file、binwalk和熵值分析等核心方法;最后通过SquashFS等常见格式的解包实战,展示了从原始二进制到可分析文件系统的完整流程。在实际工作中,分析师应根据设备类型、硬件可访问性和固件加密情况灵活选择获取方式,并熟练掌握格式识别与解包工具链。下一阶段,我们将基于提取出的固件进行静态代码审计和动态调试,进一步挖掘潜在的安全漏洞。