原文作者:Juan Carlos Jiménez

翻译者:光棍节

原文地址:http://jcjc-dev.com/2016/05/23/reversing-huawei-3-sniffing/

前文回顾:

前两节已经找到了硬件pcb板上的串口,并了解了uboot和busybox的运行。

这一节从通信的流量出发,分析更多的信息。

一、PCB电路板中的数据流

存放在存储单元的数据是没有用的,它需要被读、写和传输才会有价值,粗略的看一下电路板,就可以看到电路板上的布局以及线路,进而得到数据流的流向,如图一所示。

图一 线路板的数据通信线路

在这里,我们不是去找硬件的后门信息,而主要是关心Ralink与flash之间的SPI数据传输。电路板上芯片的datasheet文档可以很容易的从互联网上获取,本文中主要关心下面两个芯片的文档资料,CPU 芯片Ralink RT3352F和flash芯片Spansion FL064PIF。

此时,我们已经得到芯片资料,协议等资料,接下来就就是要研究与之最相关的数据块。

二、flash芯片介绍

我们关心的是CPU与flash之间通信的数据流,首先是需要知道如何与逻辑分析仪连接,通过查看datasheet就可以分析出flash芯片的每一个引脚作用,如图二所示。

标准的SPI通信使用4个引脚:

MISO:数据线,从FlashàRalink
MOSI:数据线,从RalinkàFlash
SCK:时钟信号,因为SPI使用的是串行通信协议,MISO和MOSI是基于时钟信号完成数据传输的
CS#:片选线,控制芯片是否被选中,在这个flash芯片中,当设置为0的时候,表示有效。

图二 Flash芯片引脚意义图

知道了引脚意义之后,将这四个引脚连接到逻辑分析仪上,随机的抓取其中的数据。连接如图三所示。

图三 引脚与逻辑分析仪连接图

接下来是了解SPI配置选项,包括:

l 传输的字节顺序,即大小端(MSB和LSB),标准的是首先使用MSB
l 传输的比特位数,标准的是8位
l CPOL:时钟极性,定义SPI时钟的活动状态
l CPHA:时钟相位,定义相对于SO-数据位的时钟相位

其中最后两个参数在datasheet中定义了仅有两种组合(CPOL=0, CPHA=0)或者(CPOL=1, CPHA=1)。如图四所示。

图四 SPI flash CPOL和CPHA模式

下图五是嗅探的部分数据。

图五 嗅探的数据图

这些信号需要对照datasheet了解代表的详细含义。

图六 datasheet数据意义解释

下图七是对抓取数据的分析。

图七 抓取数据解释

Datasheet中说明flash芯片具有较快的读写速度,这是依靠多路复用器实现的,在这个路由器中没有使用,当使用了多路复用器以后抓到的数据会比较没有规律。

如果逻辑分析仪的功能不够多的时候,传输模式下需要额外的引脚的时候将会是个麻烦。

三、抽样率的重要性

逻辑分析仪是个简单的设备,映像显示是将存储器中的全部内容以点图形式一次显示出来。它将每个存储器字分为高位和低位两部分,分别经X,Y方向D/A变换器变换为模拟量,送入显示器的X与Y通道,则每个存储器字点亮屏幕上的一个点。而图解显示是将屏幕的X方向作为时间轴,将Y方向作为数据轴进行显示的一种方式。将欲显示的数字量通过D/A变换器转变成模拟量,将此模拟量按照存储器中取出的数字量的先后顺序显示在屏幕上形成一个图像的点阵,然后分析数据之后发送到计算机上面。也就是逻辑分析仪将被测数据信号用数字形式写入存储器后,可以根据需要通过控制电路将内存中的全部或部分数据稳定的显示在屏幕上,所以会得到分析精确的数据,如果输出出现问题,得到的波形也会出现问题。逻辑分析仪无论采样频率,存储空间,触发深度等资源都是有限的,我们只有充分组合协议相关的组件才能发挥其最大的效用,所以选的那款设备不是很给力的话,接口也会成为一个问题。

我记录了Ralink-Flash SPI总线,这里我使用的是saleae逻辑分析仪,最大的采样率为24 MS/s,如图八所示。

图八 24MS/s逻辑分析仪采样的数据

从上图可以看出,所示时钟信号由低到高(8个部分),而这种波形可能会导致数据冲突问题,虽然允许完全的数据传输正确,但是也需要注意这一点,这一步和计划步骤没有太大关系。 用分析仪再一次分析(100 MS/s),如图九所示。

图九 100MS/s逻辑分析仪采样数据

从图中可以看出,即使采样率很高的时候,时钟信号还是满足要求的。

如果你发现在你的采样中,有些信号丢失,你就要考虑丢失的数据是否影响你的分析,如果有影响的话,就要考虑换个高级的更贵的逻辑分析仪了。

四、数据流查看

第二节中已经分析了系统,接下来我们将用示波器链接flash的MISO和MOSI引脚来获取传输的信号。连接如图十所示。

图十 示波器连接示意图

下面链接的视频显示了数据的变化情况。 http://static.video.qq.com/TPout.swf?vid=w0303365imd&auto=0

从中可以很容易的看到读/写的动作,这些将有助于我们何时使用逻辑分析仪和使用多久。

五、分析SPI通信流

在第二节中的ATP中有一个save命令,是保存一些东西到flash中,但是帮助文档并没有说明具体做了什么,仅仅显示了进度条。接下来就是我们自己去发现save命令到底做了什么。

1、重启知道启动完成,此时路由器处于空闲状态,SPI数据流将为空
2、如第一节中那样开启ATP
3、将flash的MISO/MOSI连接到示波器上,运行save命令,计算出需要抓取的时间长
4、使用enable命令,里哟个逻辑分析仪分析闪存
5、保存并分析记录的数据

其中步骤3和步骤4可以结合使用,这样可以保证没有数据丢失。数据线连接如图十一所示。

图十一 逻辑分析仪连接图

当抓取到数据时,数据如图十二所示。

图十二 开始抓取的数据图

这里就需要分析里面的数据哪些有用,因为我们是在测试存储芯片,所以我们能够获取到读/写的数据情况以及地址属于哪里。这里采用两种方法:第一种可以考虑使用之前的时间顺序,还有一种是创建可读、写二进制文件(内存部分)。逻辑分析仪导出的是csv格式文件,我编写了python脚本,帮助我分析和搜寻文件。所以整个的分析如下:

1、输出获取的数据(CSV)
2、运行脚本程序、搜寻目标CSV文件、确定第一个命令(第一字节处)、处理参数信息(地址)、读/写分析、ASCII编码与二进制转换(payload 字节)、不同二进制文件读/写(MISO (read) 或 MOSI (write))
3、Traffic Map效果分析(hexdump -C output.bin | less)
通过上述分析,发现Traffic Map、 MOSI和MISO、地址等信息,发现save命令还是有效的。

结合第二部分的映射表,图十三所示。

图十三 地址映射表

通过上面的分析,可以知道save命令的数据流比较简单:

1、从保护区域读取64kb的数据
2、覆盖掉刚刚读取的64kb数据

MISO的二进制中可以看出,主要传输的都是1:如图十四所示。

图十四 MISO数据

而MOSI的内容更像是明文的数据,非常像第二节中发现的/var/curcfg.xml文件,包含了wifi密码等数据信息。 Flash中存在保留区是通用的做法,这些区域是为了保存各种各样的数据,以便在重启或者用户配置、恢复出厂等时候使用,save命令就是负责保存数据到这些区域的。也许是为了保留一些出厂信息,这也许就是为什么会在/var/文件夹下发现了XML文件。

六、固件

在整个挖掘过程中,目标是促进你不断深挖的动力。

我们的目标是找到生成默认wifi密码的算法,如果我们得到了这个算法并且从公开信息中获取某些参数,那么我们可能就能够获取所有的HG533路由器的默认密码。

此类安全问题已经被多次发现,通常的公开数据是从MAC地址或者SSID中获取。

当然,并不是所有的路由器设备都是这样的,通常情况下,在嵌入式工程中,需要有某段数据既能被固件知道,同时又是每一个设备都不同而且从外面的实体中可以获取的,这段数据的获取是个经常性的问题,存在于工业界的所有的物联网设备中。

七、标签的问题

在今天这个时代,你会遇到一个问题就是路由器连接到网络,而目前就是在路由器的一面可以发现一张贴纸,而上面就有路由器的默认管理密码,然后配置好后连接网络。如图十五所示。

图十五 路由器后面的标签

这个WIFI密码就是一个特定的数据块,工长生产的时候,固件和电脑都需要知道这个默认的WIFI密码,通常情况下开发人员会采用两种可行的方案:

1、设备和电脑采用相同的生成算法,而且输入的参数都知道
2、电脑为每一个设备生成一个密码,然后分别保存到设备中

除了不能让硬件厂商向每一个设备中存入不同的参数或者不愿承担这个额外写入的成本之外,第一种方法通常被视为最后的手段。第二种方法从设计上看更合理,但是通常情况下,公司不会直接随机的生成这个密码,而是会使用一种算法得到一个可预测的输出。

八、恢复出厂设置嗅探

接下来我们就要弄清楚那些动作将会启动PCB相关的数据流,有一个特殊的动作,即长按10s复位键,就会是路由器恢复出厂设置,这其中会重置wifi的密码,当然也会执行默认wifi的生成算法。如果生成算法或者参数要从flash中获取,那么我们就能获取读取的通信数据。

在长按复位键的时候,我们观察UART接口的数据,逻辑分析仪和示波器的数据,和之前的ATP的save过程一样,得到的结果如图十六、图十七所示。

图十六 UART输出结果

图十七 逻辑分析仪的数据流

同样,我们分析数据流,可以看出从保护区读取了如下的数据。

___________________  
|Transmission  Map|
|  MOSI  |MISO  |
|        |0x7e0000| Size: 12    //Part of the Protected area
|        |0x7e0000| Size: 1782
|        |0x7e073d| Size: 63683
| ERASE 0x7e073d  | Size: 64kB
|0x7e073d|        | Size: 195
|0x7e0800|        | Size: 256
|0x7e0900|        | Size: 256
---------//--------
       [...]
---------//--------
|0x7e0600|        | Size: 256
|0x7e0700|        | Size: 61
|        |0x7d0008| Size: 65529 //Part of the Protected area
| ERASE 0x7d0008  | Size: 64kB
|0x7d0008|        | Size: 248
|0x7d0100|        | Size: 256
---------//--------
       [...]
---------//--------
|0x7dff00|        | Size: 256
|0x7d0000|        | Size: 8
|        |0x1c3800| Size: 512   //Part of the Filesystem
|        |0x1c3a00| Size: 512
---------//--------
       [...]
---------//--------
|        |0x1c5a00| Size: 512
|        |0x1c5c00| Size: 512
-------------------

我决定结合之前的二进制文件作进一步的分析,读取闪存信息( ATP_LOG),这里有出厂重置以及远程访问信息,这部分是在0xff(1s ),改写内存(1s),创建新的ATP_LOG信息以及当前配置文件(curcfg.xml ),从文件系统中读取压缩数据信息。系统文件中有一部分数据是在读取( AFTER)过程中得到的,另外需要说明的就是这个和密码加密算法没有关系,可能算法已经加载到内存中了,但SPI通信方式也没有确定这一点。

在 MOSI部分可以看到新的WiFi密码(闪存)以XML字符串形式出现,如图十八所示。

图十八 新的wifi密码明文(MOSI)

如果想要获取到默认的密码,那就需要分析MISO 部分,也许内存中已经加载了,而在下一部分将会对这个深挖。而这里也需要对SPI通信在做分析( HTTP认证),主要是看新的WiFi密码,即Map、 MISO、 MOSI。下面就是在闪存分析到的信息,如图十九所示。

图十九 分析闪存得到信息

从中可以看出,这些都是明文信息,也就是说没有加密算法在里面,但这也不是决定性的,因为这也有可能是生成的凭证,或者延迟算法出现的时间也就是限制访问算法。