当一个设备没有telnet,没有ftp,没有ssh,那我们怎么获取到此设备的调试能力呢?拆!

UART接口

拆开设备,绿的一块黑的一块,第一次看确实有点无从下手,别慌,仔细在板子上寻找连着的3个口或者4个口,很容易就能找到它—-UART,UART是个什么玩意儿呢? UART的全称为Universal Asynchronous Receiver/Transmitter,中文名字叫通用异步传输收发传送器,它充其量就是一个设备之间的传输协议,那何为异步呢?在介绍异步传输的时候,先来看看同步传输:

下面是SPI(Serial Peripheral Interface)的通信模型,有一条SCK时钟控制线,来进行进行数据传输时的同步,这就是同步的含义!

回头来看,异步就是没有时钟信号来同步发送端和接收端,用通俗一点的话来说就是发送端可以在任何时候向接收端发送数据,什么意思呢?我们思考在Windows下进行键盘输入这个例子,我们什么时候按下键盘,操作系统是不会知道的,当我们按下某个键的时候,比如按下z,键盘就会往消息队列发送消息也就是z的ascii码,这就是异步传输!

那它是怎么知道一个消息的开头的呢?答:Start Bit会告诉它,不传输数据的时候它保持高电平,当开始传输的时候,它将拉低电平通知设备准备接收数据,在结束的时候拉高电平,也就是Stop Bits,可问题又来了,它不与设备同步,那接收数据的时候怎么知道传输的速率是多少呢?答:波特率,当设备接收到电平从高电平向低电平跃迁的时候,就以波特率所对应的频率进行接收数据(波特率是事先就设置好的)

下图后面两位分别是奇偶校验,校验的方法和TCP/IP协议里的奇偶校验一样,不做赘述,stop bit则是将低电平拉高到高电平的信号,具体可以参考下面的链接:

UART:了解通用异步接收器/发送器的硬件通信协议

回归基础:通用异步接收器/发送器 (UART)

总算有点眉目了:同步传输与异步传输

数据包结构图:

介绍完了UART,来讲讲为什么要找到它,其实刚刚已经讲了一半出来—-它是与设备进行通信的接口,我们想得到设备的shell,那必然要跟它进行通信,UART就扮演着这么个角色,如果你要问为什么会留下这样的一个接口给我们拿shell呢?答案也很明了,即开发人员也是要调试的😀!所以就留下这么一个接口

寻找UART接口

下图是TP-LINK TL-WR841N路由器的UART示意图(红色框框里面的就是),有几种方法可以定位UART在哪:

  • 有些板子上直接印有字
  • 拿手电筒照一下板子
  • 试着用万用表测一下

找到之后,那么这四个口是什么东西呢?这就需要用到万用表来测试了!

GND

介绍:GND是电线接地端的简写,代表地线或0线。这个地并不是真正意义上的地,是出于应用而假设的一个地,对于电源来说,它就是一个电源的负极

识别:拔下设备的电源,将万用表扭到蜂鸣裆,黑色探针接触板卡上的金属,红色探针依次与四个口触碰,当听到万用表发出”bibi”或者”didi”(或者其他声音)的声音就是GND

VCC

介绍:C=circuit 表示电路的意思,即接入电路的电压

识别:插上设备的电源,将万用表扭到20v,黑色探针接到刚刚测出来的GND,红色探针去触碰剩下的三个口,直到有测到有个口的电压为3.3V或者5V,就是VCC

TX(transmission of data)

介绍:发送数据

识别:插上设备的电源,将万用表扭到20v,在路由器启动的一段时间中,用黑色探针接到GND,分别红色探针去触碰剩下的俩个口,电压变化较大的即为TX

RX(receiving of data)

介绍:接收数据

识别:识别完上面的接口,剩下的就是咯!

找到接口之后,就可以拿杜邦线来连接UART,买了下面的阵脚和TTL转USB,为什么要用FT232呢?因为电脑没有转化电平信号的硬件,下图是淘宝买的FT232:

需要注意的是RX和TX与FT232上的RX和TX反着接,就像下图一样,先不要焊排针上去,先不要焊排针上去!!!先用手定住测试一下,没问题了,再焊上去!

连接完成之后就可以使用串口调试工具来获取一个shell,有好几个工具,都大差不差:

随便一个工具都可以连接,确定好COM口号,就可以使用指定的波特率来连接,这里波特率多试几个常见的就好,一般都可以试出来的

查看COM口的方法:此电脑 => 管理 => 设备管理器 => 端口

等待加载完成,按下回车就进入shell的界面,泪目了,看到这个shell的激动程度不亚于用树莓派提取固件,一直尝试,一直不行,换了好几台设备,终于在这台CISCO上拿到了shell

试过可以拿到shell的时候就可以焊上排针了,焊完之后就成了下面这个样子(老爸帮忙焊的,我在旁边看着真不错😀):

总结

在失败了这么多次之后,总结一下失败的经验:

  • 可能一:RXTX线接错了

    解决办法:由于根据其他大师傅的说法,在启动一段时间里面电压变化较大的为TX,但是两个接口都差不多,没办法确认是否接正确了(听说可以将旁边的 3.3 伏特的 15K 电阻器将 TX 拉高),只能换着接,还有就是注意TX和RX要反着接,具体看上面的图

  • 可能二:焊接问题

    解决办法:只能重新焊,多焊几次就熟悉了….,一般情况下焊上去就可以了,但也不排除焊坏的情况

  • 可能三:波特率选错

    解决办法:多试几次,因为测试的脚本根本不顶用…,拿常见的波特率先试,一般都能试到的

参考链接

NetGear 夜鹰TP-Link TL-WR940N RAX40V2 设备与固件分析

学习拆机调试路由器

HG533路由器分析系列教程之一:找到硬件调试接口

通过设备UART接口调试获取shell

5分钟教程:如何通过UART获得root权限

CVE-2017-9466: Why Is My Router Blinking Morse Code?

TP-Link WR841N路由器任意代码执行漏洞分析

systemd CVE-2017-9445 Out-Of-Bounds Write Remote Code Execution Vulnerability

硬件逆向介绍:查找 UART 并获取shell

TP-Link TL-WR940N