车联网安全入门——CAN总线逆向(ICSim)

文章目录

车联网安全入门------CAN总线逆向(ICSim)

🚀🚀孩子正在找实习,可以从事嵌入式,二进制安全,物/车联网安全,可私信或者联系[email protected]

🚀🚀最近对于车联网安全非常有兴趣,但是不知道怎么入门,无意间发现了ICSim,可以用来简单模拟一下汽车,学习了一段时间后决定写一下笔记,怕自己学完就忘记了(仅供学习参考)。

介绍

🚀🚀ICSim 是一个用于模拟车辆仪表集群的工具,专门为 SocketCAN 设计。SocketCAN 是 Linux 内核中的一个模块,用于支持控制器局域网(CAN)接口。

主要特点

  1. 仪表集群模拟:ICSim 可以模拟车辆仪表盘,包括速度表、转速表、燃油表等。这对于开发和测试基于 CAN 总线的汽车电子系统非常有用。
  2. 与 SocketCAN 集成:ICSim 与 Linux 的 SocketCAN 接口集成,允许用户通过标准的 SocketCAN 工具与模拟器进行通信和调试。
  3. 教育和开发:它是汽车网络和协议学习的一个极佳工具,可以帮助工程师、研究人员和学生理解 CAN 总线的工作原理和应用。

使用场景

  • 软件开发:在开发车辆电子控制单元(ECU)时,可以使用 ICSim 进行初步测试,而无需实际的车辆硬件。
  • 教学和培训:提供一个虚拟的车辆环境,便于教学 CAN 总线通信。
  • 调试和验证:与实际车辆硬件的连接前,先在模拟环境中验证通信和功能。

🚀🚀项目地址如下所示:

zombieCraig/ICSim: Instrument Cluster Simulator (github.com)

🚀🚀安装教程如下:

车联网安全入门------ICSim模拟器使用-CSDN博客

逆向

🚀🚀其实上篇文章我们已经展示了如何通过重放攻击去操控汽车,但是我们有一个地方没有解释,那就是我们如何找到对应的can报文?所以接下来我会来介绍一下如何找到我们想要的CAN报文。

二分法

🚀🚀首先必须得是经典的二分法,核心思想很简答,就和二分查找一样,我们先将报文对半分,使用如下命令:

shell 复制代码
split -l 15000 candump-2024-06-01_104423.log a

🚀🚀将30000条数据对半分,然后分别发送给can设备,看一下哪一半报文产生了你需要的动作,那就保留下来继续二分,循环,最后就能找到了。

频率统计法

🚀🚀上面的方法虽然有用,但是有些时候太慢了,特别是对于那种只出现几次的can报文,我们显然可以通过频率分析来找到他们,代码如下所示,我都加上了详细的代码:

python 复制代码
import sys

def read_can_data(file_path):
    """
    读取文件并提取CAN ID和数据。
    
    参数:
        file_path (str): 文件路径。
    
    返回:
        tuple: (CAN ID 列表, CAN 数据列表)
    """
    result_id = []
    result_data = []
    
    with open(file_path, "r") as file:
        for line in file:
            parts = line.split(' ')[2]
            can_id = parts.split('#')[0]
            result_id.append(can_id)
            result_data.append(parts)
    
    return result_id, result_data

def print_id_counts(result_id):
    """
    打印每个CAN ID出现的次数。
    
    参数:
        result_id (list): CAN ID 列表。
    """
    unique_ids = set(result_id)
    for can_id in unique_ids:
        print(f"{can_id}: {result_id.count(can_id)}")

def search_data_by_id(result_data):
    """
    根据用户输入的CAN ID搜索并打印对应的数据。
    
    参数:
        result_data (list): CAN 数据列表。
    """
    while True:
        inp = input("please input id: ")
        for data in result_data:
            if inp in data.split("#")[0]:
                print(data)

def main():
    """
    主函数,执行读取数据、打印统计信息和搜索数据功能。
    """
    if len(sys.argv) < 2:
        print("Usage: python script.py <input_file>")
        return
    
    file_path = sys.argv[1]
    result_id, result_data = read_can_data(file_path)
    
    print_id_counts(result_id)
    search_data_by_id(result_data)

if __name__ == "__main__":
    main()
  1. read_can_data 函数用于读取文件并提取CAN ID和数据,返回一个包含CAN ID和数据的元组。
  2. print_id_counts 函数用于打印每个CAN ID出现的次数。
  3. search_data_by_id 函数根据用户输入的CAN ID搜索并打印对应的数据。
  4. main 函数是程序的入口,执行读取数据、打印统计信息和搜索数据的功能。
  5. if __name__ == "__main__": 确保脚本作为主程序运行时调用 main 函数。
shell 复制代码
python can.py candump-2024-06-01_104423.log

🚀🚀调用py代码之后显示如下:

复制代码
324: 126
305: 118
136: 1246
18E: 1246
40C: 42
143: 1246
21E: 310
333: 122
1CF: 623
1DC: 623
309: 126
13F: 1246
405: 42
191: 1247
294: 310
17C: 1246
13A: 1246
454: 42
1B0: 620
244: 1066
158: 1246
428: 42
5A1: 12
1A4: 623
133: 1247
166: 1246
095: 1246
1AA: 620
039: 821
188: 24
1D0: 620
183: 1246
320: 126
161: 1247
164: 1246
37C: 126
19B: 6
please input id: 19B
19B#00000F000000                                             
                                                             
19B#00000F000000                                             
                                                             
19B#00000E000000                                             
                                                             
19B#00000F000000                                             
                                                             
19B#00000E000000                                             
                                                             
19B#00000F000000

🚀🚀对于那种出现次数很少的代码,我们就可以仔细研究一下,刚好就发现这个19B就是开车门,因为我们有过几次开关车门的动作,就被记录下来了。

瞪眼法

🚀🚀这个主要就是通过我们的sniffer来动态显示我们的数据包,通过我们的眼睛发现关键报文,比如汽车加速时有个报文数据一直在规律增长,就可以猜测是控制汽车油门的报文,这部分主要是看我们能不能发现报文的变化,如果后期有可能的话出个视频教程会清楚一点(挖坑),这里就简单介绍一下。

cansniffer

🚀🚀cansniffer能够动态显示我们的can报文变化状态,对于can报文的逆向起到很大的帮助作用,使用命令如下所示:

复制代码
cansniffer -c vcan0

🚀🚀特别值得注意的就是,使用按下#键,然后enter,就可以屏蔽一些变化数据,更便于我们进行观察:

SavvyCAN

🚀🚀前面文章有介绍,不会使用的同学可以回去看一下。

🚀🚀然后就是SavvyCAN里面的sniffer,就会发现和之前那个命令行工具cansniffer很相似,这个的话,红色是无规律变化,绿色是有规律变化,下方还能过滤报文,非常好用哈!

🚀🚀使用右上角notch功能也能实现屏蔽一些变化,便于我们观察,而且我们还能点击View Bits来观察每一个字节是如何使用的。

🚀🚀还有更加逆天的功能,那就是画图,我们简单来看一下,这个是我按下油门之后的数据,详细的过程我会单独写一篇文章(狠狠挖坑),内容就是如何分析一段CAN报文,确定其功能以及如何攻击,感觉越来越好玩了!

总结

🚀🚀这篇文章简单介绍了一下常见的几种CAN逆向方法,希望能够帮助到大家,谢谢!!!

参考

Hacking All The Cars - CAN总线逆向-安全客 - 安全资讯平台 (anquanke.com)

相关推荐
大小曲奇(´ε` )1 小时前
使用安全继电器的急停电路设计
安全
go_to_hacker2 小时前
安恒web安全春招实战
安全·web安全·网络安全·渗透测试
虹科Pico汽车示波器5 小时前
汽车免拆诊断案例 | 2016款奔驰C200L车组合仪表上多个故障灯偶尔点亮
汽车·汽车示波器·can总线·汽修案例·波形诊断·通信总线·奔驰c200
世界尽头与你6 小时前
【安全扫描器原理】网络扫描算法
网络·安全
AI拉呱_6 小时前
医院行业等保2.0案例
安全·web安全
中云时代-防御可测试-小余7 小时前
高防IP是如何防护DDoS攻击和CC攻击的
运维·服务器·tcp/ip·安全·阿里云·ddos·宽度优先
帅云毅10 小时前
文件上传--解析漏洞和编辑器
笔记·学习·安全·web安全·编辑器·php
樽酒ﻬق10 小时前
深度解析 Kubernetes 配置管理:如何安全使用 ConfigMap 和 Secret
安全·贪心算法·kubernetes
云天徽上11 小时前
【数据可视化-27】全球网络安全威胁数据可视化分析(2015-2024)
人工智能·安全·web安全·机器学习·信息可视化·数据分析
网络之路Blog11 小时前
【实战中提升自己】内网安全部署之端口隔离与MAC地址认证
安全·macos·网络之路一天·华为华三数通基础·华为华三企业实战架构·华为中小型企业实战·华为华三计算机网络基础