欢迎回来!
如果您还没有读过前面的部分,在这里看到:
汽车黑客是黑客学科的最前沿。
对汽车的黑客入侵可能会对社会产生巨大影响。想象一下,在网络战中,反对派指挥官雇用黑客操纵敌方坦克、吉普车和其他车辆;或者更平凡一些,想象一下一个黑客可以打开、启动和控制您的车子 ……
本文将建立一个仿真环境,您可以在其中使用一些知识来分析和破解汽车。首先需要介绍一些基本知识。
基础知识
在深入研究汽车黑客之前,需要首先了解下基础知识。汽车电子设备使用几种不同的协议在多个微控制器、传感器、仪表、执行器等东西之间进行通信。这些协议中使用最广泛的是控制器局域网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引起的过载帧在检测到显性位后一位开始。
过载标志由六个显性位组成,其整体形式与主动错误标志的形式相对应。过载标志的形式破坏了中断区的固定形式。
因此,所有其他站点也会检测到过载情况,并在它们自己的部分开始传输过载标志。过载定界符由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