前言
车联网安全最近几年成为了各大汽车厂商以及安全厂商的关注热点,但是作为一个穷苦的无车一族想要入门车联网安全该怎么办?那当然是靠模拟器了
![](https://img-blog.csdnimg.cn/img_convert/1fcc3f10f1ee9f8639d5dd59a3fff869.jpeg)
贫穷幽默搞笑配图- 搜狗图片搜索
本文将介绍如何通过Ubuntu模拟车载CAN总线的收发包来进行操作学习。话不多说,芜湖,起飞
![](https://img-blog.csdnimg.cn/img_convert/6d4b0fabb2e6a5c930e323828119eebc.jpeg)
CAN总线介绍
什么是CAN总线
CAN总线又称为控制器局域网是Controller Area Network的缩写。CAn总线是一种用于实时应用的串行通讯协议总线,它可以使用双绞线来传输信号,是世界上应用最广泛的现场总线之一,在1991年呗大规模应用于汽车,从那儿以后,CAN总线成为汽车的标配。
CAN协议用于汽车中各种不同元件之间的通信,以此取代昂贵笨重的配电线束。该协议的健壮性使其用途延伸到其他自动化和工业应用。简单来说就是用来控制车辆功能的通信协议,比如车门解锁、转向灯、刹车、油门等,
CAN总线特性
安全性:CAN是低级协议,不支持任何内在的安全功能。在标准的CAN中也没有加密,使得网络数据能被截取。在大多数应用中,应用程序需要部署自己的安全机制,例如认证传入命令或网络上某些设备的存在。若不执行适当的安全措施,其他人可能设法在总线上插入消息。尽管一些安全关键功能(如修改固件,编程键或控制防抱死制动)存在密码,但这些系统并未普遍实施,并且密钥对的数量有限。
通信机制:多主机,即每个节点都有接入总线的能力
寻址机制:消息区别,不设节点的地址,通过消息的标志符来区别消息。
帧类型:数据帧、远程帧、错误帧、超载帧、帧间隔
攻击方式:应用报文模糊攻击、DOS攻击测试、重放攻击
由于CAN总线上的数据包没有进行过任何的加密处理,因此这些数据包是能够被截取窃听。由于车载网络使用CAN协议进行通信,所以我们可以联想到车联功能也是通过CAN网络进行数据发送和交换。
攻击方式
CAN总线攻击方式包括应用报文模糊测试、DOS攻击测试、重放攻击等。
攻击实战
在接下来的文章里我们将通过模拟软件模拟真实的汽车,并对其进行重放攻击
实验环境
• Ubuntu16.04
• ICSim(仪表盘模拟器)
• Socketcand(CAN网络)
• Kayak(一款基于SocketCAN的CAN总线分析工具)
安装ICSim
安装依赖
# 安装依赖sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf -y# 下载ICSimgit clone https://github.com/zombieCraig/ICSim.git# 编译安装cd ICSim/sudo make
![](https://img-blog.csdnimg.cn/img_convert/4174cf929f3d74c3ec0aa34556a4d047.jpeg)
image-20230112135608441
安装socketcand
# 下载socketcandgit clone https://github.com/linux-can/socketcand.gitcd socketcand# 获取缺少的文件wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in# 编译安装autoconf./configuremake cleanmakesudo make install
![](https://img-blog.csdnimg.cn/img_convert/b96a400b89f6e7f3daf075fa9f81129e.jpeg)
image-20230112142334456
安装Kayak
# 下载git clone https://github.com/dschanoeh/Kayak.git# 安装jdksudo apt-get install openjdk-8-jdk# 安装cd Kayakmvn clean package
启动模拟器
# 设置vcan(虚拟CAN)接口sudo modprobe cansudo modprobe vcansudo ip link add dev vcan0 type vcansudo ip link set up vcan0
![](https://img-blog.csdnimg.cn/img_convert/cc4e15fcf96dbc6950976723ac3fc3cd.jpeg)
image-20230112144952428
# 打开仪表盘模拟器./icsim vcan0# 打开仪表盘控制器./controls vcan0
![](https://img-blog.csdnimg.cn/img_convert/b55dcb30127fc575c881b1a435ddf547.jpeg)
image-20230112145302226
![](https://img-blog.csdnimg.cn/img_convert/b9c7d701aeb18ee2aaa0c55b8b56164a.jpeg)
image-20230112145337128
仪表盘控制器,操作说明
功能 | 控制按钮 |
转向 | 键盘左右 |
速度 | 键盘上下 |
开/关左前车门 | 右shift/左shit+A |
开/关右前车门 | 右shift/左shit+B |
开/关左后车门 | 右shift/左shit+X |
开/关右后车门 | 右shift/左shit+Y |
开启全部车门 | 左shift+右shift |
关闭全部车门 | 右shift+左shift |
抓取CAN数据包
# 使用candump抓包candump vcan0 -l
![](https://img-blog.csdnimg.cn/img_convert/6b172287916995a68b80b9b10d375161.jpeg)
image-20230112151810007
由于CAN在不停进行通信,故抓取到的包将会非常大
![](https://img-blog.csdnimg.cn/img_convert/837e0e2a320744e1b5059fb64990245d.jpeg)
image-20230112151909526
尝试重放刚才抓取到的数据包
canplayer -I candump-2023-01-12_151749.log
![](https://img-blog.csdnimg.cn/img_convert/4ed35d52eb9892d1a66540233fd9cb52.jpeg)
image-20230112152501625
可以看到左前侧车门被成功打开
通过二分法我们找到了左前侧开门的数据包,如图。
![](https://img-blog.csdnimg.cn/img_convert/bccab314de50bad33dd8ea7ca672219d.jpeg)
image-20230112155258728
(1673507873.514241) vcan0 19B#00000E000000
其中的19B是设备标识符,在数据包中查找19B
grep 19B candump-2023-01-12_151749.log
![](https://img-blog.csdnimg.cn/img_convert/3eca4cee1f86c6274faede4c5a937a01.jpeg)
image-20230112155429755
通过分析和尝试我们可知
19B#00000E000000为开启左前侧车门,19B#00000F000000为关闭所有车门
将其分解为二进制可得出16种可能的开关门组合
二进制 | 十六进制 |
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | a |
1011 | b |
1100 | c |
1101 | d |
1110 | e |
1111 | f |
尝试字符控制的不同车门
字符 | 车门 |
8 | 右后侧车门 |
4 | 左后侧车门 |
2 | 右前侧车门 |
1 | 左前侧车门 |
假设1是关门,0是开门
右后侧车门 左后侧车门 右前侧车门 左前侧车门8 4 2 11 0 0 0
此时的值为8,结果为
![](https://img-blog.csdnimg.cn/img_convert/d0efce3377757655259e32e7860d71ae.jpeg)
image-20230112162436590
至此我们就可以操控每个门的开关了。
按照同样的思路我们将转向的数据包找出来
左转向:188#01000000
右转向:188#02000000