文章目录
车联网安全入门——CAN总线模糊测试
🚀🚀最近对于车联网安全非常有兴趣,但是不知道怎么入门,无意间发现了ICSim,可以用来简单模拟一下汽车,学习了一段时间后决定写一下笔记,怕自己学完就忘记了(仅供学习参考)。
介绍
🚀🚀ICSim 是一个用于模拟车辆仪表集群的工具,专门为 SocketCAN 设计。SocketCAN 是 Linux 内核中的一个模块,用于支持控制器局域网(CAN)接口。
主要特点
- 仪表集群模拟:ICSim 可以模拟车辆仪表盘,包括速度表、转速表、燃油表等。这对于开发和测试基于 CAN 总线的汽车电子系统非常有用。
- 与 SocketCAN 集成:ICSim 与 Linux 的 SocketCAN 接口集成,允许用户通过标准的 SocketCAN 工具与模拟器进行通信和调试。
- 教育和开发:它是汽车网络和协议学习的一个极佳工具,可以帮助工程师、研究人员和学生理解 CAN 总线的工作原理和应用。
使用场景
- 软件开发:在开发车辆电子控制单元(ECU)时,可以使用 ICSim 进行初步测试,而无需实际的车辆硬件。
- 教学和培训:提供一个虚拟的车辆环境,便于教学 CAN 总线通信。
- 调试和验证:与实际车辆硬件的连接前,先在模拟环境中验证通信和功能。
🚀🚀项目地址如下所示:
zombieCraig/ICSim: Instrument Cluster Simulator (github.com)
🚀🚀安装教程如下:
车联网安全入门——ICSim模拟器使用-CSDN博客
模糊测试(Fuzz Testing)
🚀🚀模糊测试(Fuzz Testing)是一种用于发现软件漏洞和缺陷的自动化测试技术。其核心思想是通过向系统输入大量随机或半随机的数据,观察系统的响应,从而发现潜在的错误和安全漏洞。模糊测试常用于安全性测试和稳定性测试。
CAN 总线模糊测试(CAN Packet Fuzzing)
🚀🚀CAN Packet Fuzzing 是将模糊测试应用于控制器局域网(CAN)总线的一种技术。CAN 总线是现代汽车中用于电子控制单元(ECU)之间通信的关键协议。模糊测试在这个上下文中的主要目标是通过发送异常或无效的 CAN 数据帧,来发现车辆网络协议栈中的漏洞和缺陷。
主要步骤
- 定义测试范围:确定要测试的 CAN 网络的节点和消息类型。
- 生成模糊数据:使用随机或半随机的方法生成 CAN 数据帧。这些数据帧可以是完全随机的,也可以在现有合法数据的基础上进行变异。
- 发送模糊数据:将生成的模糊数据帧发送到 CAN 总线上,模拟正常通信环境。
- 监控系统行为:观察系统对这些模糊数据的响应,记录任何异常行为或系统崩溃。
- 分析和报告:分析捕获的异常行为,找出潜在的漏洞,并生成测试报告。
工具和软件
- ICSim:虽然主要是用于模拟和测试,但也可以配置为进行初步的 CAN 模糊测试。
- SavvyCAN:用于捕获和分析 CAN 数据,结合其他模糊测试工具一起使用。
- 其他模糊测试工具:例如 Can-Hax,CANard、CANalyzat0r 以及定制的脚本和程序,可以生成和发送模糊数据帧。
主要目标
- 安全性测试:发现并修复可能被恶意利用的漏洞。
- 稳定性测试:确保系统在异常输入情况下的稳定性,避免意外崩溃或错误。
- 协议验证:验证 CAN 协议实现的健壮性,确保其能正确处理所有类型的数据帧。
Can-Hax
🚀🚀这个工具是我刷视频的时候刷到的,是一个油管博主的开源工具,个人感觉还比较好用,就来介绍一下,当然了SavvyCAN是真的无敌!!!!!!
安装
🚀🚀我们直接从GitHub克隆下来就好了,这点比较的简单:
git clone https://github.com/rybolov/Can-Hax.git
cd Can-Hax
使用
🚀🚀Can-Hax是使用can-utils的指纹和模糊控制器区域网络(CAN)数据包/帧的实用程序,可用于大多数Linux。
🚀🚀CAN有效载荷模板有以下几种:0=在使用中未观察到,H=观察到的十六进制值,N=观察到的十进制值,所以它看起来像00NHHHHH。
获得指纹
🚀🚀我们使用如下命令来获得我们的指纹,xxxxxxx.log是我们使用candump存储下来的日志文件,xxxxxx.json是我们的指纹文件。
python ./can-hax.py --fingerprint--input xxxxxxx.log -d"ICSIM Vehicle Simulator"-o xxxxxx.json
🚀🚀比如我使用如下命令,便得到了以下输出:
python ./can-hax.py --fingerprint--input candump-2024-06-01_104423.log -d"ICSIM Vehicle Simulator"-o can_1_fingerprint.json
🚀🚀输出:
/ __ \||||| / \/ __ _ _ __ ______||_|| __ ___ __
|| / _`| '_ \______| _ |/ _`\\/ /
|\__/\(_|||||||||(_||><\____/\__,_|_||_|\_||_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.
Testing if candump-2024-06-01_104423.log is a file.
candump-2024-06-01_104423.log is most definitely a file.
Found cansend. We can use this to send CAN packets.
First 3 lines readin as:
(1717253063.833375) vcan0 161#000005500108001C(1717253063.833432) vcan0 191#010010A141000B(1717253063.833439) vcan0 164#0000C01AA8000004
Date of last log line: 2024.06.01
Found 37 CAN IDs.
{"date":"2024.06.01",
"description":"ICSIM Vehicle Simulator",
"fingerprints":{"039":"00NH",
"095":"N0000NHN000000NN",
"133":"00000000HN",
"136":"000N0000000000NH",
"13A":"00000000000000NH",
"13F":"0000000N000000NH",
"143":"NHNH00HH",
"158":"00000000000000NH",
"161":"00000NN00N0N00NH",
"164":"0000H0NHHN0000NN",
"166":"H0NN00NN",
"17C":"00000000N00000NN",
"183":"000000NH0000N0NH",
"188":"00000000",
"18E":"0000NH",
"191":"0N00N0HNNN00NH",
"19B":"00000H000000",
"1A4":"0000000N000000NH",
"1AA":"NHHH00000000NNNH",
"1B0":"000H0000000NNN",
"1CF":"N00N000000NH",
"1D0":"000000000000000H",
"1DC":"0N0000NH",
"21E":"0NHNNNNNNN0NNH",
"244":"0000000NHH",
"294":"0N0H000NHHNH00NH",
"305":"N0NN",
"309":"00000000000000HN",
"320":"0000NN",
"324":"NNNN000000000HNH",
"333":"000000000000NH",
"37C":"HH00HH000NNH00NH",
"405":"00000N00000000NH",
"40C":"0NNHNNNHNNNNNNNH",
"428":"0N0N0000NNNHNH",
"454":"NNHHNN",
"5A1":"NN0000000000NNNH"},
"version":"2"}
Done. Total realtime was 0:00:01.
🚀🚀我们来简单介绍一下里面的数据大概是什么意思:
"133":"00000000HN",
🚀🚀133代表的是can总线ID号,后面0代表的是从来没有变化,一直是0;H表示的是十六进制,也就是说,这一位出现过十六进制数;N代表十进制,也就是这一位没有出现过十六进制的数。
模糊测试
🚀🚀接下来我们开始进行模糊测试了,这个就是全部模糊(可能需要很长时间,可以缩短时延),会一个一个进行测试。
python ./can-hax.py --fuzz--input xxxxxx.json --can vcan0
_____ _ _
/ __ \||||| / \/ __ _ _ __ ______||_|| __ ___ __
|| / _`| '_ \______| _ |/ _`\\/ /
|\__/\(_|||||||||(_||><\____/\__,_|_||_|\_||_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.
Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.
Found cansend. We can use this to send CAN packets.
CANID 161 00000NN00N0N00NH complexity is 7
Sending CAN frame: 161#0000000000000000
Sending CAN frame: 161#0000000000000001
–input,–can可以使用-i和-c简化。
🚀🚀除了全部测试之外,我们还可以测试特定的CAN ID,我们可以指定–canid。
python ./can-hax.py --fuzz--canid 19B --input can_1_fingerprint.json --can vcan0
_____ _ _
/ __ \ | | | |
| / \/ __ _ _ __ ______| |_| | __ ___ __
| | / _` | '_ \______| _ |/ _` \ \/ /
| \__/\ (_| | | | | | | | | (_| |> <
\____/\__,_|_| |_| \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.
Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.
Found cansend. We can use this to send CAN packets.
CANID 19B 00000H000000 complexity is 2
Sending CAN frame: 19B#000000000000
-timing 1,表示的是时延,然后时延为一秒,使用命令如下所示
python ./can-hax.py --fuzz --canid 19B --input can_1_fingerprint.json --can vcan0 --timing 1
🚀🚀我们还可以使用–Quick或–Superquick快速指定一组简化的可能值。
python ./can-hax.py --fuzz --canid 19B --input can_1_fingerprint.json --can vcan0 --timing 1 --quick
_____ _ _
/ __ \ | | | |
| / \/ __ _ _ __ ______| |_| | __ ___ __
| | / _` | '_ \______| _ |/ _` \ \/ /
| \__/\ (_| | | | | | | | | (_| |> <
\____/\__,_|_| |_| \_| |_/\__,_/_/\_\
Can-Hax: Fingerprint and fuzz CAN traffic.
Testing if can_1_fingerprint.json is a file.
can_1_fingerprint.json is most definitely a file.
Found cansend. We can use this to send CAN packets.
CANID 19B 00000H000000 complexity is 2
Sending CAN frame: 19B#000000000000
Sending CAN frame: 19B#000001000000
Sending CAN frame: 19B#000009000000
Sending CAN frame: 19B#00000A000000
Sending CAN frame: 19B#00000B000000
Sending CAN frame: 19B#00000F000000
Running zeroize now.
Quick是只有0,1,9,A,B,F这几个数,然后Superquick只有0,9,F这几个极端的值。
🚀🚀自适应测试计算有效负载模板复杂程度的指标,并使用一组简化的可能值。
python ./can-hax.py --fuzz --adaptive --input can_1_fingerprint.json --can vcan0
🚀🚀这个就是自适应,但是我一直是递增一,所以感觉不是很好用,我们搭配上面那些就能进行简单的模糊测试了。
SavvyCAN
🚀🚀这个就是直接模糊测试了,比较无脑,当然我们也可以自己设置一些规则,但是我在测试的时候就已经把我的车门给打开了,裂开,太强啦!!!
总结
🚀🚀CAN 总线模糊测试是一种强大的方法,用于发现和修复汽车网络系统中的安全漏洞和稳定性问题。通过系统地生成和发送异常 CAN 数据帧,测试人员可以识别出潜在的缺陷,从而增强车辆电子系统的安全性和可靠性。结合 ICSim, Can-Hax和 SavvyCAN 等工具,可以有效地进行 CAN 总线模糊测试,并为车辆网络安全提供坚实的保障。
参考
版权归原作者 花园宝宝小点点 所有, 如有侵权,请联系我们删除。