1、硬件基础知识
1.1、路由器FLASH
FLASH也叫闪存,是路由器中常用的一种内存类型。它是可读可写的存储器,在系统重新启动或关机之后仍能保存数据。FLASH中存放着当前正在使用的路由器操作系统等信息。
路由器的FLASH就像计算机的硬盘。我们的硬盘通常会被格式化成多个分区。同样的原理,FLASH也会被格式化为多个分区。通常情况下,FLASH分为4个区块,其作用如下:
bootloader:主要功能时对硬件环境进行初始化、更新固件及认识操作系统的文件格式并将内核加载到内存中去执行。
Kernel:操作系统的内核。
Root Filesystem:操作系统的根文件系统,如squashfs、rootfs等。
NVRAM:作用是保存路由器中的配置文件。路由器在启动之后会从NVRAM中读取配置文件,对路由器进行设置。用户修改路由器设置后,系统会将修改后的参数写回NVRAM中。
路由器的FLASH中存储的数据对于我们进行路由器安全研究具有十分重要的意义。我们可以读取NVRAM中的配置信息,以了解当前路由器中的敏感信息,还可以从FLASH中提取固件。
1.2、硬件提取数据的思路
通过接触硬件进行数据提取的方法很多,通常情况可以考虑以下三种方案:
1、通过路由器主板上的JTAG接口提取FLASH、NVRAM等。这种方法的优点是只需要一根JTAG线,不需要太多的辅助设备,缺点是需要路由器CPU支持JTAG,主板上要有JTAG接口。
2、从主板上取下的FLASH芯片中提取。这种方法可以在路由器不支持JTAG方式时使用,但缺点也很明显------从主板上取出芯片可能会对路由器造成物理损伤。
3、使用测试夹从FLASH芯片中提取。使用测试夹的优点是不需要从路由器上取下芯片,只需要用测试夹夹住芯片引脚即可,缺点是对不同引脚数的FLASH芯片需要使用对应的测试夹。
2、路由器串口
路由器的串口对于开发人员来说,通常可以用串口实现如下功能:
1、访问路由器的CFE(Common Firmware Environment 统一固件环境)。
2、观察boot和调试信息。
3、通过一个Shell与系统进行交互异步串行通信。
在路由器中,我们要寻找的串口不是指通常所见的RS232,而是指UART(通用异步收发器),它是路由器设备中比较常见的一种接口。虽然RS-232和UART在协议方面是兼容的,但在电压上却是不兼容。UART通常在3.3伏特进行操作,但也可运行在其他标准电压(如5伏特、1.8伏特等)下。
2.1、探测串口
我们使用基本的观察法和万用法从复杂的路由器主板中找出UART,并确定UART的每一个引脚的用途。
首先,我们通过肉眼观察路由器主板上的引脚。一般来说,UART至少包含以下4个引脚。
1、Vcc(VCC):电源电压。该引脚电压较稳定。
2、Ground(GND):接地。该引脚电压通常为0.
3、Transmit(TXD):数据发送引脚。
4、Receive(RXD):数据接收引脚。
也就是说,我们首先要注意在路由器主板上那些单行具有4~6个引脚的位置。但这种方法不一定在任何时候都有效,因为这些引脚的位置是由各个厂商设计的,没有统一标准。
找到串口以后,我们需要区分这些引脚的功能。可以通过目测法和万用表测试法。
2.1.1、目测法
主板在印刷时都会遵循一些规律,这些规律可以帮助我们识别串口的引脚。
(1)VCC引脚特点:
VCC引脚通常被做成方形,从路由器主板上可以看到较宽的走线,那么该引脚极有可能也是VCC引脚。
(2)GND引脚特点:
GND引脚通常存在多条走线连接到周围的地线(GND)。
2.1.2、万用表测量法
(1)测试GND引脚
将万用表调到电阻测量的最小档。这里最小为200欧姆,因此选择电阻200欧姆档位。然后,我们需要确定万用表的两种表应该放在哪些位置。通常金属屏蔽是一个方面测试的接地点,因此,将一只表笔放在金属屏蔽罩上,用另一只表笔分别接触10个引脚,测试金属屏蔽罩与串口的10个引脚,电阻为0的引脚即为GND引脚。
(2)测试VCC
虽然VCC引脚对于我们使用路由器的串口是无关紧要的,但是确定VCC引脚可以排除它作为RXD引脚和TXD引脚的可能性,因此也是有必要的。将万用表量程放在直流电压2-伏特档位上,给路由器上电(将路由器电源接通),从路由器启动到系统完全启动这段时间内观察到电压值基本稳定在3.30伏特。
(3)测试TXD引脚
当串行端口处于激活状态并发送数据(否则无法测试出发送引脚)时,发送引脚时相当容易识别的。主板上的发送引脚被拉高到与VCC引脚相同的电压时,通常为3.3伏特。在有数据发送时,电压将下降到0.当读取的是一个不断变化的直流电压时,数字万用表将显示最终的平均采样电压。因此,如果万用表显示引脚电压下降,表示该引脚有数据发送,由此可以判断该引脚是TXD引脚。
虽然这是识别发送引脚的一种有效方法,但是值得注意的是,如果串行端口只发送少量数据,通过锻压波动判断可能就不是那么准确了,这是我们需要使用示波器或逻辑分析仪捕获发送引脚的数据活动。
(4)测试RXD引脚
准确地识别接收引脚时最困难的,因为它没有十分有效的特征定义。通常我们通过测试找出TXD引脚,另一个引脚就是RXD引脚了。
2.2、连接串口
在识别了串口的各个引脚之后,我们可以通过一条USB转UART适配器的线可以连接了。将UART适配器的USB接口端插入计算机的USB接口,将UART适配器连接到路由器串行端口中,使用方式如下:
1、将适配器的GND连接到串口的GND。
2、将适配器的RXD连接到串口的TXD。
3、将适配器的TXD连接到串口的RXD。
连接上串口后,我们需要检查串行端口的协议设置,串行端口有多种设置,但是在这里我们只需要完成波特率的设置即可。尝试错误是识别波特率最快和最简单的方法。因为串行端口通常用于显示调试信息(即它们发送ASCII数据),并且只有少数可能频率的波特率,所以我们可以逐一测试可能的波特率,直到输出可理解的数据(如ASCII码)时,就找到了当前串口的波特率。
baudrate.py有一个功能选项“-a”可以自动检测波特率。
2.3、在linux下读取路由器串口数据
1、通过miniterm.py连接路由器串口
- baudrate.py获取波特率。
- 运行sudo miniterm.py /dev/ttyUSB0 波特率值(例子),此时,miniterm.py处于等待状态。启动路由器(接通电源),可以看到中断打印的启动信息。
2、路由器CFE命令模式
在路由器启动阶段,按“Ctrl+C”组合键可以终止路由器系统的启动过程,进入CFE命令行模式。(实例WRT54G路由器)
在CFE命令行模式下,使用这些命令可以完成路由器CFE、FLASH、NVRAM的相关操作。
3、路由器linux系统模式
直接在路由器启动后,进入系统模式,操作路由器。
2.4、在windows下读取路由器串口数据
在windows下有很多串口调试工具,例如Putty等。具体也是设置波特率还有Serial类型。
3、JTAG提取数据
为了解决提取FLASH数据问题,我们使用JTAG提取数据。
3.1、JTAG连接
JTAG主要应用于电路的边界扫描测试和可编程芯片的在线系统编程。JTAG也是一种国际标准测试协议,主要用于芯片的内部测试。现今大多数的高级器件都支持JTAG协议。标准的JTAG接口是4线,TMS、TCK、TDI、TDO分别为模式选择、时钟、数据输入、数据输出。
JTAG引脚的相关定义如下:
- TCK为测试时钟输入。
- TDI为测试数据输入,数据通过TDI引脚输入JTAG接口。
- TDO为测试数据输出,数据通过TDO引脚从JTAG接口输出。
- TMS为测试模式选择,用于设置JTAG接口处于某种特定的测试模式。
- TRST为测试复位,输入引脚、低电平有效。该引脚非必须,是可选项。
- GND为接地。
TRST引脚是一个可选的、相对待测逻辑低电平有效的复位开关。根据芯片的不同,它通常是异步的,但有时也可能是同步的。如果该引脚没有定义,则待测逻辑可由同步时钟输入复位指令复位。因此,在通常情况下,我们只需连接TDI、TDO、TCK、TMS、GND这5根线就够了。
一个含有JTAG Debug接口模块的CPU,只要时钟正常,就可以通过JTAG接口访问CPU的内部寄存器和挂在CPU总线上的设备,如FLASH、RAM、SOC(System on Chip)内置模块的寄存器。
确定JTAG接口所具备的能力以后,要想使用这些功能,还需要软件配合,所实现的功能则由具体的软件决定。
4、brjtag的使用
brjtag工具是一款用于Broadcom CPU路由器JTAG连接线的FLASH刷写工具.
4.1、基本安装(待续)
4.2、提取FLASH
FLASH芯片中存储了路由器的固件,其中包含路由器的bootloader信息。因为每个路由器厂商在对操作系统进行编码和压缩的时候可能会使用一些非标准的算法,因此,有些时候,提取和分析bootloader也是很有必要性的。在无法通过网络下载路由器固件时候,可以通过JTAG方式读取路由器FLASH中的固件,对文件系统及bootloader进行提取和分析。
使用brjtag对路由器FLASH进行操作的基本命令如下:
- brjtag-backup:kernel:备份固件
- brjtag-erase:kernel:擦除固件
- brjtag-flash:kernel:写入固件
- brjtag-backup:wholeflash:备份wholeflash(包含CFE/NVRAM/KERNEL)。
- brjtag-earse:wholeflash:擦除wholeflash(包含CFE/NVRAM/KERNEL)。
- brjtag-flash:wholeflash:写入wholeflash(包含CFE/NVRAM/KERNEL)。
4.3、提取CFE
使用brjtag读路由器NVRAM的基本命令如下:
- brjtag-backup:cfe:备份CFE。
- brjtag-earse:cfe:擦除CFE。
- brjtag-flash:cfe:写入CFE。
4.4、提取NVRAM
路由器的配置文件都存放在NVRAM中,因此,通过读取NVRAM可以得到路由器的所有配置信息。使用brjtag读取路由器NVRAM的基本命令如下。
- brjtag-backup:nvram:备份NVRAM。
- brjtag-earse:nvram:擦除VMRAM。
- brjtag-flash:nvram:写入VNRAM。