序
車聯(lián)網(wǎng)安全是目前較為熱門的發(fā)展方向,但是由于他的入門門檻太高(沒有實車)導致大部分人被卡在門檻這里。所以我總結了網(wǎng)上的相關資料寫出這篇文章,可以讓學習車聯(lián)網(wǎng)安全的同學來模擬控制一輛車是什么樣的感覺,本篇文章通過Ubuntu模擬了車載CAN總線的收發(fā)包來進行操作學習,接下來跟著我一步步操作來打開車聯(lián)網(wǎng)安全的大門吧!
什么是CAN總線
CAN總線又稱控制器局域網(wǎng)是Controller Area Network的縮寫,CAN總線是一種功能豐富的車用總線標準。被設計用于在不需要主機(Host)的情況下,允許網(wǎng)絡上的單片機和儀器相互通信。它基于消息傳遞協(xié)議,設計之初在車輛上采用復用通信線纜,以降低銅線使用量,后來也被其他行業(yè)所使用。簡單來說就是用來控制車輛功能的通信協(xié)議,比如車門解鎖、轉向燈、剎車、油門等,為什么要使用CAN協(xié)議,簡單來說就是便宜好用。
CAN總線特性
安全性:CAN是低級協(xié)議,不支持任何內(nèi)在的安全功能。在標準的CAN中也沒有加密,這使得這些網(wǎng)絡數(shù)據(jù)能被截取。在大多數(shù)應用中,應用程序需要部署自己的安全機制,例如認證傳入命令或網(wǎng)絡上某些設備的存在。若不執(zhí)行適當?shù)陌踩胧渌丝赡茉O法在總線上插入消息。盡管一些安全關鍵功能(如修改固件,編程鍵或控制防抱死制動)存在密碼,但這些系統(tǒng)并未普遍實施,并且密鑰對的數(shù)量有限。
通信機制:多主機-即每個節(jié)點都有接入總線的能力。
尋址機制:消息區(qū)別:不設節(jié)點的地址,通過消息的標志符來區(qū)別消息。
幀類型:數(shù)據(jù)幀、遠程幀、錯誤幀、超載幀、幀間隔
攻擊方式:
應用報文模糊測試
Dos攻擊測試
重放攻擊
由于CAN總線上面的數(shù)據(jù)包沒有任何加密,所以這些數(shù)據(jù)包能夠被截取竊聽。由于車載網(wǎng)絡使用CAN協(xié)議進行通信,所以我們可以聯(lián)想到車聯(lián)的功能也是通過CAN網(wǎng)絡進行數(shù)據(jù)發(fā)送和交換。比如我們打開左轉向燈,那么電信號就會通過CAN總線發(fā)送到網(wǎng)絡上的每個設備,然后左轉向燈會解釋數(shù)據(jù)包并且執(zhí)行數(shù)據(jù)包中的指令。
在網(wǎng)絡上發(fā)送的數(shù)據(jù)包由兩部分組成:標識符和數(shù)據(jù)。標識符是車輛中設備的表示。數(shù)據(jù)字段表示要與所述設備一起完成的指令。讓我們看下面的例子:
(1668496788.311506)vcan0095#800007F400000017
數(shù)據(jù)包的開始部分是標識符。在這種情況下,標識符是095。#之后的數(shù)據(jù)包剩余部分是數(shù)據(jù)字段??梢钥聪耊ireshark抓到的包標識符在不同車型,相同車型不同年份的情況下也是不相同的,如果是相同車型相同年份的車型那么標識符大概率是通用的,不同的標識符表示車上不同的設備發(fā)的包,后面我們需要找到我們想要控制車輛功能的標識符包。
攻擊方式
在前面CAN總線特性處我們寫的CAN總線攻擊方式包括應用報文模糊測試、Dos攻擊測試、重放攻擊等,接下來我們來實操一下重放攻擊,顧名思義就是可以截取數(shù)據(jù)包然后重新發(fā)送導致車輛處于我們的控制之下而不受到車輛所有人的操控。
安裝工具
kali2022.03
Socketcand(CAN網(wǎng)絡)
Kayak(一款基于SocketCAN的CAN總線分析工具)
can-utils
ICSim是一個開源的車輛儀表模擬器,該模擬器包含controls和ICSim兩個模塊,其中controls負責生成模擬的車輛數(shù)據(jù),以CAN報文的方式發(fā)送給虛擬的CAN接口,ICSim從虛擬CAN接口讀取CAN報文,并在儀表上更新對應零件的狀態(tài),如車速、車門狀態(tài)等等。
安裝依賴
sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf
安裝ICSim
git clone https://github.com/zombieCraig/ICSim.git
編譯
cd ICSim/ sudo make在這里插入圖片描述
安裝socketcand
下載
git clone https://github.com/linux-can/socketcand.git
獲取缺少的文件
wget https://raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in在這里插入圖片描述
編譯安裝
cd socketcand/ autoconf在這里插入圖片描述
./configure在這里插入圖片描述
make clean在這里插入圖片描述
make在這里插入圖片描述
sudo make install在這里插入圖片描述
安裝Kayak
下載
git clone https://github.com/dschanoeh/Kayak.git
安裝
cd Kayak/ mvn clean package在這里插入圖片描述
安裝CAN Utils
can-utils是一套Linux特有的實用工具,它可以讓Linux與車輛上的CAN網(wǎng)絡進行通信,為了發(fā)送、接收和分析CAN數(shù)據(jù)包,需要安裝CAN utils。canutils主要包括5個經(jīng)常使用的工具:
cansniffer 用于嗅探數(shù)據(jù)包
cansend 發(fā)送一條數(shù)據(jù)
candump 轉儲所有接收的數(shù)據(jù)包
canplayer 重播CAN數(shù)據(jù)包
cangen 隨機生成CAN數(shù)據(jù)包這可以通過apt-get安裝:
sudo apt-get install can-utils -y
至此,全部安裝完畢。
開始攻擊
首先設置vcan(虛擬CAN)接口
sudomodprobecan sudomodprobevcan sudoiplinkadddevvcan0typevcan sudoiplinksetupvcan0
打開儀表盤模擬器
./icsim vcan0
打開儀表盤控制器
./controls vcan0
點擊儀表盤控制器界面就可以模擬操縱車輛了。
功能 | 控制按鈕 |
---|---|
轉向燈 | 鍵盤左右鍵 |
速度 | 鍵盤上下鍵 |
開車門 | 右SHIFT鍵+A |
關車門 | 左SHIFT鍵+A |
開啟全部車門 | 左SHIFT鍵+右SHIFT鍵 |
關閉全部車門 | 右SHIFT鍵+左SHIFT鍵 |
使用candump進行抓包
candump vcan0 -l
CTRL+C停止看到抓到的包,由于CAN在不停的通信所以包會非常大。接下來我們找到CAN網(wǎng)絡上面控制車輛的數(shù)據(jù)包對他進行攻擊。監(jiān)聽抓包,然后打開所有車門然后關閉。抓到了一萬多個包。嘗試重放我們的包
canplayer -I candump-2022-11-15_052559.log
可以看到全部車門打開隨即關閉。接下來我們采用二分法每次刪除一半來查找關閉車門的包。
最終通過二分法找到打開所有車門的包為:
(1668507963.222323) vcan0 19B#000000000000
其中的19B是設備標識符,在數(shù)據(jù)包中查找19B。
└─$ grep 19B candump-2022-11-15_052559.log (1668507960.512530) vcan0 244#000000019B (1668507962.233563) vcan0 19B#00000F000000 (1668507963.222323) vcan0 19B#000000000000 (1668507963.517110) vcan0 244#000000019B (1668507964.208966) vcan0 19B#00000F000000 (1668507965.319056) vcan0 244#000000019B
我們可以看到其中有一個19B#00000F000000,如果我們得到19B#000000000000是打開所有車門,那么后面我們也進行了關閉所有車門的操作,可以猜測19B#00000F000000是關閉所有車門。可以看到上圖,我們成功關閉了所有車門。
如上可知這個數(shù)據(jù)包中通過第三位字節(jié)來控制。
(1668507962.233563) vcan0 19B#00000F000000 //打開所有車門 (1668507963.222323) vcan0 19B#000000000000 //關閉所有車門
鎖上所有門的數(shù)據(jù)包將半字節(jié)表示為十六進制F。將其分解為二進制可得出 16 種可能的門組合。
二進制 | 十六進制 |
---|---|
0000 | 0 |
0001 | 1 |
0010 | 2 |
0011 | 3 |
0100 | 4 |
0101 | 5 |
0110 | 6 |
0111 | 7 |
1000 | 8 |
1001 | 9 |
1010 | a |
1011 | b |
1100 | c |
1101 | d |
1110 | e |
1111 | f |
嘗試字符控制的不同車門。
字符 | 車門 |
---|---|
8 | 右后車門 |
4 | 左后車門 |
2 | 右前車門 |
1 | 左前車門 |
假設1是鎖門的動作,0是解鎖門的動作。因此,當我們識別我們的門時,識別出的門會收到鎖門的指令,而其他門會收到解鎖的指令。比如字符8的二進制是1000那么就是鎖門,開門,開門,開門。
右后車門 左后車門 右前車門 左前車門 8 4 2 1 1 1 0 0 等于 C
可以嘗試查看C是不是關閉了后排兩個門,打開了前排兩個門。至此,就可以操控每個門的開關了。同理,轉向和油門都是相同原理。
責任編輯:彭菁
-
編程
+關注
關注
88文章
3634瀏覽量
93866 -
車聯(lián)網(wǎng)
+關注
關注
76文章
2597瀏覽量
91695 -
網(wǎng)絡數(shù)據(jù)
關注
1文章
44瀏覽量
10101
原文標題:車聯(lián)網(wǎng)安全入門之仿真一輛車的通信網(wǎng)絡
文章出處:【微信號:談思實驗室,微信公眾號:談思實驗室】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
相關推薦
評論