如何从串口获取到设备的shell?
当一个设备没有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,来讲讲为什么要找到它,其实刚刚已经讲了一半出来—-它是与设备进行通信的接口,我们想得到设备的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,有好几个工具,都大差不差:
- putty
- 串口调试助手
- SecureCRT
随便一个工具都可以连接,确定好COM口号,就可以使用指定的波特率来连接,这里波特率多试几个常见的就好,一般都可以试出来的
查看COM口的方法:此电脑 => 管理 => 设备管理器 => 端口
等待加载完成,按下回车就进入shell的界面,泪目了,看到这个shell的激动程度不亚于用树莓派提取固件,一直尝试,一直不行,换了好几台设备,终于在这台CISCO上拿到了shell
试过可以拿到shell的时候就可以焊上排针了,焊完之后就成了下面这个样子(老爸帮忙焊的,我在旁边看着真不错😀):
总结
在失败了这么多次之后,总结一下失败的经验:
可能一:
RX
和TX
线接错了解决办法:由于根据其他大师傅的说法,在启动一段时间里面电压变化较大的为
TX
,但是两个接口都差不多,没办法确认是否接正确了(听说可以将旁边的 3.3 伏特的 15K 电阻器将 TX 拉高),只能换着接,还有就是注意TX和RX要反着接,具体看上面的图可能二:焊接问题
解决办法:只能重新焊,多焊几次就熟悉了….,一般情况下焊上去就可以了,但也不排除焊坏的情况
可能三:波特率选错
解决办法:多试几次,因为测试的脚本根本不顶用…,拿常见的波特率先试,一般都能试到的
参考链接
NetGear 夜鹰TP-Link TL-WR940N RAX40V2 设备与固件分析
CVE-2017-9466: Why Is My Router Blinking Morse Code?
systemd CVE-2017-9445 Out-Of-Bounds Write Remote Code Execution Vulnerability