在前面两个部分(1,2)已经介绍了UART,BusyBox等部分的逆向调试,而这篇将会开始在流量分析方面下手,来逆向出更多的信息。
请看下图,数据存储在静态存储单元中,想要获取到这些数据,那就需要读、写或输出才能获得。而在下图就可以看到PCB电路板的布局情况,还有就是布线以及分析数据输出情况。
在这里需要说明的是我不是在寻找硬件的后门信息,主要着重于SPI数据传输情况(图中可见 Ralink标识的芯片以及外部flash),如果想要寻找相关芯片资料,这个就可以在网上找到,这里给出一些有关RT3352F(雷凌)芯片(点击我),还有64位SPI闪存(Spansion FL064PIF)的资料,现在我已经掌握芯片资料、还有之前的文章的一些协议分析内容,下面我就开始按照之前的计划进行分析了。
这里要说明一点内容就是SPI部分的,SPI的通信原理是以主从方式工作,这种模式通常有一个主设备和一个或多个从设备,需要至少4根线,事实上3根也可以(单向传输时)。也是所有基于SPI的设备共有的,它们是SDI(数据输入)、SDO(数据输出)、SCLK(时钟)、CS(片选)。
这里主要是关注于Ralink IC与闪存之间通过SPI接口进行通信的分析,在开始之前,还需要连接逻辑分析仪,由于之前已经了解到闪存的数据输出引脚所以不需要再次逆向了。
SPI口四线制引脚:MISO(主机输入/从机输出数据线, Ralink<-Flash)、MOSI(主机输出/从机输入数据线,Ralink->Flash)、串行时钟线(SCK)、CS#(片选)CS是控制芯片是否被选中的,也就是说只有片选信号为预先规定的使能信号时(高电位或低电位),对此芯片的操作才有效。这就允许在同一总线上连接多个SPI设备成为可能。
好吧,现在就可以利用分析仪进行分析了这里需要知道有关SPI配置信息,SPI是串行通讯协议,也就是说数据是一位一位从MSB或者LSB开始传输的,这就是SCK时钟线存在的原因,由SCK提供时钟脉冲,MISO、MOSI则基于此脉冲完成数据传输。
SPI支持4-32bits的串行数据传输,支持MSB和LSB,每次数据传输时当从设备的大小端发生变化时需要重新设置SPI Master的大小端,传输的数据为8 位,而最常用的时钟设置基于时钟极性(CPOL)和时钟相位(CPHA)两个参数,CPOL定义SPI串行时钟的活动状态,而CPHA定义相对于SO-数据位的时钟相位。
CPOL和CPHA[0=leading, 1=trailing的设置决定了数据取样的时钟沿,至于闪存可以参考这一点, (CPOL=0, CPHA=0) 或 (CPOL=1, CPHA=1)。
下面就是嗅探到的数据
这里你需要了解FL064PIF的信息(网上有更多的资料,感兴趣的小伙伴可以去看看)
下面是最终分析到的数据信息
在之前的资料可以分析 FL064PIF芯片的读写速度相对比较快,而多路复用器在这方面起到了作用。如果逻辑分析仪功能不多的话,分析数据就有些费力了。
逻辑分析仪是分析数字系统逻辑关系的仪器,映像显示是将存储器中的全部内容以点图形式一次显示出来。它将每个存储器字分为高位和低位两部分,分别经X,Y方向D/A变换器变换为模拟量,送入显示器的X与Y通道,则每个存储器字点亮屏幕上的一个点。而图解显示是将屏幕的X方向作为时间轴,将Y方向作为数据轴进行显示的一种方式。
将欲显示的数字量通过D/A变换器转变成模拟量,将此模拟量按照存储器中取出的数字量的先后顺序显示在屏幕上形成一个图像的点阵,然后分析数据之后发送到计算机上面。
也就是逻辑分析仪将被测数据信号用数字形式写入存储器后,可以根据需要通过控制电路将内存中的全部或部分数据稳定的显示在屏幕上,所以会得到分析精确的数据,如果输出出现问题,得到的波形也会出现问题。
逻辑分析仪无论采样频率,存储空间,触发深度等资源都是有限的,我们只有充分组合协议相关的组件才能发挥其最大的效用,所以选的那款设备不是很给力的话,接口也可以成为一个问题。我记录了Ralink-Flash SPI总线,这里我使用的是saleae逻辑分析仪,速率24 MS/s
如图中所示时钟信号由低到高(8部分),而这种波形可能会导致数据输出出现问题,虽然允许完全的数据传输正确,但是也需要注意这一点,这一步和计划步骤没有太大关系。用分析仪再一次分析(100 MS/s)
现在得到的这个时钟信号可以说可以了,采样率也满足了。如果想要更好的分析,可以考虑买一个更高性能的分析仪
这里需要第二部分的分析,SPI接口以及之前分析的MISO和MOSI部分,可以在下面继续分析
之前第二部分对于命令行页面(ATP CLI )的一些命令已经介绍了,这个时候需要开启路由器,这时候路由器是闲置的情况,并没有开始SPI通信,开始第一部分命令行页面(ATP CLI),然后连接MISO/MOSI,再save,然后计算我需要多少时间来获取到数据。
另外需要使用enable命令,然后利用逻辑分析仪分析闪存,最后运行save命令,分析已经获取到的数据。MISO/MOSI以及enable命令两部分可以在一起使用,这样就可以获取到流量范围,这次测试也很方便
这就是获取到的数据信息
这里就需要分析里面的数据哪些对我有用,以及读写数据情况。这里主要可以采取两种方法,第一种可以考虑使用之前的时间顺序,还有一种是创建可读、写二进制文件(内存部分)。之前的分析仪分析输出的文件格式为 CSV,我决定编写一个Python脚本程序来帮助我分析文件以及搜寻需要使用的文件binmaker.py以及 traffic_mapper.py。
整体工作如下,分析数据(CSV)、运行脚本程序、搜寻目标CSV文件、确定第一个命令(第一字节处)、处理参数信息(地址)、读/写分析、ASCII编码与二进制转换(payload 字节)、不同二进制文件读/写(MISO (read) 或 MOSI (write)),以及后来Traffic Map效果分析(hexdump -C output.bin | less)。效果:Traffic Map、 MOSI和MISO、地址。在图中可以看到使用save命令还是有效的
同时可以读取64kB 数据(protect部分)、还有修改之前获取到的数据,在另一部分(MISO)可以看到很多数据(1s)
大多数的二进制文件(MOSI)里面都是明文数据(XML),和之前的文件部分很像,包含了WiFi数据信息。也许是为了保留一些出厂信息,这也许就是为什么会在/var/文件夹下发现了XML文件。
在整个过程中方向是很重要的,那就是能不能分析出WiFi密码的加密算法,以后再遇到这个型号的路由器就可以很快知道密码,即使在公共场所已知Mac地址以及无线网名然后获取路由器型号。但作者表示这个想要做到并不容易,需要对固件完全的了解,而不是直接外部的调试,所以非常的困难,而这个也仅仅是理论。
在今天首先你会遇到一个问题就是路由器连接到网络,而目前就是在路由器的一面可以发现一张贴纸,而上面就有路由器的默认管理密码,然后配置好后连接网络。
这个默认密码就像是一个特定的日期,就在路由器上面的贴纸,同时也需要它来调试路由器。可以说是,在路由器和计算机使用相同的算法,这样可以保证同步性。而你也可以在计算机上面生成密匙并储存。作者表示这些算法都可以加密密匙,然后可以节约成本,这要比硬件那种加密成本更低一些。
现在继续来收集数据信息,而现在更需要弄清PCB电路板上面的详细情况,这个时候需要按住出厂重置按钮10s,这个时候的WiFi相关密码应该是默认情况下的,如果相关信息在闪存中,我就可以嗅探并分析到它,下面就是我需要做的,分析UART,同时按下复位键之后查看分析仪情况,下面UART 输出
流量
Python脚本(Traffic Map、MOSI、MISO),之前的部分(traffic map)在protect 区域的数据情况,并从中读取数据
___________________ |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字符串形式出现
如果想要获取到默认的密码,那就需要分析MISO 部分,也许内存中已经加载了,而在下一部分将会对这个深挖。而这里也需要对SPI通信在做分析( HTTP认证),主要是看新的WiFi密码,即Map、 MISO、 MOSI。下面就是在闪存分析到的信息
正如你说看到的,这些都是明文信息,也就是说没有加密算法在里面,但这也不是决定性的,因为这也有可能是生成的凭证,或者延迟算法出现的时间也就是限制访问算法。
以后的文章将会分析深挖闪存并分析数据算法,还有把前面的部分都联系在一起作分析。
*参考来源:jcjc-dev,饭团君投递,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)