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

时间:2024-06-10 12:40:00

文章目录

  • 车联网安全入门——CAN总线逆向(ICSim)
    • 介绍
      • 主要特点
      • 使用场景
    • 逆向
      • 二分法
      • 频率统计法
      • 瞪眼法
          • cansniffer
          • SavvyCAN
    • 总结
    • 参考

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

????????孩子正在找实习,可以从事嵌入式,二进制安全,物/车联网安全,可私信或者联系rui6737321@gmail.com

????????最近对于车联网安全非常有兴趣,但是不知道怎么入门,无意间发现了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模拟器使用-****博客

逆向

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

二分法

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

split -l 15000 candump-2024-06-01_104423.log a

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

频率统计法

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

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 函数。
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)