固件提取

前言

为了学习路由器漏洞挖掘,了解了如何提取固件,下面是各种提取固件的方法,有的方法我尝试过了,有的设备太贵了只是记录。

前置知识

FLASH的分类

  • NOR Flash

    像访问SDRAM一样,按照数据/地址总线直接访问, 可写的次数较少,速度也慢,由于其读时序类似于SRAM,读地址是线性结构,多用于程序代码的存储。NOR一般是8个针脚,现在常见的路由器大多是这种。

  • NAND Flash

    只有8位/16位/32位甚至更多位宽的总线,每次访问,都要将长地址分为几部分,一点点的分布传入才能访问nand flash

    相比其余的几种flash优势在于可擦写次数多,擦写速度快,但是在使用以及使用过程中会出现坏块因此需要做特殊处理才可以使用

    一般是大型设备或者高端路由器会使用的。

  • eMMC Flash

    全称为embeded MultiMedia Card,是一种嵌入式非易失性存储器系统,由Nand flash和Nand flash控制器组成,以BGA方式封装在一款chip上。

    一般用于更加精细的设备,例如手机什么的。

串口介绍

串口是一个泛称,UART、COM、TTL、RS232、RS485都遵循类似的通信时序协议,因此都被通称为串口。
而在嵌入式开发中所听到的串口一般指的是UARTUART使用的是异步串行通信,以字符为传输单位,一位一位的顺序输送;通信中两个字符间的时间间隔是不固定的 ,然而同一个字符内两个相邻位之间的时间间隔是固定的。数据的传送速率用波特率来表示,即每秒钟传送的二进制位数。一般选波特率都会有9600,19200,115200等,最常用的是115200。
UART有四个pin,分别是VCC,GND,RX,TX,用的是TTL电平,低电平为0V,高电平为3.3V-5V

UART 引脚介绍

  • VCC:供电pin,一般是3.3v,在我们的板子上没有过电保护,这个pin一般不接更安全(在路由器通电的时候可以不连VCC)。
  • GND:接地pin,有的时候RX接受数据有问题,就要接上这个pin,一般也可不接。
  • RX:接收数据pin。
  • TX:发送数据pin。

UART 通信

UART最好的一点是它只使用两根线就可以在设备之间传输数据。在UART通信中,两个UART直接相互通信。发送UART将来自CPU等控制设备的并行数据转换为串行形式,并将其串行发送到接收UART,接收UART然后将串行数据转换回接收设备的并行数据。在两个UART之间传输数据只需要两根线。数据从发送UARTTX引脚流向接收UARTRX引脚,也就是接受和发送数据的UARTRX和TX要反过来连接。

[uart串口通信接口](https://springbird3.oss-cn-chengdu.aliyuncs.com/lianxiang/20221022230518.png)

获取方法

下面列举了几个提取固件的方法

官网

我们可以去各个路由器的官方那边下载固件,例如D-link的:

image-20240712141905959

但是这种网站有很大的弊端就是很多固件都是没有的,而且有的固件的地方特供的,所以这种方法有时候很难获取到想要的固件

类似的其他的也可以在官网的技术支持找到,大家可以去找找

第三方网站

或者可以去一些第三方的网站找到对应的一些固件

https://iui.su/1789/

image-20240712142623477

这些固件会比官网上的资源更多,但是同时也会有很多参差不齐,有的网站还需要收费才能下载,所以大家自行斟酌就行

抓取升级包和获取升级接口

大概方法就是逆向上位机获取下载固件链接,或者抓取升级包来获取固件信息,但是我们可能不一定都是获取最新的固件,所以这个方法局限性比较高,这里就不实际操作一遍了,主要就是wireshark工具的使用

使用编程器RT809F

这个是用的比较广的一种提取方法

需要使用到的工具

  • RT809F
  • soic8夹子
  • 测试路由器
  • SecureCRT
  • 杜邦线

买了很久的设备终于到了,现在就立马复现一下这个提取固件的方法

首先就是需要去下载RT809F的对应软件就行

http://doc.ifix.net.cn/@rt809/CHN.html

直接下载最新版即可,这里我们注意到还有个RT809H的设备,这个设备是比RT809F更高级的设备,但是需要700多,而我们现在用的这个设备300左右,用的不多的直接上RT809F就行

image-20240716111006697

然后下载对应的一些工具,说是给电视刷固件的工具,想着可能有用就都下载了

image-20240716111159408

连接设备

设备的连接方法有三种,一种是用soic8的夹子连接芯片,一种是用芯片连接钩子去勾那个针脚,最后就是直接把芯片拆下来固定到芯片座上,

  • soic8夹子连接

image-20240716111615643

这种方式比较方便,优点是不会破坏路由器,但是缺点容易接触不良,得多夹几次

  • 芯片座

    image-20240716111809175

这个优点就是能看到芯片,就不太容易接触不良了,但是缺点就是会破坏路由器,而且对焊板子能力要求高(我的芯片就拆坏掉了,还好只是测试的板子)

由于芯片钩子还蛮贵的,就不在这里演示了

提取固件

成功连接后,再将一个转USB设备的线接上RT809F,大概就是这样

image-20240716112342630

然后连接好后,打开编程器软件,直接智能识别就行,如果遇到报错,根据情况调整即可,然后能识别到对应芯片的信息,我们再结合芯片上的标志,可以识别出对应的型号,下图就是我的设备的芯片

image-20240716112754404

可以看出来是CFeon的设备,是CH128A-104Hip

搜索CFeon,发现是昂科的设备

image-20240716112710668

搜索设备号

image-20240716112946660

跳转到QH128A-104Hip了

image-20240716113011441

还真有这个设备,然后我们知道版本号应该是EN25QH128A-104Hip

发现没有104Hip,就随便选一个提取就行,试了几个提取的数据都一样的

image-20240716112152636

读取保存即可获得固件了

image-20240716112300141

使用CH341A编程器

在测试完RT809F后发现了一个更便宜的设备可以提取固件,于是自掏腰包买了设备来测试一下

需要使用到的工具

  • CH341A
  • soic8夹子
  • 测试路由器
  • SecureCRT
  • 杜邦线

CH341A驱动安装

我使用的是windows 10,然后用Asprogrammer的时候会报错,报错原因是没有装驱动

这个网站里有对应的驱动,下载即可https://www.wch.cn/downloads/CH341SER_EXE.html

image-20240724105348224

直接点击安装即可,然后在设备管理器的其他设备能发现这个设备,然后安装驱动,手动选择C盘即可

image-20240724105532427

等待一会就安装好了

image-20240724105641549

即可在外部接口找到设备

image-20240724105739568

提取固件

在下面的连接下载对应的CH341A编程器

https://pan.baidu.com/s/1MBGcF8IXE2Y7KK9TMyhzEQ 提取码:9wpx

image-20240724105905586

下载这个就行

然后观察一下构造

image-20240724111426394

发现存在一个跳线帽连接,然后看到后面

image-20240724111509180

发现了说明,我们需要的编程模式,于是需要连接1,2,然后需要用到的是SPI的BIOS,于是转接口需要连接到BIOS这个插口里面

image-20240724111616016

也就是这一块,然后再用soic8夹子连接芯片,识别芯片再读取即可

image-20240724111739714

和上一个RT809F一样也是结合芯片上的字来一起检测,最后提取即可

image-20240724112012317

通过UART串行调试接口U-Bot

需要使用到的工具

  • FT232
  • 测试路由器
  • SecureCRT
  • 杜邦线
  • 排针
  • 万用表或者JTAGulator

先拆解一个路由器,然后首先找到对应的UART接口,焊接上排针,可以看到也有对应提示这是UART接口

image-20240712165627810

没有写出对应的引脚,这里我们可以通过两种方法

万用表去定位每一个引脚。

1、定位 GND

将万用表调到蜂鸣档,然后将黑表笔接到背面电源焊锡点,红表笔分别触碰UART四个引脚的焊接点。发出声响的就是GND引脚。

2、定位 VCC

将万用表调到直流20V,然后将黑表笔放到刚刚判断的GND引脚上,再用红表笔触碰其他三个焊接点进行测试。电压稳定在3.3V或5V左右的那个引脚即为VCC引脚。

3、定位 TXD

开机会出现数据传输,如果该引脚出现了电压变化,则该引脚是TXD。黑表笔放到刚刚判断的GND引脚上,重启路由器,用红表笔触碰其他两个引脚,电压发生变化的即为TDX

4、定位 RXD

确定了其他三个引脚之后,剩下的一个即为RDX

JTAGulator

可以使用JTAGulator去定位每一个引脚,还能知道对应的波特率,就是设备有点贵,心有余而力不足

image-20240712170120243

大概长这样,大概500左右

这是JTAGulator的教程

https://www.bilibili.com/read/cv13047230/

感兴趣的话,可以参照这个去搞

然后在知道波特率和对应的针脚后,使用FT232去对应连接,GND接GND,然后RXD接TXD,TXD接RXD,也就是前面说的UART的接法。

注意:在板子通电后最好不要将两者的VCC相连,否则可能损坏设备。

设备大概长这样:

image-20240712170600174

最后直接使用SecureCRT连接上shell即可。

我这台机器的话就是115200的波特率,然后就成功进入了U-BOOT

image-20240712173417707

或者使用minicom工具

配置号minicom后直接连接即可,配置方法如下

https://www.cnblogs.com/wonux/p/5897127.html

image-20240715141919215

但是由于我在启动系统的时候后面全是乱码了,后续提取就不在这里讲诉了,但是大概方法就是通过工具传递出来,使用mem和flash命令与内存交互提取数据

通过逻辑分析仪器saleae或者HydraBus

需要用到的工具

  • 路由器
  • saleae或者HydraBus
  • soic8夹子
  • 芯片钩子

具体操作参考这个,因为设备实在是太贵了,saleae要上千块,HydraBus最便宜也要400多块(物联网真的好花钱)

https://www.bilibili.com/video/BV1hP411H7gy/?spm_id_from=333.788&vd_source=b9c5bfe87527051f73cd5ccc7880600e