物联网黑客手册4 UART通信

4 UART通信

通用异步接收器/发送器(UART Universal Asynchronous Receiver-Transmitter)是一种串行通信方法,允许设备上的两个不同组件在不需要时钟的情况下相互通信。本章将深入讨论UART,因为它是最常用的通信接口之一,在物联网安全和渗透测试中具有重要意义。还有一种被称为通用同步/异步接收器/发送器(USART Universal Synchronous/Asynchronous Receiver-Transmitter)的接口,可根据需要同步或异步传输数据;不过,我们还没有看到很多设备使用这种接口。因此,我们将不再介绍 USART,而是重点介绍UART。

我们首先要奠定串行通信的基础,然后再详细介绍如何识别UART接口并与之交互。如果你以前从未接触过硬件开发,本章也是你开始硬件开发之旅的入门章节。

学完本章后,你将能够打开一个设备,查看可能的UART引脚并识别正确的引脚布局,最后能够通过UART与目标设备通信。从安全角度来看,与UART交互的能力将有助于读取设备的调试日志、获取未经验证的root shell和引导加载程序访问权限等。

4.1 串行通信

对于任何物联网或嵌入式设备,设备的不同组件都需要相互交互并交换数据。串行通信和并行通信是设备组件交换数据的两种方式。

顾名思义,串行通信用于通过给定介质一次传输一个比特,而在并行通信中,同时传输一个数据块,每个比特都需要一个单独的通道(另外还有一条参考线,通常是接地线)。

图片

由于并行通信一次传输的数据量很大,因此这种方法需要多条独立的线路来促进通信。可以想象,这将导致电路板上需要更多的空间,而这往往不是首选。

图片

因此,在处理嵌入式设备时,串行通信是一种更为常见的通信方式: 与并行通信不同,串行通信只需一条线路即可完成数据交换。

您可能听说过一些常用的串行通信通道,如推荐标准 232 (RS232 Recommended Standard 232)、通用串行总线 (USB Universal Serial Bus)、PCI(Peripheral Component Interconnect)、高清多媒体接口 (HDMI High-Definition Multimedia Interface)、以太网、串行外设接口 (SPI Serial Peripheral Interface)、集成电路 (I2C Inter-Integrated Circuit)、控制器局域网 (CAN Controller Area Network) 等。最早使用的串行通信通道是RS232,其数据传输速率为20kbps;然后是USB1.0,其传输速率为12Mbit/s;接着是USB 2.0,其传输速率为480mbps;最后是USB3.0,其传输速率为5Gbps,几乎是前者的10倍。还应指出的是,由于近年来技术的进步,串行通信的成本越来越低,速度越来越快,可靠性也越来越高。

4.2 UART的作用、原因和方法

如前所述,UART是一种异步串行通信协议,用于许多嵌入式和物联网设备。异步的意思是,与同步协议(如SPI)不同,它没有一个时钟来同步通信设备之间的时钟。

UART的数据传输不需要额外的外部时钟(CLK) 线。这也是为什么在串行设备间异步传输数据时要采取许多其他预防措施,以尽量减少数据包丢失的原因。我们将在本章后面的章节讨论波特率,这将使您更清楚地了解这一点。

4.3 UART 数据包

图片
  • 起始位

表示下一个UART数据。这通常是一个低脉冲 (0),可以在逻辑分析仪中查看。

  • 信息:

以8位格式传输的实际信息。例如,如果要传输A(十六进制值为0x41),则在信息中将以1000001的形式传输。

  • 奇偶校验位

奇偶校验位在实际应用中并不重要,因为我没有看到很多设备使用奇偶校验位。奇偶校验位用于执行错误和数据损坏检查,方法是计算信息中高值或低值的数量,根据是奇数奇偶校验还是偶数奇偶校验,这将表明数据不正确。请记住,奇偶校验位仅用于数据损坏检查和验证,而不是实际纠正。

  • 停止位: 最后一位,表示信息已传输完毕。通常由一个高电平脉冲(1)来完成,但也可能由多个高电平脉冲来完成,这取决于设备开发人员使用的配置。

我遇到的大多数设备都使用8N1配置,即8个数据位、无奇偶校验位和1个停止位(见图 4-4)。如果我们将逻辑分析仪连接到设备的UART接口,就能更好地理解这一点。逻辑分析仪是一种帮助你显示数字电路中各种信号和逻辑电平的设备。它非常易于使用,而且可以直接设置要分析的协议或通信。我建议您购买一个好的逻辑分析仪,如Saleae Logic Analyzer或Open Workbench Logic Sniffer,用于所有逻辑分析用途。

图片

4.4 UART端口类型

UART端口可以是基于硬件的,也可以是基于软件的。举例来说,Atmel的微控制器AT89S52和ATMEGA328只有一个硬件串行端口。如果需要,用户可以在特定的通用输入/输出(GPIO General Purpose Input/Output)上仿真更多的软件UART端口。相比之下LPC1768和ATMEGA2560等微控制器有多个硬件UART端口,所有这些端口都可用于执行基于UART的分析和开发。

尽管我们是从安全的角度来研究器件的,但需要了解的一点是我们正在讨论的技术–UART、JTAG、SPI、I2C 等;尽管它们可用于安全研究和利用目的,但其主要功能是促进组件间通信或为开发人员提供附加功能。

当需要将多个设备通过UART连接到一个特定设备(该设备只有有限的硬件UART引脚)时,就需要基于软件的UART。这也为用户提供了灵活性,可以在需要时将GPIO引脚用作 UART,并在以后将其用于其他用途。

我们不会详细介绍基于软件的 UART,因为在实际商用设备中,我们通常不需要多个UART端口,也没有能力(或权限)对 GPIO进行编程以仿真UART,或者仅仅是因为目标设备上没有足够的GPIO引脚可供仿真。

4.5 波特率

在使用UART不需要CLK时,我们会想到波特率的概念,它规定了设备之间传输数据的速率,或者更恰当地说,是每秒传输的比特数。之所以需要波特率,是因为UART通信中没有时钟线,因此通信双方需要相互了解数据通信的速度。这就是为什么在整个UART数据交换过程中,两个组件都会同意使用单一波特率的原因。

在安全研究过程中进行任何UART开发时,最初的步骤之一总是要确定目标设备的波特率。这可以通过多种方式完成,例如在以给定波特率进行串行接口时查看输出,如果数据似乎无法读取,则转到下一个波特率。为了方便起见,有几个波特率标准值,大多数设备都会遵守。常见的波特率有9600、38400、19200、57600和115200。尽管如此,设备开发人员仍可自由选择自定义的波特率值。

要使用上述方法确定正确的波特率,我们可以使用https://github.com/china-testing/python-testing-examples/blob/master/tools/baudrate.py。通过该脚本,我们可以在保持串行连接的同时改变波特率,并通过查看输出和目测哪种波特率能提供可读输出来轻松识别正确的波特率值。

在通过串行方式连接设备并确定波特率值之前,让我们先来了解一下通过UART与目标设备交互并利用设备所需的硬件连接。

4.6 UART开发的连接

要执行基于UART的开发,我们需要两个主要组件:目标设备和一个可以模拟串行连接访问终端设备的设备,以便目标设备能够与我们的系统交互。

以下是我们将用于本练习的硬件:

  • Edimax 3116W IP 摄像机(也可以选择任何其他具有UART接口的易受攻击设备)。
  • Attify Badge (也可以使用普通USB-TTL或BusPirate)。
  • 万用表。
  • 接头(以防焊接到空焊盘上,以便牢固连接跳线)。
  • 跳线。

要进行连接,我们首先需要确定设备的UART端口在哪里,或者UART引脚是什么。这可以通过目测设备的内部组件,寻找相互靠近的三四个引脚或焊盘来实现。这是一种查找UART引脚的简单方法,但在某些情况下,你也可能会遇到UART引脚分散在电路板上而不是集中在一处的设备。

  • edimax 3116w
图片
  • tp-link mr3020
图片
  • HUAWEI HG533
图片

UART由四个引脚组成,我们需要查找这四个引脚:

  • 传输 (Tx): 将数据从设备传输到另一端。
  • 接收 (Rx): 从另一端向设备接收数据。
  • 接地 (GND): 接地参考引脚。
  • 电压 (Vcc): 电压,通常为3.3V或5V。

要找到所有这些引脚,我们需要使用万用表,它可以帮助我们通过连续性测试(针对 GND)或查看电压差(针对其余三个引脚)来识别引脚。

万用表是电压表和电流表的组合,这意味着我们在分析过程中可以同时查看电压值和电流值。这一点非常有用。尽管大多数情况下我们只需查看电压值,但在某些情况下,您可能需要查看两个不同引脚之间的电流值,以便进行进一步分析。让我们开始吧。

4.6.1 识别UART引脚布局

如前所述,万用表是一种可以测量电压 (V)、电流 (A) 和电阻 (R) 的设备,因此被称为万用表–电压表和电流表的组合。由于我们要进行连续性测试以确定接地,因此最初将保持目标设备断电。

图片

连接好万用表后,让我们按照以下步骤查找不同的 UART 引脚。

  1. 将黑色探针放在接地表面上;这可以是任何金属表面(如设备的以太网屏蔽)或Attify Badge的GND。将红色探针分别放在四个焊盘上。重复其他焊盘,直到听到哔声。听到蜂鸣声的地方就是目标设备的接地引脚。确保设备已关闭。这里还需要注意的一点是,目标设备上会有许多接地引脚或焊盘,但我们只关注UART引脚对中的GND。
图片

2.将万用表指针放回V-20位置,因为我们现在要测量电压。将黑色探针保持在接地端,将红色探针移到UART的其他引脚上(接地端除外)。将设备通电并打开。您看到持续高电压的地方就是Vcc引脚。如果第一次没有看到,请再次通电。

  1. 再次重启设备,测量其余焊盘与接地之间的电压。由于启动时数据传输量巨大,您会发现在最初的10至15秒内电压值波动很大。该引脚就是Tx引脚。
  2. Rx可以通过整个过程中电压最低的引脚来确定,黑色探针连接至Attify Badge的GND。或者,在这一步中通常只剩下一个引脚,即Rx。

现在,您应该已经能够成功识别目标设备UART中的所有不同引脚。请记下这些值,因为我们在进行连接时会用到它们。

也可以连接逻辑分析仪分析这些值,并查看传递的值。

参考资料

  • 软件测试精品书籍文档下载持续更新 https://github.com/china-testing/python-testing-examples 请点赞,谢谢!
  • 本文涉及的python测试开发库 谢谢点赞! https://github.com/china-testing/python_cn_resouce
  • python精品书籍下载 https://github.com/china-testing/python_cn_resouce/blob/main/python_good_books.md
  • Linux精品书籍下载 https://www.cnblogs.com/testing-/p/17438558.html

4.6.2 Attify Badge介绍

Attify Badge是一款多用途工具,可帮助您通过UART、SPI、I2C等各种通信接口甚至JTAG等标准与其他物联网/嵌入式设备通信。它使用FTDI芯片,可以将硬件通信协议转换成我们系统可以理解的语言。

图片

该工具共包含18个引脚,其中10个引脚用于电压(3.3V和5V)和接地,即顶部的9个引脚和右下方的引脚。D0至D3引脚在与嵌入式设备硬件交互时具有特殊作用。

图片

表 4-1提供了与不同硬件通信协议交互的 Attify Badge引脚布局。
图片

要将Attify Badge连接到我们的系统,我们需要使用微型USB电缆。如果您使用的是AttifyOS或在Mac OS上运行,则无需任何特殊工具即可使用Attify Badge。不过,在Windows 系统上,您可能需要从 https://www.ftdichip.com/FTDrivers.htm下载FTDI驱动程序。

要验证设备是否已成功连接,可以运行 lsusb(在 Linux 机器上),它会显示设备名为Future Devices Technology International,也就是Attify Badge。

4.6.3 进行最后连接

确定设备的引脚布局后,下一步就是将设备的UART引脚连接到Attify Badge的UART。

Attify Badge的引脚是D0和D1,分别代表发送和接收。IP摄像头的发送(Tx)将连接到 Attify Badge的 Rx(D1),反之亦然,IP 摄像头的 Rx和Attify Badge的 Tx(D0)使用跳线连接。IP 摄像机的接地将连接到 Attify 徽章的接地。表 4-2 为您简化了连接。
图片

切记不要连接IP摄像机的Vcc,否则会对设备造成永久性损坏。使用跳线连接IP摄像头UART端口和 Attify Badge,并将 Attify Badge连接到系统。

图片

4.6.4 识别波特率

图片

如图所示,我们在COM端口/dev/ttyUSB0列出了我们的条目,这也是baudrate.py使用的默认COM(Communication Port)端口。继续运行sudo python baudrate.py,由于设备可能未配置为以baudrate.py选择的默认值传输数据,因此在网络摄像机启动后可能会看到乱码。使用上下箭头键在不同的波特率值之间移动。能看到可读字符的波特率就是设备的正确波特率。在我们的例子中,正确的波特率是38400。如果看不到任何数据,请重启设备并确保连接正确,Tx和Rx值正确。这就是识别任何目标设备波特率的方法。

4.6.5 与设备交互

确定正确的波特率后,下一步就是通过UART与设备交互。这可以通过baudrate.py脚本本身完成,一旦检测到正确的波特率,就按下Ctrl+C,启动名为minicom的实用程序。另一种方法是使用确定的配置手动启动一个实用程序,如screen或 minicom。

因此,我们在这里可以获得所需的两个数据值:

  1. 设备波特率: 38400
  2. Attify Badge使用的COM端口: /dev/ttyUSB0让我们使用之前给定的值启动screen。
sudo screen /dev/ttyUSB0 38400

运行此命令并重启设备,即可看到设备启动时的调试日志:
图片

如果我们再等几秒钟让设备完全启动并加载busybox,就会在IP摄像机上看到一个完整的未验证root shell:

图片

恭喜您 现在您已经拥有了设备上完整的非认证root shell。您可以在此执行多项操作,例如分析设备的文件系统、修改某些配置、识别隐藏的敏感值、转储固件等。

您也可以使用https://github.com/attify/attify-badge-tool上的 Attify Badge工具通过图形用户界面 (GUI) 执行此过程。
图片

在进行物联网安全研究的过程中,您会惊讶地发现,现实世界中有大量商用设备允许您对设备进行未经身份验证的root访问。

在进行UART开发时,需要注意以下几点:

  • 确保连接正确,即一台设备的Tx连接到另一台设备的Rx,另一台设备的Rx连接到Tx。
  • GND 连接到其他设备的 GND。
  • Vcc未连接到任何设备。
  • 正确识别波特率值,否则可能出现无法读取数据的情况。
  • 将3.3V串行设备连接到5V串行设备或其他电压水平时,请确保使用适当的电压转换器。

4.7 小结

在本章中,我们了解了如何使用串行通信,特别是UART,开始对物联网设备进行嵌入式设备开发。

UART在很多地方都能派上用场,你经常会遇到没有任何保护措施的设备,让你可以通过UART访问未经验证的root shell。

我强烈建议你在获得UART访问权限后尝试其他活动,例如与引导加载程序交互、修改配置中的某些值、找出通过UART转储固件的方法等等。

声明:文中观点不代表本站立场。本文传送门:https://eyangzhen.com/356058.html

(0)
联系我们
联系我们
分享本页
返回顶部