0x00 基本介绍
这两天参加了世界智能汽车挑战赛,比赛使用了visual threat的汽车仿真设备。不过这个文章题目起的有些夸张,准确的说应该是CAN总线安全学习入门
本想复盘一下比赛,但因为我们无法使用visual threat模拟器,遂从网上找到一个名为ICSim的模拟器来模拟CAN总线,安装起来极为友好
安装方法:
sudo apt-get install libsdl2-dev libsdl2-image-dev can-utils
启动方法:
./icsim vcan0
0x01 思路
比赛中的第一个题目要求对汽车协议(如车灯、门锁、后备箱锁、仪表等)完成有效数据提取并实现协议破解。此处我们使用ISCim生成流量模拟比赛过程
经过比赛之前的分析,我们猜测开门的报文可能分为以下3种情况:
1. 只有一条报文控制开门,按下开门按钮后,CAN总线上产生一条开门的报文。
2. 车门状态报文一直在定时发送,但每当按下一次开门按钮,报文中的数据(DATA)会发生一次变化。
3. 有多条时序报文控制车门开启(报文存在序列号检测或加密校验)
针对以上情况,我们提出了两种解决方案:
1. 对所有的CAN数据进行统计,检索出与开门次数相同次数的ID报文
2. 对所有的CAN数据进行统计,检索出仅数据(DATA)发生变化次数为开门次数的ID报文
(可能有点绕,但是还是比较靠谱的)
0x02 实践
依旧使用ICSim模拟,使用candump抓包CAN总线数据包
按下开门五次,接下来对该数据包进行分析,查找出ID出现五次的报文:
提取出该数据包后,对其进行重放测试是否有效:
完美,接下来我们尝试提取转向灯的数据,却发现无法检索到仅出现打转向灯次数的ID报文。
因此我们怀疑有可能是第二种情况,我们将使用脚本进一步分析数据(DATA)发生变化次数为打转向灯次数的报文。
我们打转向灯三次并抓包,使用脚本分析:
查看抓包中的0x188报文,可以发现在我们没有按下转向灯时,也是有报文在发送只是DATA段为0,在我们按下转向灯时,DATA段发生了变化如下所示。
对转向灯数据包重放:
第一次接触CAN总线还是缺乏相关的准备,比赛后面的题目还是很有意思的,例如远程篡改汽车车辆识别号码等等。比赛之前也搜集很多关于车联网的资料,如果有需要的小伙伴请在公众号后台回复<车联网>获取车联网资料。
最后,618我们也搞个小活动呀,师傅可以分享本文到朋友圈,然后扫描下方小程序码参与抽奖~