在本系列的第一篇文章中,我们讨论了什么是CAN总线,并简单介绍了CAN流量的基础知识,以及如何使用ICSim创建虚拟的汽车安全测试系统。在本文中,我们将为读者详细介绍如何通过CAN Traffic来嗅探汽车数据。
CAN报文长啥样?
上图展示的是我们记录下来的CAN报文。如果按列看的话,第一列是接口,第二列是仲裁ID,第三列是CAN报文的大小,它不能大于8(如果你考察一下CAN帧的话,就明白为什么不能大于8了),第四列是CAN数据本身。
CAN报文的含义
在这个例子中,我们将看到一个8字节的帧。该报文以ID 0x111发送。一旦仪表盘看到这个消息,它会首先判断它是否是为仪表盘准备的。如果是,那么它读取的信息将是0x0BB8,转化为十进制值为3000。现在,仪表盘将转速表上的指针移到3000的位置。
一旦我们理解了CAN报文,我们就可以进一步通过ODB-II向CAN总线注入修改过的数据包,以篡改速度表或其他东西。
在我们开始展示ICSim之前,让我们看看其他工具是如何工作的。为此,我们首先要配置一下虚拟接口。
设置虚拟CAN接口
sudo modprobe can
上述命令将为CAN加载内核单元。此外,我们还需要为虚拟机加载内核单元。
sudo modprobe vcan
我们可以通过下面的命令,来验证是否加载了所需的内核单元:
lsmod | grep can
该命令将显示是否加载了CAN和VCAN。
现在,我们来配置虚拟接口:
sudo ip link add dev vcan0 type vcan sudo ip link setup vcan0
我们可以通过以下命令,来验证虚拟CAN接口是否已经配置成功:
ifconfig vcan0
一旦配置好了虚拟CAN接口,就可以通过该接口发送/接收CAN数据包了。现在,让我们使用一个名为CANEN的can-utils实用程序来创建虚拟CAN数据包。
cangen
实际上,cangen可以为教育用途而创建各种CAN帧。 要使用cangen,你必须指定用于创建CAN帧的接口。
cangen vcan0
Vcan0是我们之前创建的虚拟CAN接口。
既然已经创建了CAN帧,接下来,我们不妨看看这个帧到底长啥样。实际上,有很多工具可以用来查看帧,其中之一就是Wireshark。为此,我们可以在创建完CAN帧后,启动Wireshark。
我们有时会看到许多可用的接口,这取决于系统中有多少个接口;其中,vcan0是用来创建CAN帧的接口。
一旦点击了数据包对应的接口,就会显示CAN帧的内容:
此外,我们还可以查看关于CAN帧的详细信息。
在vcan0里面还有其他的实用工具,比如cansniffer和candump,它们的作用和Wireshark差不多。大家可以根据自己的喜好选择相应的工具。
candump
要使用candump来处理(丢弃或记录)帧,可以使用如下所示的命令:
candump vcan0
下面是该工具所显示的结果:
在底部的终端,用于创建CAN数据包;而顶部的终端则用于操作candump。对于各列,简单介绍如下:第一列是CAN接口,第二列是ID,第三列是CAN报文的大小,第四列是报文本身。
此外,candump还可以用来记录帧。在进行重放攻击时,需要先记录相应的帧,然后,用canplayer这样的小工具来重放这些帧。为了记录CAN帧,可以添加命令选项-l。
candump -l vcan0
当记录CAN帧时,将创建一个前缀为candump的文件,后跟创建日期。
如果想查看文件的内容,可以在Linux上使用cat命令:
我们使用candump记录的数据可以使用canplayer之类的实用程序进行播放。
canplayer
顾名思义,canplayer可以用来播放CAN帧;当您需要进行重放攻击时,该工具就会派上用场了。首先,需要记录CAN帧,然后,使用canplayer播放这些CAN帧。
假设我们想要篡改转速表,但是,我们不知道转速表读数对应于哪个ID,也不知道对应的CAN报文中含有哪些内容。理想情况下,您应该首先使用带有标志-l的candump命令来丢弃和记录帧,然后使用canplayer播放记录的帧。
使用输入文件时,需要为Canplayer命令提供-i选项:
canplayer -I canfile.log
除此之外,canplayer还有其他几个非常有用的选项,大家可以通过man canplayer命令来学习它们。
cansniffer
使用CAN嗅探器来查看CAN数据的变化。这对于查看特定字节的变化是非常有用的。Cansniffer有一个-c选项,能够通过颜色来展示字节的变化。这个工具的工作方式为:比较字节当前值和之前的值,如果存在差异,就用字节的颜色变化来加以表示。当你想知道当对汽车进行的操作是否导致CAN数据发生变化时,这个功能会非常有用。
cansniffer -c vcan0
我发现cansniffer非常有用,因为它还可以进行ID过滤。因此,如果只想查看来自某个特定ID的帧,比如说0x011,你可以根据ID进行过滤。
在开始嗅探时,我们可以先按-,后跟00000000,这将清除所有的帧;然后,使用+添加要过滤的ID,按回车。这样你就可以过滤相应ID的帧了。
cansend
Cansend用于将CAN帧发送到一个特定的CAN接口。
cansend interface frame
我们将在ICSim中用到所有这些工具。
启动ICSim
我们已经在第一篇文章中介绍了如何安装ICSim。现在,让我们启动ICSim并嗅探CAN帧。
./icsim vcan0 ./controls vcan0
如果您已经严格执行了上一篇文章中介绍的步骤,现在就应该能够看到上面的输出内容。你可能还注意到,速度表指针会来回抖动,这是由于噪音造成的,是很正常的现象。
嗅探由ICSim创建的CAN帧
我们将使用can-utils提供的cansniffer工具来捕获数据包。下面,我们可以打开一个新的终端,用以下命令来启动cansniffer:
cansniffer -c vcan0
命令选项-c的作用,是用颜色指示帧字节的变化情况。
你可以看到,CAN帧的变化非常快,这是因为有大量数据高速传输。在一辆真正的汽车中,这是非常常见的。为此,我们可以使用ID进行过滤。如果你想只考察ID为40C的帧,你可以先按-,然后按00000000,再按回车键,以从cansniffer中删除所有的ID对应的数据;然后,按+,然后按要过滤的ID,再按回车键即可。
这里,我用上面提到方法过滤了ID为40c的帧。我们可以试着按向上的方向键来加油门,然后观察CAN帧的变化速度。在这里,变化是通过颜色来指示的。大家可以多尝试一下。
重放攻击
理解如此庞大的数据将是相当困难的。另外,从这个大量的数据中找到所需帧的ID也是不可能的。
因此,你需要捕获数据包,然后执行一些操作,比如打开闪光灯或在连接后踩油门,然后分割数据包,进行重放攻击,看看是否有效。
现在,我们要用ICSim执行重放攻击,前提是已经启动了ICSim,并且能够用cansniffer查看帧。现在,我们将使用带有-l选项的candump命令来记录和保存帧,与此同时,我们将通过按左、右方向键来加油门,以激活闪光灯。
candump -l vcan0
现在,停止candump,我们将看到一个candump-XXXXX.log文件被创建。
重放CAN帧
为了重放这些数据包,我们将使用canplayer工具。由于我们要使用一个文件作为canplayer工具的输入,所以,我们需要启用-I选项。
canplayer -I candump -2019XXXXXX.log
你可以看到,重放攻击已经发生了,闪光灯以及速度表应该像我们之前那样工作。
数据包的分析
在真实的汽车中,CAN总线可能会复杂得多,而且CAN帧的出现速度也会快得多,所以定位ID可能相当困难。因此,为了方便识别ID,你可以按照下面的步骤进行操作:
分割CAN帧并执行重放攻击
如果你想把CAN帧分成两份,并分别进行重放攻击,最好的方法是使用candump捕获CAN帧,并使用工具wc来计算CAN帧的数量,然后使用split把它平均分成两份。
现在,你可以使用canplayer来单独重放这些CAN帧。
好了,本系列的第二篇文章到此就要结束了。我们已经表明,一旦我们能够进入车辆并执行一些动作,如加油门、打开转向灯和打开车门,我们就可以进行进一步的安全测试。因此,通过一些程序和低成本的组件,我们能够获得一辆车的全部访问权限。
原文地址:https://hakin9.org/car-hacking-the-ultimate-guide-part-ii/