如何黑入汽车:黑客主义行动力(11)

  • 汽车黑客是黑客学科的最前沿

欢迎回来!

如果您还没有读过前面的部分,在这里看到:

汽车黑客是黑客学科的最前沿。

对汽车的黑客入侵可能会对社会产生巨大影响。想象一下,在网络战中,反对派指挥官雇用黑客操纵敌方坦克、吉普车和其他车辆;或者更平凡一些,想象一下一个黑客可以打开、启动和控制您的车子 ……

本文将建立一个仿真环境,您可以在其中使用一些知识来分析和破解汽车。首先需要介绍一些基本知识。

基础知识

在深入研究汽车黑客之前,需要首先了解下基础知识。汽车电子设备使用几种不同的协议在多个微控制器、传感器、仪表、执行器等东西之间进行通信。这些协议中使用最广泛的是控制器局域网CAN

CAN 首先是由德国工业巨头 Robert Bosch GmbH 开发的,该公司以其汽车电子产品而闻名。它于1986年在美国汽车工程师协会(SAE)会议上首次发布。CAN协议已标准化为ISO 11898–1 和 ISO 11898–2。它被设计用于微控制器和设备之间在车辆内进行稳定的通信,而无需主机。

CAN作为广播类的网络运行,类似于以太网中的广播数据包或旧时代的集线器(1980–90年代)。网络上的每个节点都可以 “看到” 每一个传输。

不同于以太网或TCP/IP(但类似于 SCADA 系统中的 modbus),你不能向单个节点发送报文,但CAN提供了本地过滤功能,因此每个节点只对与其操作相关的报文采取行动。你可以将其视为 “内容报文”,内容决定了目标节点。

CAN网络可以配置为使用两种不同的消息(或“帧”)格式:标准或基本帧格式(在CAN 2.0 A和CAN 2.0 B中描述)和扩展帧格式(仅由CAN 2.0 B描述)。

两种格式之间的唯一区别是,“CAN基本帧”支持标识符长度为11位,“CAN扩展帧”支持标识符长度为29位,由11位标识符(“基本标识符”)和一个18位扩展(“标识符扩展”)组成。

CAN基本帧格式和CAN扩展帧格式之间的是通过使用IDE位进行区分的,该位在传输显性时为11位帧,而在传输隐性时使用29位帧。

支持扩展帧格式消息的CAN控制器也能够发送和接收CAN基本帧格式信息。所有的帧都以开始位(SOF)作为信息传输的起始。

CAN有4种帧类型:

  • 数据帧:包含用于传输的节点数据的帧
  • 远程帧:请求传输特定标识符的帧
  • 错误帧:由任何检测到错误的节点发送的帧
  • 过载帧:在数据帧或远程帧之间插入延迟的帧

数据帧是唯一用于实际数据传输的帧。CAN标准要求必须接受基本帧格式并可能接受扩展帧格式,但必须能承受扩展帧格式。

通常数据传输是在数据源节点(例如传感器)发出数据帧的情况下自主执行的。但是,目标节点也可以通过发送远程帧来从信息源请求数据。

数据帧和远程帧之间有两个区别。首先,RTR位在数据帧中作为显性位传输,其次在远程帧中没有数据段。DLC字段表示所请求的消息的数据长度,而不是发送的数据长度。

在数据帧和具有相同标识符的远程帧同时发送的情况下,由于数据帧标识符之后的RTR位是显性,它将赢得仲裁。

错误帧由两个不同的字段组成:

  • 第一段由不同站点提供的错误标志(6–12个显性位/隐性位)的叠加给出。
  • 接下来的第二段是错误帧定界符(ERROR DELIMITER,8个隐性位)。

过载帧包含两个位字段:过载标志(Overload Flag)和过载定界符(Overload Delimiter)。有两种过载条件可导致过载标志的传输:

  1. 接收器的内部条件,要求延迟下一个数据帧或远程帧。
  2. 中断检测到一个显性位。

由于情况1引起的过载帧只允许在预期中断的第一位时间开始,而由情况2引起的过载帧在检测到显性位后一位开始。

过载标志由六个显性位组成,其整体形式与主动错误标志的形式相对应。过载标志的形式破坏了中断区的固定形式。

因此,所有其他站点也会检测到过载情况,并在它们自己的部分开始传输过载标志。过载定界符由8个隐性位组成,与错误分隔符的形式相同。

OBD II 板载诊断汽车连接器

现在,大多数车辆都带有 ODB-II 连接器。如果您将汽车送去维修,就在仪表板下方的此接口,机械师可在此将连接器连接他们的计算机。

OBD-II有16个引脚,如下图所示。

作为黑客/攻击者,我们可以连接到该OBD-II连接器,并将CAN网络上的消息发送到各种设备。

下面开始模拟。

步骤1:安装依赖项

第一步是将必要的依赖项安装到您的Kali系统中。

kali > apt-get install libsdl2-dev libsdl2-image-dev -y

步骤2:安装 Can Utils

下一步是安装 CAN utils。这些是德国博世开发的一组 Linux 本地实用程序。如果您还没有安装过,您现在可以从Kali存储库下载并安装它们。

步骤3:下载ICSim

《汽车黑客手册》的作者和 opengarages.org 的创始人 Craig Smith 开发了一个小型CAN模拟器,我们将在下一步下载并安装它。您可以在 github.com 上克隆它

kali > git clone https://github.com/zombieCraig/ICSim

接下来导航到新创建的目录,ICSim。

kali > cd ICSim

在这里可以看到许多文件。此时需要执行 setup_vcan.sh 脚本。

这是一个简单的BASH脚本,它使用 modprobe 加载新的内核模块,can和vcan(有关内核模块的更多信息,请参见《 Linux Basics for Hackers》第8章),然后创建虚拟CAN接口 vcan0

现在执行此脚本。

kali > ./setup_vcan.sh

要启动仿真车辆的仪表板,只需要执行 icsim,后接虚拟CAN接口的名称,在这种情况下为 vcan0。

kali > ./icsim vcan0

仪表盘应显示在桌面上,如下所示。它包括一个车速表,转向信号灯和虚拟车辆轮廓,类似于现代车辆,为驾驶员指示打开和关闭的门。

要启动该车辆的控制器,请输入;

kali > ./controls vcan0

如下所示,这应该在您的桌面上打开控制器。

如果您将游戏控制器连接到Kali系统,那么现在可以使用它来“驾驶”您的模拟汽车了。如果不是,则可以使用以下键盘组合。

下面就可以使用 can-utils 或 SOCKET CAN 来查看和分析CAN流量了。

1、可显示,记录,生成和重放can流量的基本工具:

  • candump:显示、过滤、日志can数据到文件
  • canplayer:重放can日志文件
  • canSend:发送一个帧
  • cangen :生成(随机)can通信
  • cansniffer : 显示数据内容差异(仅11位CAN ID)

2、可以通过IP套接字访问

  • canlogserver:从远程/本地主机记录CAN帧
  • bcmserver:交互式BCM配置(远程+本地)
  • socketcand : 通过TCP / IP插槽使用RAW / BCM / ISO-TP套接字

3、CAN内核网关配置

  • cangw : 用于netlink配置的CAN网关 userpace 工具

4、CAN总线测量与测试

  • canbusload:计算并显示CAN总线负载
  • can-calc-bit-timing:内核中比特率计算中的用户空间版本
  • canfdtest:全双工测试程序(DUT和主机部分)

下面将重点关注:

1. cansniffer

2. candump

3. canplayer

4. cansend

步骤1:启动 Cansniffer

现在开始使用 cansniffer 嗅探CAN流量。使用此实用程序,您必须指定接口(在本例中为 vcan0),如果要查看着色输出,请使用 -c。

kali > cansniffer -c vcan0

输入此命令后,您应该开始看到终端中显示的CAN网络流量,类似于下面的屏幕截图。

当使用 -c 时,正在更改的值将变为红色,更方便识别。

步骤2:使用 cansniffer 过滤特定流量

与更广泛使用的嗅探器 Wireshark 类似,不必查看所有流量,而是对其进行过滤。

看一下 cansniffer 的帮助屏幕以了解如何做。

kali > cansniffer -h

然后,如果只想查看 ID = 161 的流量,则可以输入;

kali > cansniffer -c vcan0

一旦嗅探器启动,就可以键入:

-000000

+161

重要的是要注意,当您输入以上命令时,它们将不会出现在屏幕上。输入ID号后,嗅探器将开始过滤掉所有流量,只留下 ID = 161 的流量。

如您在上面的屏幕截图中所见,cansniffer 现在仅显示 ID = 161 的数据。

步骤3:使用 candump 捕获CAN流量

can-utils 中的 candump 可以捕获CAN流量并将其存储到文件中以供以后分析或重放。

为此,只需要使用 -l 记录日志,并使用 -c 为输出着色。

kali > candump -c -l vcan0

如果要记录并查看输出,可以使用 -s 0 (静默模式0);如果想将输出从十六进制转换为ASCII(人类可读),则可以添加-a(ASCII)。这将以着色模式启动 candump,以ASCII输出,将数据存储到日志文件中,同时将其发送到终端(stdout)。

kali > candump -c -l -s 0 -a vcan0

步骤4:使用 Canplayer

还有另一个关键的工具 canplayer。该工具使您能够 “播放” candump 的输出。因此您可以从CAN网络捕获数据,然后重播。只需要使用 -I,然后跟着 candump 中日志文件的名称即可。

kali >canplayer -I candump-xxxxxxxxxxx.log

步骤5:使用 Cansend 发送自定义帧

最后,有 cansend 工具。该工具可以重放特定的帧或发送定制的CAN帧。

输入:

kali > cansend vcan0 161#000005500108000d

现在按Enter键时,自定义的CAN帧将通过网络发送。这是将用来启动您希望在CAN网络上执行的操作的命令,例如;加速、打开门、启动刹车等等。

现在就可以开始使用这些工具对 ICS Simulator 上的CAN总线进行逆向工程并控制车辆了。

如果您对汽车黑客感兴趣,可以在这里下载这本书:https://www.patreon.com/posts/zhen-dui-qi-che-39412269

发表评论

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据