前两节(HG533路由器分析教程二、教程一)已经找到了硬件 pcb 板上的串口,并了解了 uboot 和 busybox 的运行。
这一节从通信的流量出发,分析更多的信息。
一、 PCB 电路板中的数据流
存放在存储单元的数据是没有用的,它需要被读、写和传输才会有价值,粗略的看一下电路板,就可以看到电路板上的布局以及线路,进而得到数据流的流向,如图一所示。
图一 线路板的数据通信线路
在这里,我们不是去找硬件的后门信息,而主要是关心 Ralink 与 flash 之间的 SPI 数据传输。 电路板上芯片的 datasheet 文档可以很容易的从互联网上获取,本文中主要关心下面两个芯片的文档资料, CPU 芯片 Ralink RT3352F 和 flash 芯片 Spansion FL064PIF。
此时,我们已经得到芯片资料,协议等资料,接下来就就是要研究与之最相关的数据块。
二、 flash 芯片介绍
我们关心的是 CPU 与 flash 之间通信的数据流,首先是需要知道如何与逻辑分析仪连接,通过查看datasheet 就可以分析出 flash 芯片的每一个引脚作用,如图二所示。
标准的 SPI 通信使用 4 个引脚:
图二 Flash 芯片引脚意义图
知道了引脚意义之后,将这四个引脚连接到逻辑分析仪上,随机的抓取其中的数据。连接如图三所示。
图三 引脚与逻辑分析仪连接图
接下来是了解 SPI 配置选项,包括:
其中最后两个参数在 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。下面就是在闪存分析到的信息,如图十九所示。
图十九 分析闪存得到信息
从中可以看出, 这些都是明文信息,也就是说没有加密算法在里面,但这也不是决定性的,因为这也有可能是生成的凭证,或者延迟算法出现的时间也就是限制访问算法。
本文由 看雪智能硬件安全小组成员 光棍节 编译,来源 Juan Carlos Jiménez@The World
戳👇 图片加入看雪智能硬件安全小组哦!
❤ 往期热门内容推荐
更多优秀文章,长按下方二维码,“关注看雪学院公众号”查看!
看雪论坛:http://bbs.pediy.com/
微信公众号 ID:ikanxue
微博:看雪安全
投稿、合作:www.kanxue.com