导语:在本文中,我们将使用Arduino Uno / Nano / Mega来模拟路由器上的调试引脚硬件连接 ,然后使用Arduino作为USB到串行转换器与设备进行通信,并由此获得对该设备的控制。
在生产嵌入式系统,如路由器或网络摄像头时,制造商就已预留了一些调试端口。不过对于一般的用户来说,这些预留的调试端口显然是用不到的,因为它们通常是被焊接的并受到设备外壳的保护。但是对于攻击者来说,访问这些端口就显得轻而易举了,对他们来说这些预留的端口就是连接系统的一个外部设备而已。这些端口通常会通过串行通信协议进行通信,并且包括JTAG,SPI和UART等接口。通常研究人员会利用诸如BusPirate,JTAGulator或Shikra之类的定制硬件与设备接口进行连接。
在本文中,我们将使用Arduino Uno / Nano / Mega来模拟路由器上的调试引脚硬件连接 ,然后使用Arduino作为USB到串行转换器与设备进行通信,并由此获得对该设备的控制。请注意,该项目是通过通用异步收发器(UART)进行创建的,其他项目如JTAGenum已被创建,可以通过其他接口与Arduino进行通信。
首先,需要识别物理调试引脚,在本文中,我们很幸运有一个已经被焊接在路由器上的调试端口:
为便于参考,我们将分别从左到右分配引脚:pin0-pin4。我们会在这5个引脚中,一一寻找能够Tx(发送)和Rx(接收)的引脚,以便能够与路由器进行通信。幸运的是,我们可以用万用表对引脚进行连续性测试,以识别可以跟这个引脚相连的公共端(GND)。最后发现,GND原来是pin1(从左起第二个)。
接下来,我们就要确定是哪个引脚正在传输数据(Tx)以及Arduino所在的波特率。我们可以使用Arduino的SoftwareSerial库来模拟所有未知引脚上的串行连接,并在设备启动通信过程,任何传输数据的端口都可能是我们的Tx。
首先,将MDSec UartFuzz代码项目上传到您的Arduino
接下来,将路由器连接公共端的引脚(pin1)连接到Arduino的公共端。然后将路由器的引脚从0-4(不包括公共端)顺序插入到Arduino引脚9-12(这些值在代码中互相关联,可以根据需要进行更改和扩展):
引脚配置:
开始启动包括路由器在内的运行,使用Arduino IDE的串行显示器,就可以看到该软件正在运行。请注意,由于我们是需要通过引脚进行数据传输,所以请务必不断地重新设置设备,以确保引导过程正在发送数据:
设备输出:
由于有时其他引脚会在通电或关闭时跳转或传输数据,所以用户要选择引脚或寻找更多的数据。我们建议用户最好多进行一些分析,看看哪个引脚会反复发送数据。在我们的案例中,pin0就是我们所寻找到干扰因素。我们还可以看到,软件使我们的波特率变得模糊,看起来像115200的速率的明文显示如下:
请注意,“wps eNabled”有一些损坏,这是由于SoftwareSerial是使用Bit-Banging来实现的,但显然不如UART那么精确,这一点我们已在寻找明文时考虑到这一点了。现在我们知道了公共端,Tx和波特率,就可以尝试从设备中进行读取并找到Rx。
将Arduino转换成TTL-Serial-to-USB转换器,通过删除ATmega芯片,或简单地将复位和公共端连接在一起(这取决于路由器的型号),然后重新进行电路连接:
引脚配置:
请注意,通常Tx要始终与Rx保持连接。可以利用Arduino Uno进行反转,可以尝试在你的Arduino pin0(Rx)进行反转,如果这不适合你,可以使用你最喜欢的软件来连接到串行控制台,本文使用的是minicom,并将波特率设置为了115200,重置路由器:
但在引导过程结束时,我们似乎没有得到一个shell或一个提示,这样就使Rx很难进行测试。可是我们确实看到启动过程可能会中断,最后一个过程就是将一根电线连接到Arduino的Rx引脚(通常应该是Tx引脚,因为会发送数据),并且继续绑定路由器上剩余的3个引脚,并按ctrl + c进行引导。如果它中断,则问题就出在Rx。
Rx和Tx通信的最终接线如下:
中断引导过程可以让用户访问#hi引导加载程序shell:
现在就可以使用tftp命令来上传自定义内核映像以进一步利用路由器。