本文是《零成本入门车联网安全研究》系列第二篇,第一篇简单介绍了下车内网络的架构,让大家对车内ECU组网的方式有了最基本的了解。本文则在车内网络的基础上,部署了真实的网络业务——基于以太网的车辆诊断服务,该服务基于doip(Diagnose On IP)协议栈实现通用诊断协议UDS。本文相比于第一篇文章更具可操作性与可玩性,可操作性的点在于大家根据文章介绍的步骤,可以搭建好自己的实验环境;可玩的点在于,本实验会在开源项目的基础上,加入可实际利用的协议漏洞,通过漏洞利用能够模拟远程控制车辆。此外,本文在描述实验步骤的同时,还会穿插介绍一些相关基础,包括:
- CAN网络基础
- UDS协议基础
- DoIP协议基础
- 远程诊断的实现原理
等等。为了帮助大家更好地开始,有必要先介绍下实验环境。本次实验的系统使用ubuntu20.04模拟车辆边缘节点,节点上运行DoIPServer,win10模拟DoIP诊断仪,诊断仪包含DoIPClient,其中win10与ubuntu组成可相互通信的局域网,即DoIP诊断仪可以通过以太网连接DoIPServer。车内CAN网络通过linux vcan实现,边缘节点、ICSim及车内UDS节点均连接到CAN网络,车内UDS节点上运行UDSServer,该Server能实现基于CAN网络的UDS诊断。整体网络架构如下图所示:
基于如上部署,DoIP诊断仪能够通过以太网连接边缘节点,通过发送诊断协议包的方式,直接对边缘节点执行远程诊断。另外,因为车内UDS节点也实现了UDS协议,因此DoIP诊断仪可以发送诊断协议包至边缘节点,由边缘节点执行DoIP转DoCAN,将基于DoIP的诊断协议包格式转换为基于CAN的诊断包格式,发送至车内UDS节点。
另外,由于ICSim未实现UDS协议,因此DoIP诊断仪的数据包理论上是不会被转发至ICSim,但我们在DoIPServer中插入了一个漏洞,将不合法的DoIP数据包转发至CAN网络,这样通过构造,便可以使用DoIP诊断仪远程发送控制报文至ICSim,实现远程车控。
关于实验环境就介绍这么多,接下来上手配置。首先在ubuntu上安装虚拟CAN网络的工具:
# 安装python can
pip3 install python-can
# 按照can-utils
sudo apt-get install can-utils
# 安装can驱动,设置can网络
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0
设置完CAN网络后,通过ifconfig查看状态: