本環(huán)境是蛇矛實(shí)驗(yàn)室基于"火天網(wǎng)演攻防演訓(xùn)靶場"進(jìn)行搭建,通過火天網(wǎng)演中的環(huán)境構(gòu)建模塊,可以靈活的對(duì)目標(biāo)網(wǎng)絡(luò)進(jìn)行設(shè)計(jì)和配置,并且可以快速進(jìn)行場景搭建和復(fù)現(xiàn)驗(yàn)證工作。
關(guān)于CAN總線協(xié)議
CAN 是Controller Area Network 的縮寫(以下稱為CAN),是ISO國際標(biāo)準(zhǔn)化的串行通信協(xié)議。在汽車產(chǎn)業(yè)中,出于對(duì)安全性、舒適性、方便性、低功耗、低成本的要求,各種各樣的電子控制系統(tǒng)被開發(fā)了出來。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類型及對(duì)可靠性的要求不盡相同,由多條總線構(gòu)成的情況很多,線束的數(shù)量也隨之增加。為適應(yīng)“減少線束的數(shù)量”、“通過多個(gè)LAN,進(jìn)行大量數(shù)據(jù)的高速通信”的需要,1986 年德國電氣商博世公司開發(fā)出面向汽車的CAN 通信協(xié)議。此后,CAN 通過ISO11898 及ISO11519 進(jìn)行了標(biāo)準(zhǔn)化,在歐洲已是汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動(dòng)化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面。現(xiàn)場總線是當(dāng)今自動(dòng)化領(lǐng)域技術(shù)發(fā)展的熱點(diǎn)之一,被譽(yù)為自動(dòng)化領(lǐng)域的計(jì)算機(jī)局域網(wǎng)。它的出現(xiàn)為分布式控制系統(tǒng)實(shí)現(xiàn)各節(jié)點(diǎn)之間實(shí)時(shí)、可靠的數(shù)據(jù)通信提供了強(qiáng)有力的技術(shù)支持。
在了解CAN之前,我們先來理解一下什么是ECU(Electronic Control Unit),早期分布式的電子電氣架構(gòu)下,每個(gè) ECU 通常只負(fù)責(zé)控制一個(gè)單一的功能單元,彼此獨(dú)立,分別控制著發(fā)動(dòng)機(jī)、剎車、車 門等部件。雖然現(xiàn)在ECU變得越來越復(fù)雜,但其基本部件不會(huì)改變,ECU 控制車輛的不同功能,現(xiàn)代汽車中有多達(dá) 70 個(gè) ECU。如果這些ECU需要通信,那么就用到了CAN。在CAN總線出現(xiàn)之前,汽車制造商使用點(diǎn)對(duì)點(diǎn)布線,因此大多數(shù)部件都需要互相連接才能實(shí)現(xiàn)通信。如果汽車布線時(shí)出現(xiàn)故障,診斷會(huì)變得非常困難。CAN的出現(xiàn)使這種狀況變得簡單,CAN是一種總線協(xié)議,它允許微控制器(MCU)和ECU相互通信,并且它是一種基于消息的協(xié)議。通過單個(gè) CAN 接口,ECU 可以通過集中式系統(tǒng)與每個(gè)之間進(jìn)行通信,涉及更少的布線,并且數(shù)據(jù)通過數(shù)字信號(hào)而不是模擬信號(hào)傳輸,它使信號(hào)在傳輸過程中發(fā)生錯(cuò)誤的概率減小。要訪問汽車的CAN總線進(jìn)行調(diào)試,我們需要連接汽車的OBD接口(現(xiàn)在汽車都使用OBD-II接口),一般情況下,這個(gè)接口位于駕駛員座位的前方附近。下圖中為汽車的調(diào)試接口
想要通過OBD-II接口連接電腦進(jìn)行操作,就需要用到USB轉(zhuǎn)CAN的工具,淘寶一般有賣。
我們學(xué)習(xí)vehicle安全的最便宜簡單的方法是使用汽車模擬器。我們可以使用 ICSim工具,很方便的了解和學(xué)習(xí) CAN 的內(nèi)容。由于本小節(jié)只是簡單介紹CAN和ICSim模擬器的使用,使初學(xué)者對(duì)CAN有初步了解,對(duì)CAN的詳細(xì)內(nèi)容并不會(huì)進(jìn)行講解,如果大家有興趣可以去看<<智能汽車安全攻防大揭秘>>這本書。ICSim(Instrument Cluster Simulator),是由Open Garages推出的工具。它可以產(chǎn)生多個(gè)CAN信號(hào),同時(shí)會(huì)產(chǎn)生許多背景噪聲,讓我們可以在沒有汽車或不改造汽車的情況下即可練習(xí)CAN總線的逆向技術(shù)。ICSim 包括一個(gè)帶有車速表、門鎖指示燈、轉(zhuǎn)向信號(hào)燈和控制面板的儀表板。模擬控制器允許用戶與模擬汽車網(wǎng)絡(luò)進(jìn)行交互,應(yīng)用加速、剎車、控制門鎖和轉(zhuǎn)向信號(hào)。
安裝ICSim環(huán)境,需要首先安裝ICSim所需依賴庫:
sudo apt installlibsdl2-dev libsdl2-image-dev
要發(fā)送、接收和分析 CAN 包,我們需要 CAN 分析工具。Can-utils 是一組 Linux 實(shí)用程序,允許 Linux 與車載 CAN 網(wǎng)絡(luò)進(jìn)行通信。Can-utils 包含 4個(gè)我們經(jīng)常使用的主要工具:
sudo apt install can-utils #candump : 顯示、過濾和記錄CAN數(shù)據(jù)到文件。candump并不會(huì)解碼數(shù)據(jù)。 #canplayer : 對(duì)記錄的CAN數(shù)據(jù)進(jìn)行重放。 #cansend : 發(fā)送CAN數(shù)據(jù)。 #cansniffer : 顯示CAN數(shù)據(jù)并高亮顯示變化的字節(jié)。
然后將ICSim下載下來
切換到ICSim目錄,執(zhí)行"make"命令,就可以編譯成功。編譯成功后,就可以使用"icsim van0"來模擬車輛,我們另起一個(gè)終端,使用"controls vcan0",這時(shí)出現(xiàn)儀表盤的窗口是模擬控制器,并且控制器中的速度表一直忽上忽下的跳到在0mph以上的位置,說明ICSim工作正常。
下面,我們可以使用如下鍵位來操作控制器
上方向鍵加速 向左方向鍵左轉(zhuǎn) 向右方向鍵右轉(zhuǎn) 右shift+A/X開左車門(前/后) 右shift+B/Y開右前車門(前/后) 左shift+A/X關(guān)左車門(前/后) 左shift+B/Y關(guān)右前車門(前/后)
運(yùn)行后,我們可以使用ifconfig來查看網(wǎng)絡(luò)接口,發(fā)現(xiàn)會(huì)多出來一個(gè)vcan0的網(wǎng)絡(luò)接口。
我們可以使用"candump vcan0"來抓取CAN包裹流量,這時(shí)我們對(duì)控制器進(jìn)行操作就會(huì)抓取相應(yīng)命令的流量。如下圖,左側(cè)可以看到抓取的流量直接打印到屏幕上,顯示流量時(shí)還是比較亂的。
這時(shí)我們可以使用"candump -l vcan0",candump會(huì)自動(dòng)將抓取的流量包放入candump-xxx.log文件中。
想要停止抓取可以按"ctrl+c"。查看一下抓取流量包,第一列,括號(hào)內(nèi)的是時(shí)間戳,第二列中vcan0為我們的虛擬can接口。后面的是ID和數(shù)據(jù),ID和數(shù)據(jù)以#號(hào)分割。
candump可以監(jiān)聽并記錄原始數(shù)據(jù),會(huì)有很多對(duì)我們無用的數(shù)據(jù)。can-utils工具包中還有一款可以根據(jù)仲裁ID進(jìn)行分組顯示,并對(duì)變化的數(shù)據(jù)以紅色顯示,使我們比較容易分辨,它就是cansniffer。我們使用"cansniffer -c vcan0"命令來對(duì)vcan0進(jìn)行監(jiān)聽。
我們可以測試一下,當(dāng)我按下左方向鍵時(shí),儀表盤開始出現(xiàn)左轉(zhuǎn)向的燈。同時(shí)左側(cè)的流量包開始變動(dòng),但是我不太好觀察到哪里出現(xiàn)了變化。
這時(shí),我們可以將ID這一列截圖固定在左側(cè),因?yàn)閏ansniffer已經(jīng)對(duì)ID做了分類,當(dāng)進(jìn)行左轉(zhuǎn)向的操作,就可以觀察出哪里出現(xiàn)了變化。如下圖所示,當(dāng)我按下左轉(zhuǎn)向時(shí),發(fā)現(xiàn)左側(cè)多出了一行,這一行為"188#01000000",那么這一條流量包大概率是對(duì)轉(zhuǎn)向進(jìn)行操作的包裹。
同理,我們繼續(xù)測試一下右轉(zhuǎn)向,發(fā)現(xiàn)左側(cè)多出一行,即為"188#02000000"。發(fā)現(xiàn)和左轉(zhuǎn)向僅僅相差1字節(jié),說明id為188很有可能是對(duì)轉(zhuǎn)向的控制命令。接下來,我們驗(yàn)證一下。
cansend可以模擬發(fā)送包裹,cansend命令的使用為"cansend vcan0 ID#XXXXXXXX"。上面我們已經(jīng)觀察到188為轉(zhuǎn)向控制ID,我們發(fā)送一下sniffer的左轉(zhuǎn)包裹,發(fā)現(xiàn)確實(shí)儀表盤出現(xiàn)了左轉(zhuǎn),證明了我們188確實(shí)是左轉(zhuǎn)控制ID。
同理,我們測試一下右轉(zhuǎn)。
按照前面的思路,我們測試一下開車門的操作,步驟和上面相同。當(dāng)我按下"右shift+A"時(shí),左前車門開啟,同時(shí)我們發(fā)現(xiàn)開左前車門的ID為19B,并且數(shù)據(jù)為"00000E000000"。
同時(shí),測試一下關(guān)閉左前車門時(shí)的命令包裹。發(fā)現(xiàn)為"19B#00000F000000"。
使用"cansend vcan0 19B#00000E000000"命令發(fā)送開啟左前車門的包裹,發(fā)送完畢后發(fā)現(xiàn)儀表盤左前車門打開。
使用"cansend vcan0 19B#00000F000000"命令發(fā)送關(guān)閉左前車門指令,發(fā)送完畢后,車門關(guān)閉。證實(shí)了我們分析的車門開啟和關(guān)閉的指令。
測試加油的指令時(shí),上面的操作也可以比較方便的分析出加油指令I(lǐng)D和數(shù)據(jù)。這里不在重復(fù)講解,上面的方法固然好用,但是也有不適用的時(shí)候,比如情況比較復(fù)雜,出現(xiàn)的ID變化或者較多。我們還有一種方法可以分析出對(duì)車輛的指令。我們首先使用"candump -l vcan0"進(jìn)行流量抓取,抓取過程中進(jìn)行加油門操作,然后松開油門,使其速度將為最低,最后停止抓取流量。
這樣一來,整個(gè)的過程就可以抓取到log文件中。我們使用重放的發(fā)送,發(fā)送這個(gè)log文件中的所有內(nèi)容。
命令如下,使用"canplayer -I candump-xxx.log"命令就會(huì)將抓取到的流量重新發(fā)送一邊。發(fā)送后可以觀察到我們上面加速和減速的整個(gè)過程,接下里我們就要使用二分法截取加速的部分。
使用二分法截取加速過程,例如這里我抓取的log文件有200000條數(shù)據(jù),我們先截取前1000000條數(shù)據(jù)進(jìn)行重放。觀察是否只是加速過程,這里我發(fā)現(xiàn)有減速過程就繼續(xù)使用二分法。一直當(dāng)我截取到20000-40000條時(shí),我發(fā)現(xiàn)只為加速過程。然后我們就可以進(jìn)行下一步了。
我們將log文件的時(shí)間戳去掉后,使用"cat xxx.log | sort | uniq -c | sort -n"命令來分類我們的流量包日志文件。這條命令的結(jié)果是去重后,按照ID出現(xiàn)的次數(shù)進(jìn)行排序。一般情況下,一直加油時(shí)發(fā)出的指令都是單次的,并不會(huì)重復(fù)。按照這一現(xiàn)象,我們分類后,發(fā)現(xiàn)出現(xiàn)1次,并且ID相同并且遞增的命令就是加速指令。
如下圖所示,"244#0000001xxx"即為加速指令。我們重放后,可以觀察到加速現(xiàn)象。
同理,我們也可以測試開關(guān)車門的指令,比如我這里開了4次左前車門,關(guān)了3次左前車門(開門和關(guān)門次數(shù)不同時(shí)容易比較分析)。然后使用"cat xxx.log | sort | uniq -c | sort -n"命令進(jìn)行分類,分類后可以簡單方便的查找車開關(guān)車門的指令。
Fuzzing
我們可以使用savvyCAN工具對(duì)can協(xié)議進(jìn)行fuzz測試。
savvyCAN安裝過程如下,
首先需要安裝qt環(huán)境,這里我使用5.14.2版本(https://download.qt.io/archive/qt/5.14/5.14.2/)(savvyCAN環(huán)境要求>=5.14.0版本),下載".run"的在線安裝程序,然后其賦予執(zhí)行權(quán)限(chmod 755 qt-xxx.run),使用"./qt-xxx.run"進(jìn)行安裝,這里我安裝完畢后的目錄為"~/Qt5.14.2/5.14.2"。
git clone https://github.com/collin80/SavvyCAN.git sudo apt install libqt5serialbus5-dev libqt5serialport5-dev qtdeclarative5-dev qttools5-dev cdSavvyCAN ~/Qt5.14.2/5.14.2/gcc_64/bin/qmake make
安裝完畢后就可以使用"./savvyCAN"啟動(dòng)工具,啟動(dòng)后的頁面如下。我們需要先連接vcan0才能進(jìn)行下一步操作。點(diǎn)擊Connection然后點(diǎn)擊"open Connection Window"。
點(diǎn)擊"Add New Device Connection - QT SerialBus Device-socketcan-vcan0",然后點(diǎn)擊"Create New Connections",最后"Save Bus Settings"就創(chuàng)建好連接了。
savvyCAN工具部分功能與我們上面使用的can-utils工具相同,下圖為RE tools中的sniffer功能,與我們上面操作使用的cansniffer功能相同,但是savvyCAN中變化的數(shù)據(jù)使用了顏色進(jìn)行標(biāo)記,更便于我們辨識(shí)數(shù)據(jù)。
savvyCAN工具的重點(diǎn)即為fuzz功能,點(diǎn)擊"Send Frames-fuzzing"就會(huì)出現(xiàn)下圖中的fuzzing window,這個(gè)窗口中的功能適用于我們想要fuzz否個(gè)ID范圍,并且可以自定義fuzz的數(shù)據(jù)。
下圖中為我測試0x244 ID的fuzz效果,綠框部分為我們想要fuzz數(shù)據(jù)的位數(shù),這里我設(shè)置只fuzz最后倆個(gè)bytes的數(shù)據(jù),并且數(shù)據(jù)范圍為00-FF。ID Scanning為Random模式,這里可以設(shè)置seqential,效果更為明顯。
fuzzing功能對(duì)我們測試某個(gè)范圍的ID功能極有幫助,可以幫助我們快速辨別出id的功能。
總結(jié)
這一小節(jié),我們學(xué)習(xí)了使用ICSim模擬器模擬車輛,并且通過can-utils和savvyCAN工具對(duì)CAN總線進(jìn)行抓包和分析,初步了解了CAN的內(nèi)容。
蛇矛實(shí)驗(yàn)室成立于2020年,致力于安全研究、攻防解決方案、靶場對(duì)標(biāo)場景仿真復(fù)現(xiàn)及技戰(zhàn)法設(shè)計(jì)與輸出等相關(guān)方向。團(tuán)隊(duì)核心成員均由從事安全行業(yè)10余年經(jīng)驗(yàn)的安全專家組成,團(tuán)隊(duì)目前成員涉及紅藍(lán)對(duì)抗、滲透測試、逆向破解、病毒分析、工控安全以及免殺等相關(guān)領(lǐng)域。
審核編輯:湯梓紅
-
接口
+關(guān)注
關(guān)注
33文章
8713瀏覽量
152016 -
CAN
+關(guān)注
關(guān)注
57文章
2773瀏覽量
464465 -
總線協(xié)議
+關(guān)注
關(guān)注
0文章
117瀏覽量
14902
原文標(biāo)題:物聯(lián)網(wǎng)安全實(shí)戰(zhàn)從零開始-CAN總線協(xié)議初探
文章出處:【微信號(hào):蛇矛實(shí)驗(yàn)室,微信公眾號(hào):蛇矛實(shí)驗(yàn)室】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
基于FPGA的飛行模擬器通信接口設(shè)計(jì)
淺談CAN FD總線協(xié)議幀格式
![淺談<b class='flag-5'>CAN</b> FD<b class='flag-5'>總線</b><b class='flag-5'>協(xié)議</b>幀格式](https://file.elecfans.com/web2/M00/6F/F8/poYBAGNI66OAP6M_AAFVBqGIZJE331.png)
基于SAE J1939協(xié)議的發(fā)動(dòng)機(jī)總線數(shù)據(jù)模擬器開發(fā)設(shè)計(jì)
怎么設(shè)計(jì)多通道實(shí)時(shí)CAN總線模擬器?
CAN 的較高層協(xié)議和子協(xié)議
基于PC104總線的車載深度模擬器設(shè)計(jì)
![基于PC104<b class='flag-5'>總線</b>的車載深度<b class='flag-5'>模擬器</b>設(shè)計(jì)](https://file.elecfans.com/web2/M00/48/FD/pYYBAGKhtDGAA9OeAAAM6NjuWK8537.jpg)
多通道實(shí)時(shí)CAN模擬器設(shè)計(jì)方案
基于FPGA的多協(xié)議隔離總線信號(hào)模擬器設(shè)計(jì)
多通道實(shí)時(shí)CAN總線模擬器設(shè)計(jì)方案解析
![多通道實(shí)時(shí)<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>模擬器</b>設(shè)計(jì)方案解析](https://file.elecfans.com/web2/M00/49/6D/poYBAGKhwLGADDEoAAAz94p9J7Y937.png)
CAN總線協(xié)議是什么?CAN總線協(xié)議有哪些?CAN總線協(xié)議知識(shí)分析
![<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>協(xié)議</b>是什么?<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>協(xié)議</b>有哪些?<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>協(xié)議</b>知識(shí)分析](https://file.elecfans.com/web1/M00/65/0B/o4YBAFujioOAd6ZjAAANcEZ9kSs809.png)
認(rèn)識(shí)CAN總線錯(cuò)誤 CAN總線錯(cuò)誤分析與解決
![認(rèn)識(shí)<b class='flag-5'>CAN</b><b class='flag-5'>總線</b>錯(cuò)誤 <b class='flag-5'>CAN</b><b class='flag-5'>總線</b>錯(cuò)誤分析與解決](https://file1.elecfans.com/web2/M00/90/6C/wKgZomTZ1P6AOy1uAAAvKePs51U293.jpg)
評(píng)論