对TP-Link TL-WR841N无线路由器的逆向分析实战
2019-09-08 11:28:40 Author: www.4hou.com(查看原文) 阅读量:195 收藏

TL-WR841N是一款价格低廉(18美元)且非常受欢迎的Amazon.com路由器。它是截止到目前Amazon.com上十大最畅销的路由器之一。作为一款流行的路由器,TP-Link已经在TL-WR841N这款设备上发布了多次版本更新。

OpenWRT支持此路由器的旧版本更新可能是此路由器如此受欢迎的众多原因之一。OpenWRT是嵌入式设备的Linux发行版,网上有许多操作指南和教程,内容涉及如何为此设备的旧版本设置硬件调试接口。但是,由于OpenWRT已经不再支持此设备的后续版本,因此有关较新更新的教程数量已逐渐减少。

在这篇文章中,我们将使用TL-WR841Nv14路由器,并概述使用BusyBoxgdbserver在此设备上设置远程调试所需的步骤。

1567649146176.png

图1 – TP-Link TL-WR841Nv14路由器

0x01 TL-WR841Nv14路由器

该路由器使用的是IEEE 802.11n技术,可提供高达300 Mbps的吞吐量。它有两个不可拆卸的天线,此路由器的外壳仅通过底部的两个螺钉固定,标签下面没有任何螺丝钉。

图2 – 路由器的底部

除了螺钉外,外壳还通过7个夹子牢牢固定,这些夹子非常坚固,我们花了很长时间去掉这些夹子。

图3 – 路由器的内部视图

打开路由器外壳,我们可以看到所有主要组件:带有MIPS24Kc处理器的MEDIATEK MT7628NN片上系统(SoC),ZENTEL A3S56D40GTP-50 256MB SDRAM和GigaDevice 25Q32CSIG SPI闪存。

图4 – MEDIATEK MT7628NN SoC的近视图

图5 – Zentel SDRAM的近视图

图6 – GigaDevice SPI闪存的近视图

电路板由4个registration marks固定,没有使用任何螺钉。PCB的下面只有用于通孔元件的焊盘,表面的组件只有顶部安装。这些设计细节表明PCB已经优化过,这样可以降低成本。

图7 – PCB的下表面

在电路板正面附近,在SPI闪存附近的J1处有一个UART调试接口。电路设计师标记了RX和TX引脚,使用万用表快速测量Vcc引脚显示它是3.3V接口。这样可以方便我们在一些针头上焊接。

图8 – UART调试接口的近视图

0x02 get shell

在我们的实验室中,我们只有一个5V USB到串行TTL的电线。幸运的是,我们还有一个基于BSS138的双向逻辑电平转换器。逻辑电平转换器允许我们的5V电缆通过将USB信号从USB转换为路由器所需的3.3V信号,与3.3V UART接口通信。我们可以通过逻辑电平转换器将5V电缆的RX,TX和接地引脚连接到PCB的3.3V UART接口。故意将Vcc引脚保持未连接状态,以避免损坏目标板。

图9 – 串行通信设置的框图

使用PuTTY连接到串行接口,波特率为115200。

图10 – UART的输出

连接成功了!我们现在从路由器的UART输出,但路由器对键盘输入没有响应,到底是怎么回事?以下是我对设置进行故障排除的步骤:

1 .验证串行线路是否正常

线路的TX连接可能断开了,而没有将信号发送到路由器。为了验证线路的连通性,我用跳线短接了电缆的RX和TX引脚,并使用PuTTY查看屏幕上出现的自己的按键。这样做有助于我们验证我们的USB转串口线路是否正常工作。

2.验证逻辑电平转换器是否有效

使用硬件时,任何事情都是可能发生,逻辑电平移位器可能具有弱焊点并且不能正确地将TX信号传输到路由器。我们可以通过用示波器观察逻辑电平转换来验证逻辑电平转换器的功能。我们设置CH1来探测来自电缆的TX信号,并设置CH2来探测逻辑电平移位器的输出。在本实验中,我们仅将电平转换器输出连接到示波器的CH2,并将其与路由器断开连接。

图11 – 步骤2中设置的调试框图

然后,我们使用PuTTY连接发送空格字符以创建信号并获得以下输出:

图12 – 初始示波器输出

从上图中,我们可以看到CH2的波形与CH1匹配并具有预期的电平移位信号。此外,数字示波器正确解码UART信号并显示正在传输的空格字符(ASCII 0x20),这一步帮助我们验证了我们有一个正常工作的逻辑电平转换器。

到这个时候,我们知道线路,逻辑电平转换器和路由器都在按预期工作,但不知何故,它们在连接在一起时不起作用。我将这个问题发到了Twitter:

3.调试整个设置

完成上述两个步骤后,我们可以看出所有组件都可以单独工作,但连在一起就不行了。这表明设置中存在系统错误,我们按照图9中的原理图重新连接了所有部件,并继续使用示波器进行查看。这次,我们设置CH1来探测来自电缆的TX信号,并设置CH2来探测路由器RX引脚上的信号。在PuTTY终端中发送空格字符会从示波器中产生以下输出:

图13 – 第二个示波器读数

CH2仍在转换电平,除了逻辑高电平现在只有1.52V!需要进一步查看。。。。。

4.测试路由器

如果仔细观察J1 UART接头周围的电路,可以找到引脚头附近的三个SMT电阻,即R18,R87和R89。使用万用表上的连续性测试功能,我们确定R18是连接到RX引脚的1kΩ电阻。这就是问题所在!

我们不想去除SMT元件,接受了损坏路由器的风险,直接将5V RX信号从串行电缆插入路由器的RX引脚。

现在出现了功能齐全的双向串行终端:

图14 – 双向串行终端

以下是完成的硬件设置,不需要示波器了。

图15 – 完整的硬件设置

0x03 查看shell

当我们在shell中检索时,发现固件是基于Linux的,并且运行着一个非常古老的Linux内核。  

图16 – 显示Linux版本

为了节省空间,许多Linux实用程序已从设备中删除,设备上的shell功能非常有限,并且设备上的BusyBox实用程序也非常简单。

图17 – 路由器shell上的可用命令

0x04 上传BusyBox和gdbserver

BusyBox是一个经过大小优化的Linux实用程序包。由于文件比较小,因此非常适用于嵌入式Linux设备。我们从串行接口获得的shell具有有限的功能就是BusyBox精简版本。通过设备上现有的TFTP客户端上传我们自己的full BusyBox,可以让方便分析逆向。可以在官方网站上找到预编译的小端MIPS BusyBox二进制文件。

使用该mount命令,可以看到/var是存储BusyBox二进制文件的唯一可用分区。由于/var是一个ramfs类型的文件系统,当路由器重新启动时,写入的文件将会全部消失。

图18 – 确定设备上的可写位置

可以使用以下命令将BusyBox和gdbserver文件传输到路由器上:

图19 – 安装BusyBox和gdbserver

在向文件添加执行权限后,可以执行我们的BusyBox版本并可以访问更多Linux实用程序。

图20 – 安装了完整BusyBox的可用命令

0x05 设置GDB

假设我们想调试dropbear路由器上的SSH服务器。在启动GDB服务器之前,应该提取目标二进制文件并将其保存到将要运行GDB客户端的计算机上,这有助于将调试符号加载到GDB客户端。

找到dropbear SSH服务器的PID后,在路由器上运行以下命令启动GDB服务器:

 gdbserver localhost:23947 --attach <PID>

在GDB客户端主机上,运行以下命令:

 gdb-multiarch -x dbgscript

图21 – GDB会话的输出

gdbscript的内容如下:

现在已成功连接到了gdbserver,这样就能够逆向分析并挖掘一些漏洞了:

图22 – GDB会话输出的crash

0x06 总结

许多研究员不愿意深入研究硬件漏洞研究,其中一个原因是,环境中会出现很多无法预料的事情。发生这种情况时,首先验证每个组件是否单独正常工作, 然后从已知的工作组件,通过测量连续性,电压和信号来验证连接是否正常。最后,使用示波器有助于对硬件进行故障排除。

本文翻译自:https://www.zerodayinitiative.com/blog/2019/9/2/mindshare-hardware-reversing-with-the-tp-link-tl-wr841n-router如若转载,请注明原文地址: https://www.4hou.com/wireless/20173.html


文章来源: https://www.4hou.com/wireless/20173.html
如有侵权请联系:admin#unsafe.sh