本篇文章将主要为大家介绍车联网中重要的组成部分之一的CAN总线的协议结构,以及在没有硬件支撑的情况下如何对其进行仿真状态下的流量嗅探与重放方法的学习与研究。
而其中标准的数据帧格式主要为四个部分,即:
1. 起始帧(Start of Frame-SOF):1bit,显性信号,表示数据帧的开始
2. 仲裁段(Arbitration Field):包括两部分:标识符位(Identifier field-ID)和远程发送请求位
3. 控制段(Control Field):6bits,拓展标识位(1bit),保留位(1bit),数据长度编码位(4bit)
4. 数据段(Data Field):发送数据的内容,最多8个字节
5. 循环校验位(CRC Field):循环校验序列和界定符
6. 确认段(ACK Field):确认位和界定符
7. 帧结束(End of Fram):7bit,隐性信号,表示帧结束
首先需要使用ICSim工具来模拟汽车仪表盘的使用。
> sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils
> sudo apt-get install aptitude
> git clone https://github.com/zombieCraig/ICSim.git
> cd ICSim
> make
> ./setup_vcan.sh
> ./icsim vcan0 #启动仪表盘模拟器
> ./controls vcan0 #启动控制器
操作方法如下:
> 项目地址:https://github.com/linux-can/can-utils
通过 can-utils工具进行对can流量的监听与重放,可以使用源码安装或直接使用apt-get进行安装。
显示、过滤和记录CAN原始数据到文件(未解码的数据)。
通过candump对指定网络接口进行流量的监听,将会保存日志文件到当前目录中,在通过ctrl+c停止后可进行查看相应的流量数据。
保存的格式为:(时间戳) 网络接口 ID#数据
> candump -l vcan0
> cat candump-2022-12-28_105004.log|more
根据仲裁ID进行分组显示数据,其次可以通过交互进行内容过滤。
> cansniffer -c vcan0
输入-000000关闭所有数据包的显示,再输入+ID显示指定ID的数据包,如:
-000000
+234
[return]
canplayer可以用来播放can帧,用于重放candump记录的流量内容。
> canplayer -I <*.log>
cansend用于将CAN帧发送到一个特定的CAN接口。
> cansend vcan0 <ID>#<DATA>
> 项目地址:https://github.com/collin80/SavvyCAN
SavvyCAN是一个基于多个QT平台的C++程序,主要用于CAN数据的逆向分析和捕获。作为同样是免费的开源工具来说,相对于前面的can-utils 命令行的操作方式,SavvyCAN提供了更适合初学者使用的GUI图形化界面,可以用于更轻松的浏览、过滤ID数据包等。
直接下载编译好的appimage,便可以直接运行程序。
> wget https://github.com/collin80/SavvyCAN/releases/download/V208/SavvyCAN-x86_64.AppImage
> chmod 755 SavvyCAN-305dafd-x86_64.AppImage
> ./SavvyCAN-305dafd-x86_64.AppImage
但是由于QTSerialBus默认被禁用导致无法与ICSim配合使用,因此需要下载QT5环境手动编译安装SavvyCAN。
> wget https://download.qt.io/archive/qt/5.14/5.14.2/qt-opensource-linux-x64-5.14.2.run
> chmod a+x ./qt-opensource-linux-x64-5.14.2.run
> ./qt-opensource-linux-x64-5.14.2.run
随后注册账户进行登录,并勾选上qt5进行安装。
在对SavvyCAN工具进行编译。
> sudo apt install qtdeclarative5-dev qttools5-dev g++
> git clone https://github.com/collin80/SavvyCAN
> cd SavvyCAN/
> ~/Qt5.14.2/5.14.2/gcc_64/bin/qmake CONFIG+=debug
> make
> ./SavvyCAN
流量监听
在 Connection
->Open Connection Window
->Add New Device Connection
中选择 QT SerialBus Devices
,将 SerialBus Devices 选择为 socketcan
,将 Port 选择为虚拟端口 vcan0
:
随后就可以在Savvy CAN中看到捕捉到的数据。
流量重放
在Savvy CAN中的 Send Frames
里选择 Playback
,便可以从文件加载数据或直接从捕获的数据加载数据等功能。
对于CAN协议上的流量监听与重放的方法本篇以can-utils与SavvyCAN两种较为常用的工具为例进行讲解,到这里就算是结束了,实际上对于CAN协议进行流量嗅探的方法远不止于此,还可以使用如wireshark、Kayak等工具方便我们研究,在后续的文章中将会进行更深入的分析学习。
原文始发于微信公众号(山石网科安全技术研究院):CAN协议分析之流量监听与重放