车联网安全入门——CAN总线模糊测试
文章目录
- 车联网安全入门——CAN总线模糊测试
- 介绍
- 主要特点
- 使用场景
- 模糊测试(Fuzz Testing)
- CAN 总线模糊测试(CAN Packet Fuzzing)
- 主要步骤
- 工具和软件
- 主要目标
- Can-Hax
- 安装
- 使用
- 获得指纹
- 模糊测试
- SavvyCAN
- 总结
- 参考
车联网安全入门——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 read in as:
(1717253063.833375) vcan0 161#000005500108001C
(1717253063.833432) vcan0 191#010010A141000B
(1717253063.833439) vcan0 164#0000C01AA8000004Date 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 总线模糊测试,并为车辆网络安全提供坚实的保障。
参考
https://www.youtube.com/watch?v=fXTJ6TH32Vg
相关文章:

车联网安全入门——CAN总线模糊测试
文章目录 车联网安全入门——CAN总线模糊测试介绍主要特点使用场景 模糊测试(Fuzz Testing)CAN 总线模糊测试(CAN Packet Fuzzing)主要步骤工具和软件主要目标 Can-Hax安装使用获得指纹模糊测试 SavvyCAN 总结参考 车联网安全入门…...
JDBC常见异常(10)—预编译模式下占位符动态排序字段失效
场景需求 需要根据不同的列进行对应的排序操作,实现动态列名排序 类似🐟动态查询或更新 但是JDBC预编译模式下占位符的排序字段失效 SQL语句 分页查询 select * from (select t.*, rownum rn from(select * from emp order by empno desc) t where …...
爬虫入门教程:爬虫概述
在数字化时代,数据已经成为我们生活和工作中不可或缺的一部分。而如何高效、准确地获取这些数据,成为了许多领域面临的共同问题。今天,我们就来一起探讨一下爬虫技术,这个能够自动从互联网上抓取信息的神奇工具。 一、什么是爬虫…...

【工具】windows下VMware17解锁mac安装选项(使用unlocker427)
目录 0.简介 1.环境 2.安装前后对比 3.详细安装过程 3.1 下载unlocker427 1)下载地址 2)下载unlocker427.zip 3)解压之后是这样的 4)复制iso中的两个文件到你本地的VMware的安装目录下 5)复制windows下的所有…...
JS 自测题 —— 手写 class
现有三种菜单:button 类型,select 类型,modal 类型。 共同特点 title icon 属性isDisabled 方法(可直接返回 false)exec 方法,执行菜单的逻辑 不同 button 类型,执行 exec 时打印 helloselect …...
Keras深度学习框架实战(7):使用YOLOV8和KerasCV进行高效的图像物体识别
1、绪论 1.1 KerasCV简介 KerasCV是一个专注于计算机视觉任务的模块化组件库,基于Keras构建,可与TensorFlow、JAX或PyTorch等框架配合使用。 概念与定位: KerasCV是Keras API的水平扩展,提供了一系列新的第一方Keras对象&#x…...

Django视图层探索:GET/POST请求处理、参数传递与响应方式详解
系列文章目录 Django入门全攻略:从零搭建你的第一个Web项目Django ORM入门指南:从概念到实践,掌握模型创建、迁移与视图操作Django ORM实战:模型字段与元选项配置,以及链式过滤与QF查询详解Django ORM深度游ÿ…...

磁盘配额的具体操作
磁盘配额: linux的磁盘空间有两个方面:第一个是物理空间,也就是磁盘的容量 第二个inode号耗尽,也无法写入 linux根分区:根分区的空间完全耗尽,服务程序崩溃,系统也无法启动了。 为了防止有人…...

STM 32_HAL_SDIO_SD卡
STM32的SDIO(Secure Digital Input Output) 接口是一种用于SD卡和MMC卡的高速数据传输接口。它允许STM32微控制器与多种存储卡和外设进行通信,支持多媒体卡(MMC卡)、SD存储卡、SDI/O卡和CE-ATA设备。STM32的SDIO控制器…...

人脸识别系统之动态人脸识别
二.动态人脸识别 1.摄像头人脸识别 1.1.导入资源包 import dlib import cv2 import face_recognition from PIL import Image, ImageTk import tkinter as tk import os注:这些导入语句允许您在代码中使用这些库和模块提供的功能,例如创建…...
Opencv实用笔记(一): 获取并绘制JSON标注文件目标区域(可单独保存目标小图)
文章目录 背景代码 背景 如果我们想要根据json标注文件,获取里面的指定目标的裁剪区域,那么我们可以根据以下代码来实现(也可以校验标注情况)。 代码 from tqdm import tqdm import os, json, cv2, copy import numpy as npdef…...

LabVIEW在高校电力电子实验中的应用
概述:本文介绍了如何利用LabVIEW优化高校电力电子实验,通过图形化编程实现参数调节、实时数据监控与存储,并与Simulink联动,提高实验效率和数据处理能力。 需求背景高校实验室在进行电机拖动和电力电子实验时,通常使用…...
rtsp python实现
1. rtsp rtp rtcp https://hope-wisdom.blog.csdn.net/article/details/138259027 2.rtsp加速 https://mp.weixin.qq.com/s/0C1b-8pFw0HaE1xpNbrxxw 3. 实现了一部分获取数据 import socket import base64 import threading import struct# 定义 RTSP 请求 def send_rtsp_…...

RHCE (Linux进阶) Ubuntu 操作系统安装教程
一、在官网下载iso镜像文件 下载地址: https://cn.ubuntu.com/download/server/step1#downloads(下载最新的Ubuntu 20.04 LTS服务器版本) 二、VMware安装配置过程 基本安装过程 1、新建虚拟机 2、选择典型即可 3、设置下载好的Ubuntu对应路…...
vue-router 源码分析——1. 路由匹配
这是对vue-router 3 版本的源码分析。 本次分析会按以下方法进行: 按官网的使用文档顺序,围绕着某一功能点进行分析。这样不仅能学习优秀的项目源码,更能加深对项目的某个功能是如何实现的理解。这个对自己的技能提升,甚至面试时…...
百度云下载不限速方式集合
使用解析网站配合Motrix工具软件 下载Motrix工具:Motrix下载链接打开解析网址:解析网站获取,将百度网盘链接粘贴到解析网站,获取下载链接。在Motrix中配置Aria2 RPC地址:ws://localhost:16800/jsonrpc开始下载&#x…...

2024年6月1日 (周六) 叶子游戏新闻
Embracer探讨单机游戏大作涨价超过70美元的可能性在Embracer集团等待公布新公司名称的同时,他们对游戏大作的价格上涨做出了评论。几年来,游戏大作的价格已经达到了70美元的门槛。Embracer集团的CEO Lars Wingefors在采访中表示,电子游戏行业…...

MathorCup挑战赛获奖名单公示,第九届研讨会及颁奖典礼即将举行
近日,备受瞩目的2024年第十四届MathorCup高校数学建模挑战赛圆满落幕,竞赛组委会于近日公示了获奖名单初稿。本届竞赛自2024年4月12日至16日举行,吸引了来自全国740所高校的9119支队伍踊跃参与,其中包括本科生、研究生、专科生及教…...

vulnhub靶机xptosystem
下载地址:https://download.vulnhub.com/xpto/xptosystem.ova 主机发现 端口扫描 服务扫描 漏洞扫描 看一下web 目录爆破 那不用说肯定看看robots.txt 要检查readme去看看 看不懂 这个是靶场吧很像 在最后看着挺像url路径的 还真是,我直接base64 坏了还…...

Spring Boot详解:深入了解与实践
文章目录 1. Spring Boot简介1.1 什么是Spring Boot?1.2 Spring Boot的历史背景1.3 Spring Boot的核心特点 2. Spring Boot的核心概念2.1 自动配置2.1.1 自动配置原理2.1.2 自定义配置 2.2 Spring Boot Starter2.3 Spring Boot CLI 3. Spring Boot的主要功能模块3.1…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战
前言 现在我们有个如下的需求,设计一个邮件发奖的小系统, 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式(Decorator Pattern)允许向一个现有的对象添加新的功能,同时又不改变其…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

【机器视觉】单目测距——运动结构恢复
ps:图是随便找的,为了凑个封面 前言 在前面对光流法进行进一步改进,希望将2D光流推广至3D场景流时,发现2D转3D过程中存在尺度歧义问题,需要补全摄像头拍摄图像中缺失的深度信息,否则解空间不收敛…...

定时器任务——若依源码分析
分析util包下面的工具类schedule utils: ScheduleUtils 是若依中用于与 Quartz 框架交互的工具类,封装了定时任务的 创建、更新、暂停、删除等核心逻辑。 createScheduleJob createScheduleJob 用于将任务注册到 Quartz,先构建任务的 JobD…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
三体问题详解
从物理学角度,三体问题之所以不稳定,是因为三个天体在万有引力作用下相互作用,形成一个非线性耦合系统。我们可以从牛顿经典力学出发,列出具体的运动方程,并说明为何这个系统本质上是混沌的,无法得到一般解…...

佰力博科技与您探讨热释电测量的几种方法
热释电的测量主要涉及热释电系数的测定,这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中,积分电荷法最为常用,其原理是通过测量在电容器上积累的热释电电荷,从而确定热释电系数…...
iOS性能调优实战:借助克魔(KeyMob)与常用工具深度洞察App瓶颈
在日常iOS开发过程中,性能问题往往是最令人头疼的一类Bug。尤其是在App上线前的压测阶段或是处理用户反馈的高发期,开发者往往需要面对卡顿、崩溃、能耗异常、日志混乱等一系列问题。这些问题表面上看似偶发,但背后往往隐藏着系统资源调度不当…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...

沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...