0%

noone的车联网-CAN总线环境模拟与重放攻击

  • 环境

    • ICSim 仪表盘模拟器
    • Socketcand can网络
    • Kayak 基于socketCAN的分析工具

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf -y
      git clone https://github.com/zombieCraig/ICSim.git
      cd ICSim/
      sudo make
      git clone https://github.com/linux-can/socketcand.git
      cd socketcand

      # 获取缺少的文件
      wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in

      # 编译安装
      apt install libconfig-dev
      $ meson setup -Dlibconfig=true --buildtype=release build
      $ meson compile -C build
      $ meson install -C build

      # 下载
      git clone https://github.com/dschanoeh/Kayak.git
      # 安装jdk
      sudo apt-get install openjdk-11-jdk
      # 安装
      cd Kayak
      mvn clean package

      注意要用低版本的jdk,否则会导致缺少 Pack200 而编译错误

  • 启动模拟器

    1
    2
    3
    4
    5
    # 设置vcan(虚拟CAN)接口
    sudo modprobe can
    sudo modprobe vcan
    sudo ip link add dev vcan0 type vcan
    sudo ip link set up vcan0

    ICSim

    1
    2
    3
    4
    # 打开仪表盘模拟器
    ./icsim vcan0
    # 打开仪表盘控制器
    ./controls vcan0

    此时可以用键盘或者手柄控制:

    | 功能 | 控制按钮 |
    |—————————|———————————|
    | 转向 | 键盘左右 |
    | 速度 | 键盘上下 |
    | 开/关左前车门 | 右Shift / 左Shift + A |
    | 开/关右前车门 | 右Shift / 左Shift + B |
    | 开/关左后车门 | 右Shift / 左Shift + X |
    | 开/关右后车门 | 右Shift / 左Shift + Y |
    | 开启全部车门 | 左Shift + 右Shift |
    | 关闭全部车门 | 右Shift + 左Shift |

  • 抓包与分析

    先抓一个正常无操作的包

    1
    candump vcan0 -f normal_log

    可以看到can总线传了很多东西

    随后抓一个开门的包:

    1
    candump vcan0 -f open_log

    然后处理数据:

    1
    2
    3
    cat normal_log | awk '{print $3}' | cut -d'#' -f1 | sort | uniq > normal_ids.txt
    cat open_log | awk '{print $3}' | cut -d'#' -f1 | sort | uniq > open_ids.txt
    diff normal_ids.txt open_ids.txt

    也就是说 19B 只在开左前门的时候出现,可以提取出其相关消息:

    1
    cat open_log | awk '{print $3}' | grep 19B# | uniq

    对于这种没有加密的,可以直接 cansend 重放攻击

    值得注意的是,由于发动机一直在运转,所以这样子分析不出发动机的运转

    不知道车轮转速会不会这么传输并被抓取到

  • Kayak 使用

    /home/noone/Kayak/application/target/kayak/bin# 下面运行 ./kayak

    新建一个项目,然后 new bus

    由于 Kayak 仅支持 socket 的输入,所以要使用 socketcand 来将收到的can挂载到socket服务上

    1
    socketcand -v -i vcan0 -l lo -p 29536

    网上找不到讲这个的,我实验的情况下,如果是 socketcand -v -i vcan0 -l 0.0.0.0 -p 29536 就会挂载失败,-v 打印参数发现挂到了莫名其妙的地方:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    root@Rei:/etc# socketcand -v -i vcan0 -l 0.0.0.0 -p 29536
    Verbose output activated

    Using network interface '0.0.0.0'
    Listen address is 255.127.0.0
    Netmask is 149.88.0.0
    Broadcast address is 255.255.255.255
    creating broadcast thread...
    binding socket to 255.127.0.0:29536
    bind: Cannot assign requested address

    然后换到 loopback 上就能正常了:

    KayakConnection-new connection

    注意这里前面的 vcan0 要跟 socketcand 挂载的一致,然后能在右边栏看到,然后拖到左边的项目里面就行

    然后点那个开始标志开始捕获数据,由于之前已经开了模拟控制器,所以能接收到数据

    但好像只有 raw view 有数据,其他的因为没有dbc好像都看不到(

    所以这好像跟candump没什么区别()