1. 前言
偶然间看到了一篇讲车联网安全的文章,看完后觉得好像还可以的样子,貌似不难做。想着来复现尝试一下新的东西。
2. Power
复现一个漏洞的前提就是先把环境搭好,搭建好一个测试环境后我们才能讲复现漏洞的事情。汽车模拟用到的工具和环境从未见过,需要简单学习一下。
2.1 汽车总线协议
首先,我们的一些前置知识是必不可少的。这里就要讲到我们的汽车总线协议了。随着汽车工业的发展,汽车各系统的控制逐步向自动化和智能化转变,传统的点对点的单一通信方式已经逐渐不能满足需求了,于是对应的解决方案和技术应运而生,也就是我们接下来讲的总线协议。
目前汽车上普遍采用的汽车总线有局部互联协议LIN和控制器局域网CAN,正在发展中的汽车总线技术还有告诉容错网络协议FlexRay、用于汽车多媒体和导航的MOST以及与计算机网络兼容的蓝牙、无线局域网等无线网络技术。四种技术各有应用范围,如下:
类别 | 总线名称 | 通信速度 | 应用范围 |
---|---|---|---|
A类 | LIN | 10-125K | 大灯、灯光、门锁、电动座椅等 |
B类 | CAN | 125K-1M | 汽车空调、电子指示、故障检测等 |
C类 | FlexRay | 1M-10M | 引擎控制、ABS、悬架控制、线控转向等 |
D类 | MOST | 10M以上 | 汽车导航系统、车载多媒体娱乐系统等 |
本文我们主要讲用到了CAN总线,因此另外三类不过多赘述,下面我们来看下如何通过Ubuntu来模拟车载CNA总线的收发包来进行重放攻击。
2.2 什么是CAN总线
CAN是控制器局域网络(Controller Area Network)的简称,是实现汽车所有或部分部件之间通信的中枢神经系统,用以研发和生产汽车电子产品著称的德国BOSCH
公司开发并最终成为国际标准(ISO 11898),是国际上应用最广泛的现场总线之一。在使用CAN作为车内通信系统之前,汽车制造商使用的是点对点布线系统,当汽车内部电子单元越来越多时,这种布线系统会显得特别庞大且维护成本太高,后来通过使用CAN代替来解决这个问题。
简单来说,CAN可以让汽车上的各个电子单元相互通信、共享数据,提出CAN的主要原因是它允许多个ECU(Electronic Control Unit, 电子控制单元)公用一根导线进行通信。在一辆现代汽车中存在多大70多个ECU,例如:发动机控制单元、安全气囊、变速箱、齿轮单元、防抱死制动系统(ABS)、信息娱乐系统、气候控制系统、车窗、车门等部件,为了让这些单元之间能够相互通信,点对点布线会显得特别庞大。试想一下,每一个组件都连接到其他全部组件,对于后期故障诊断和排除来说是相当糟糕的,但是有了CAN就可以用单线代替,每个元件之间的通信就简单了许多。
2.3 CAN总线帧
CAN运行在两条线路上:CAN高电平(CANHI)和CAN低电平(CANLO)。
CAN bus有四种帧类型
帧类型 | 用途 |
---|---|
数据帧(Data Frame) | 包含要传输的节点数据的帧 |
远程帧(Remote Frame) | 请求传输特定标识符的帧 |
错误帧(Error Frame) | 任何检测到错误的节点发送的帧 |
重载帧(Overload Frame) | 在数据或远程帧之间插入延迟的帧 |
- CAN有两种类型的消息(帧)格式:标准(基础)帧格式和扩展帧格式。标准(基础)帧有11位标识符,扩展帧格式有29位标识符。CAN标准帧格式和CAN扩展帧格式之间的区别是通过使用IDE位进行的,IDE位在11位帧的情况下以显性方式传输,而在29位帧的情况下以隐性方式进行传输。支持扩展帧格式消息的CAN控制器也能够以CAN基本帧格式发送和接收消息。
- 标准帧格式
- 仲裁ID(Arbitration ID):仲裁ID是一种广播消息,用来识别正视图通信的设备的ID,其实也代表发送消息的地址。任何的设备都可以发送多个仲裁ID。在总线中同时发送的消息,低仲裁ID的消息拥有优先权。
- 标识符扩展(IDE):标准帧格式该位始终为0。
- 数据长度码(DLC):表示数据的大小,番位是0字节到8字节。
- 数据(Data):总线传输数据本身。一个标准的数据帧可携带最大尺寸为8字节。有些系统中会强制要求8字节,不满8字节则填充为8字节。
- 扩展帧格式
扩展帧格式与标准帧格式类似,扩展帧格式可以连接在一起,形成更长的ID。扩展帧格式可包含标准帧格式,扩展帧格式的标识符扩展IDE被设置为1。扩展帧有一个18位的标识符,是标准的11位标识符的第二部分。
2.4 CAN总线特性
安全性:CAN是低级协议,不支持任何内在的安全功能。在标准的CAN中也没有加密,使得网络数据能被截取。在大多数应用中,应用程序需要部署自己的安全基址,例如认证传入命令或网络上某些设备的存在。若不执行适当的安全措施,其他人可能设法在总线上插入消息。尽管一些安全关键功能(如修改固件,编程键或控制防抱死制动)存在密码,但这些系统并未普遍实施,并且密钥对的数量有限。
通信基址:多主机,即每个节点都有接入总线的能力。
寻址机制:消息区别,不设节点的地址,通过消息的标志符来区别消息。
帧类型:数据帧、远程帧、错误帧、超载帧、帧间隔。
攻击方式:应用报文模糊攻击、DOS攻击测试、重放攻击。
由于CAN总线通信是广播的方式,所以数据是可以被监听和获取的。另外,CAN总线协议中ID代表报文优先级,协议中没有原始地址信息。也就是说任何人都可以伪造和发送虚假或恶意的报文。
3. 重放攻击
3.1 模拟环境
1 | Ubuntu20.04 |
3.2 环境搭建
安装can-utils
1 | sudo apt-get install can-utils |
安装ISCim
1 | # 安装依赖 |
安装Socketcand
1 | # 下载socketcand |
安装Kayak
1 | # 下载 |
tips:
1 | 安装Kayak的时候需要注意下,如果报错提示类似代理的问题,可以把物理机代理关了,然后再次安装。 |
启动模拟器
1 | # 设置vcan(虚拟CAN)接口 |
1 | # 打开仪表盘模拟器 |
控制器说明
功能 | 控制按钮 |
---|---|
转向 | 键盘左右 |
速度 | 键盘上下 |
开/关左前车门 | 右shift/左shift + A |
开/关右前车门 | 右shift/左shift + B |
开/关左后车门 | 右shift/左shift + X |
开/关右后车门 | 右shift/左shift + Y |
开启全部车门 | 左shift/右shift |
关闭全部车门 | 右shift/左shift |
3.3 重放测试
3.3.1 spllit
在进行重放前,我们首先需要抓包
1 | # 使用candump抓包 |
开启后,我们测试开启左前车门,然后停止抓包。这里因为CAN在不停通信,所以抓到的包非常大,有1w+
这里先不管它,待会我们在对它进行处理,先重放下数据包看看
1 | canplayer -I candump-2023-03-16_135058.log |
重放数据后,发现车门开启。说明我们抓到的数据包是对的。
接下来是我们的重点,如何找到到底是哪条数据起了作用。也就是我们开启车门到底用的是哪一条数据指令。
这里因为数据太多,我们去重看下
1 | # coding:utf-8 |
脚本运行完之后,大家可以看到。数据从1.5w
变成了450,数量大大减少。这样一来,我们就可以用二分法很快的筛选出来我们的指令了。
1 | split -l 300 candump-2023-03-16_135058_new.log |
这里是将我们的log文件分割掉,300行作为一个文件。
分别发包测试,得到数据在xab里,继续二分法,直到得出我们的最终数据
1 | (1678945862.365839) vcan0 19B#00000E000000 |
由此得出了我们开启左前车门的数据,其中19B
是设备标识符。
同时还可以使用cansend vcan0 19B#00000E000000
发送验证数据
3.3.2 statistics
当然,除了二分法我们还有许多别的方法可以筛选数据。比如对于这种只有在进行操作时才会产生的动作,可以通过手动操作特定次数,然后筛选。比如这里,进行五次开车门的操作,然后抓包筛选。
1 | import re |
3.3.3 Kayak
按理说还可以通过socketcand
和kayak
一块抓取vcan的流量,同时筛选的,但是我这总是报错
1 | sudo socketcand -i vcan0 |
哪怕是加-l
参数指定网口啥的也还是没办法抓到数据包,不过放法还是给大家放下吧(也是一个师傅写的)
运行socketcand -i vcan0,socketcand可以挂接多个CAN设备,接口名使用逗号分割即可。
然后切换到Kayak的bin目录下,运行./kayak。
单击File菜单->new project(或者ctrl+n快捷键),输入project名字。
展开右下角connections窗口中的auto discovery,将下面的内容拖到新建的project中并输入一个名字。
右键上一步中创建的bus,选择OPEN Raw View。
单击工具栏中的play 按钮。开始捕获CAN总线流量。点击colorize可以对有变化的数据以不同颜色。同时还可以暂停和停止监听流量操作。
3.4 数据dump
开/关门:
1 | 开启全部车门:19B#000000000000 |
转向:
1 | 左转向:188#01000000 |
速度:
1 | 提速:244#000000xxxx |
关于速度这里,其实还是用kayak更方便,在提速时可以更直观的看到哪个ID的值在不断上升。同时,数值后几位代表了我们的车速值,可自定义。
4. 总结
想了半天不知道该说点啥,那就这样吧。东西基本都是东拼西凑,一点一点复现过来的,凑合着看吧,能对大家有帮助的话就再好不过了。
5. 参考链接
1 | 车联网安全入门之从CAN模拟环境搭建到重放攻击 |
发布时间: 2023-03-21
最后更新: 2023-12-12
本文标题: 车联网入门之CAN总线
本文链接: https://foxcookie.github.io/2023/03/21/车联网入门/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!