在通过各种方式获取固件之后,要对其使用工具进行解析,得到相应的文件系统或者二进制文件,以便进行下一步的安全分析和漏洞挖掘。因此,对固件进行逆向和安全分析的前提是获取相应的固件。
本节介绍几种常见的固件获取方式,分别为官网获取、抓包获取、硬件提取。
固件获取十分直接的方式就是通过官网下载。在设备对应的官网网址,根据官网提供的固件下载链接便可进行下载。在官网的技术支持处可以下载到对应型号、对应版本的固件。如图3-49所示,进入Tenda路由器官网,选择“服务支持”选项,在搜索框中可以搜索和下载需要获取的固件型号。如图3-50所示,TP-LINK路由器固件也可以在其官网进行搜索和下载。
图3-49 Tenda官网
图3-50 TP-LINK官网
通常,厂商提供的固件会统一放在某个FTP、HTTP服务器目录下,可以通过相关链接进行下载。如图3-51所示,D-LINK固件可以在HTTP服务器目录下进行搜索和下载。图3-52所示为DrayTek厂商固件的下载界面。
图3-51 HTTP服务器目录
图3-52 DrayTek厂商固件的下载界面
抓包获取是利用设备在线升级OTA时,先抓取相应的升级URL链接,然后访问升级URL链接,获取固件的下载链接的方式。如果是在Web网页端进行升级操作,那么使用BurpSuite工具对升级功能的HTTP数据包进行拦截或者重放,就可以获取返回包中升级版的固件数据的下载链接。先将固件数据保存到本地固件文件中,再对固件文件进行解包和分析即可。抓包获取固件过程如图3-53所示。
图3-53 抓包获取固件过程
1.案例一:某款路由器基于后台“在线升级”功能抓包获取固件
(1)D-Link DIR-823G路由器后台“在线升级”功能。当登录到路由器后台时,选择“更多”→“系统管理”→“固件升级”选项,可以看到“检测新版本”按钮,如图3-54所示。
图3-54 “检测新版本”按钮
(2)单击“检测新版本”按钮,使用BurpSuite工具的拦截功能进行抓包,此时返回包中直接返回了一个如图3-55所示的固件下载链接。
图3-55 返回的固件下载链接
(3)访问此链接,即可获取固件的具体下载地址。单击链接进行下载,即可成功获取固件下载文件,如图3-56所示。
图3-56 获取固件下载文件
2.案例二:某品牌摄像头基于“更新固件”功能抓包获取固件
(1)将摄像头的外壳拆开,找到UART接口,通过该接口进入摄像头的shell终端控制界面。单击“更新固件”按钮,此时在终端中输出了这次请求的数据包,如图3-57所示。
图3-57 输出数据包
(2)将此数据包直接复制到BurpSuite工具中进行重放,可以发现返回包中的URL变量为空,如图3-58所示。
图3-58 重放数据包
(3)尝试降低请求的DeviceVersion参数的值,如将469762064改为469762060,单击BurpSuite工具中的“Send”按钮进行数据包重放,如图3-59所示。
图3-59 降低参数的值并重放数据包
(4)此时返回的URL的值为一个链接,使用浏览器或者curl命令访问此链接,即可获取设备固件更新包的raw数据,如图3-60所示。
图3-60 获取设备固件更新包的raw数据
(5)由图3-61可知,设备固件更新包的raw数据是加密的数据。这就需要进行进一步分析才能得到其明文信息。
图3-61 加密的数据
虽然使用在官网下载固件或在线抓取升级包等方式比较便捷,但是有些厂商并不会提供固件的下载链接或者升级链接,这就需要通过其他途径来获取固件。除了可以使用上述固件获取方式来提取固件,还可从硬件设备中直接提取固件。
固件通常都存储在PCB板的某个芯片中。将设备拆开之后,找到相应的Flash或ROM芯片,可以使用专用工具(烧写器、编程器)进行固件提取,或者通过接口调试工具转存固件。
市面上存在多种编程器,可以分为专用编程器和通用编程器。编程器在读取固件时需要配合编程器软件,如图3-62所示。
图3-62 编程器及编程器软件
1.固件存储器芯片印有的厂商名和产品型号的字段含义
PCB板上的Flash芯片通常印有一段字符串,字符串的字段都有特殊含义,通常带有厂商名和产品型号的相关信息。这里以厂商Winbond的芯片W25Q64JVS10为例进行说明,其名称中各个字段表示的含义如图3-63所示。
图3-63 各个字段表示的含义
2.编程器固件提取原理
编程器固件提取的通用步骤基本分为以下几步:拆解设备外壳、分析PCB板中各个芯片组件、找到Flash芯片的位置、使用芯片夹和编程器提取芯片固件内容。
在具体操作时,首先使用芯片夹将编程器与Flash的各个引脚对准,然后上电,此时编程器以MCU的身份与Flash芯片进行通信。它通过总线发送读取内存段的指令,进而将Flash芯片内存空间中的数据读出。编程器固件提取如图3-64所示。
图3-64 编程器固件提取
固件提取通用工具主要有螺丝刀、塑料撬棒、电烙铁、热风枪、编程器和芯片夹等。
3.编程器固件提取案例
1)案例一:用芯片夹读取法提取某个设备固件
(1)拆解设备外壳,如图3-65所示。
(2)使用电烙铁拆下Flash芯片,如图3-66所示。
图3-65 拆解设备外壳
图3-66 拆下Flash芯片
(3)将拆下的芯片连接芯片夹(见图3-67)并安装到MinPro 100G编程器上。
图3-67 连接芯片夹
(4)将编程器连接计算机并打开对应的编程软件,建立计算机与编程器的连接,如图3-68所示。
图3-68 建立计算机与编程器的连接
(5)读取固件内容,如图3-69所示。
图3-69 读取固件内容
(6)使用Binwalk工具分析读取的固件内容,如图3-70所示。
图3-70 使用Binwalk工具分析读取的固件内容
2)案例二:用飞线法提取某个设备固件
(1)拆解设备外壳,用“飞针”勾住芯片的各个引脚,如图3-71所示。
图3-71 勾住引脚
(2)将RT809F编程器连接计算机,进行软件识别,如图3-72所示。
图3-72 进行软件识别
(3)读取固件内容,如图3-73所示。
图3-73 读取固件内容
4.接口提取工具
根据调试接口标准的不同,接口提取工具主要有UART接口提取工具、SPI接口提取工具、JTAG接口提取工具和其他设备提取工具4种。
1)UART接口提取工具
常见的UART接口提取工具有FT232、CH340和CP2102等,如图3-74~图3-76所示。
图3-74 FT232
图3-75 CH340
图3-76 CP2102
2)SPI接口提取工具
常见的SPI接口提取工具有Bus Pirate和Shikra等,如图3-77和图3-78所示。
图3-77 Bus Pirate
图3-78 Shikra
3)JTAG接口提取工具
常见的JTAG接口提取工具有J-LINK、U-LINK和ST-LINK等,如图3-79~图3-81所示。
图3-79 J-LINK
图3-80 U-LINK
图3-81 ST-LINK
4)其他设备提取工具
树莓派结合FlashROM读取套件,如图3-82所示。
图3-82 树莓派结合FlashROM读取套件
5.SWD接口固件提取案例
通过SWD接口提取的NRF51822 BLE 2.4GHz芯片的外观如图3-83和图3-84所示。
图3-83 芯片正面
图3-84 芯片反面
(1)将SWD接口提取工具引脚与蓝牙设备引脚连接,如图3-85所示。
图3-85 连接SWD接口提取工具引脚与蓝牙设备引脚
(2)运行OpenOCD(Open On-Chip Debugger),如图3-86所示。
图3-86 运行OpenOCD
(3)打开另一个终端,连接本地4444号端口进行调试,如图3-87所示。
图3-87 连接本地4444号端口进行调试
(4)使用dump命令读取内存数据,获取蓝牙设备固件内容。使用hexdump命令查看导出的固件内容,如图3-88所示。
图3-88 查看导出的固件内容
如果使用上面几种方式都无效,那么可以使用一些其他方式来获取固件。