3、固件获取与识别:从官网、设备、OTA包获取固件;使用file、binwalk识别固件类型

做固件安全分析,第一步就是拿到固件。听起来简单,对吧?但这里面的门道其实不少。我刚开始做这行的时候,就曾在一个路由器固件上卡了整整两天——不是因为分析不了,而是因为我压根没找对固件版本。

今天咱们就聊聊,怎么把固件搞到手,以及拿到手之后怎么确认它到底是什么东西。

3.1 固件获取的三大途径

固件这东西,不像普通软件那样随便搜就能下。它藏在各个地方,得靠经验去找。我个人习惯把获取途径分成三类:官网、设备本身、OTA包。

3.1.1 从官网获取

这是最正规、也最省事的途径。大部分厂商都会在官网提供固件下载,尤其是路由器、摄像头、智能家居这类设备。

找固件的时候,我一般会去这几个地方翻:

  • 支持中心:通常叫“下载中心”、“固件升级”、“技术支持”之类的名字
  • 产品页面:有些厂商把固件藏在产品详情页的最底下
  • 开发者社区:像小米、TP-Link都有开发者专区,里面会有历史版本
我的小技巧:别只盯着最新版本。老版本固件往往漏洞更多,而且有些厂商会悄悄修复漏洞但不公开。我习惯把同一型号的所有历史版本都下载下来,对比分析。

举个例子,去TP-Link官网下载某款路由器的固件,路径大概是:

官网 → 支持中心 → 输入型号 → 选择固件版本 → 下载.bin文件

但要注意,有些厂商的官网做得稀烂,搜索功能基本是摆设。这时候怎么办?直接去Google搜“设备型号 + firmware download”,往往比官网自带的搜索好用。

3.1.2 从设备中提取

官网找不到?或者厂商已经停止支持了?那就得从设备本身下手。

从设备提取固件,常见的方法有:

  • 通过UART/SPI接口读取:拆机,找到Flash芯片,用编程器直接读
  • 通过SSH/Telnet导出:如果设备有调试接口,直接连上去把固件dump出来
  • 通过Web管理界面备份:有些设备提供“备份配置”功能,里面可能包含完整固件
注意:拆机提取固件可能会失去保修,而且操作不当可能把设备搞成砖。我建议新手先从官网和OTA包入手,等熟练了再玩硬件提取。

我记得有一次,一个客户拿了个工业路由器过来,官网早就倒闭了。我拆开一看,用的是Winbond的25Q128 Flash芯片。拿编程器一读,16MB的固件就出来了。嗯,这种时候你会觉得,硬件提取虽然麻烦,但确实管用。

3.1.3 从OTA包中捕获

OTA(Over-The-Air)升级包,是现在最主流的固件分发方式。手机、智能音箱、摄像头,基本都是通过OTA升级的。

捕获OTA包的方法:

  • 抓包拦截:用Wireshark或Burp Suite抓取设备升级时的网络流量
  • 逆向升级APP:很多设备用手机APP升级,可以反编译APP找到下载地址
  • 监听系统日志:设备升级时会在日志里打印下载链接,通过adb或串口就能看到

举个例子,抓取某品牌智能摄像头的OTA包:

1. 电脑开热点,让摄像头连上来
2. 用Wireshark抓取所有HTTP/HTTPS流量
3. 在APP里点击“检查更新”
4. 过滤出包含“.bin”或“.img”的请求
5. 复制下载链接,直接下载

关键点:OTA包有时候是加密的。厂商会把固件加密后再下发,防止被中间人篡改。这时候你拿到的就是加密后的数据,需要先解密才能分析。我后面会专门讲固件解密的方法。

3.2 固件识别:拿到手后先别急着分析

好,固件到手了。然后呢?直接扔进binwalk?别急。

我见过太多新手,拿到一个.bin文件就以为它是文件系统,结果解出来一堆乱码。其实,固件文件有很多种类型,你得先搞清楚它到底是什么。

3.2.1 用file命令快速识别

file命令是Linux系统自带的工具,能快速判断文件类型。用法极其简单:

file firmware.bin

输出结果大概长这样:

firmware.bin: u-boot legacy uImage, Linux Kernel Image, ...

或者:

firmware.bin: Squashfs filesystem, little endian, version 4.0, ...

再或者:

firmware.bin: data

看到“data”的时候就要小心了。这说明file命令认不出来,可能是加密了,或者是某种自定义格式。

经验之谈:file命令虽然快,但它只检查文件头部的魔数(Magic Number)。有些固件会在头部加个自定义的引导头,导致file误判。所以,file只能作为初步判断,不能全信。

3.2.2 用binwalk深度扫描

binwalk是固件分析的神器。它能扫描固件中的各种文件签名,找出隐藏的文件系统、内核、引导程序等。

基本用法:

binwalk firmware.bin

输出结果:

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             u-boot legacy uImage, Linux Kernel Image
131072        0x20000         Squashfs filesystem, little endian, version 4.0
4194304       0x400000        JFFS2 filesystem, little endian

看到没?binwalk把固件里的各个部分都标出来了。偏移地址、大小、类型,一目了然。

如果想直接提取文件系统,用:

binwalk -e firmware.bin

它会自动把识别出来的内容解压到当前目录。

注意:binwalk也不是万能的。有些固件用了非标准的压缩算法,或者把文件系统分成了多个碎片,binwalk可能识别不全。我曾经遇到过一个固件,binwalk只扫出了前半部分,后半部分被加密了。后来我手动分析了二进制数据,才发现后面还藏了个JFFS2分区。

3.3 常见固件类型一览

做多了你就会发现,固件类型其实就那么几种。我整理了一个表格,方便你对照:

固件类型 常见后缀 特点 常见设备
SquashFS .bin, .img 只读压缩文件系统,体积小 路由器、摄像头
JFFS2 .img, .jffs2 可读写,支持NAND Flash 工业设备、嵌入式Linux
UBIFS .ubi, .img 新一代Flash文件系统 高端路由器、手机
CramFS .img, .cramfs 老式压缩文件系统 老旧设备
TRX .trx Broadcom路由器专用格式 华硕、Linksys路由器
Intel HEX .hex 纯文本格式,用于单片机 MCU、IoT设备

你想想看,如果你拿到一个SquashFS的固件,却用解压JFFS2的方法去处理,那肯定不行。所以,识别这一步真的很关键。

3.4 实战:一个完整的固件获取与识别流程

光说不练假把式。咱们走一遍完整的流程,拿一个虚拟的路由器固件做例子。

第一步:获取固件

假设我们要分析TP-Link WR841N V9的固件。先去官网下载中心,输入型号,找到V9版本,下载下来得到一个wr841nv9.bin文件。

第二步:初步识别

$ file wr841nv9.bin
wr841nv9.bin: data

嗯?显示“data”?别慌,这很正常。TP-Link的固件头部有自定义的引导头,file命令认不出来。

第三步:深度扫描

$ binwalk wr841nv9.bin

DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
0             0x0             TP-Link firmware header, ...
131072        0x20000         u-boot legacy uImage, Linux Kernel Image
262144        0x40000         Squashfs filesystem, little endian, version 4.0

看到了吧?binwalk识别出了TP-Link的头部、u-boot引导程序,以及SquashFS文件系统。

第四步:提取文件系统

$ binwalk -e wr841nv9.bin

执行完后,当前目录会多出一个_wr841nv9.bin.extracted文件夹,里面就是解压出来的文件系统。

核心思路:固件获取与识别,说白了就是“找得到、认得出”。找得到靠经验,认得出靠工具。但工具只是辅助,真正值钱的是你对固件结构的理解。

3.5 本章知识体系

下面这张图,帮你把本章的核心逻辑串起来:

固件获取与识别知识体系 固件获取三大途径 官网下载 设备提取 OTA包捕获 固件识别工具 file命令(快速初判) binwalk(深度扫描) 常见固件类型:SquashFS / JFFS2 / UBIFS / TRX / Intel HEX

这张图把本章的核心逻辑串起来了。从上到下,先获取固件,再识别类型,最后确认文件系统格式。每一步都有对应的工具和方法。

好了,固件获取与识别就讲到这里。记住一句话:拿到固件只是开始,认清楚它是什么,你才能知道下一步该怎么分析。别急着上手,先花几分钟把固件类型搞清楚,后面能省你几个小时甚至几天的时间。


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