0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

CAN總線協(xié)議和ICSim模擬器的使用

蛇矛實驗室 ? 來源:蛇矛實驗室 ? 作者:c4se ? 2022-10-10 10:17 ? 次閱讀

本環(huán)境是蛇矛實驗室基于"火天網(wǎng)演攻防演訓(xùn)靶場"進行搭建,通過火天網(wǎng)演中的環(huán)境構(gòu)建模塊,可以靈活的對目標(biāo)網(wǎng)絡(luò)進行設(shè)計和配置,并且可以快速進行場景搭建和復(fù)現(xiàn)驗證工作。

關(guān)于CAN總線協(xié)議

CAN 是Controller Area Network 的縮寫(以下稱為CAN),是ISO國際標(biāo)準(zhǔn)化的串行通信協(xié)議。在汽車產(chǎn)業(yè)中,出于對安全性、舒適性、方便性、低功耗、低成本的要求,各種各樣的電子控制系統(tǒng)被開發(fā)了出來。由于這些系統(tǒng)之間通信所用的數(shù)據(jù)類型及對可靠性的要求不盡相同,由多條總線構(gòu)成的情況很多,線束的數(shù)量也隨之增加。為適應(yīng)“減少線束的數(shù)量”、“通過多個LAN,進行大量數(shù)據(jù)的高速通信”的需要,1986 年德國電氣商博世公司開發(fā)出面向汽車的CAN 通信協(xié)議。此后,CAN 通過ISO11898 及ISO11519 進行了標(biāo)準(zhǔn)化,在歐洲已是汽車網(wǎng)絡(luò)的標(biāo)準(zhǔn)協(xié)議。CAN 的高性能和可靠性已被認(rèn)同,并被廣泛地應(yīng)用于工業(yè)自動化、船舶、醫(yī)療設(shè)備、工業(yè)設(shè)備等方面?,F(xiàn)場總線是當(dāng)今自動化領(lǐng)域技術(shù)發(fā)展的熱點之一,被譽為自動化領(lǐng)域的計算機局域網(wǎng)。它的出現(xiàn)為分布式控制系統(tǒng)實現(xiàn)各節(jié)點之間實時、可靠的數(shù)據(jù)通信提供了強有力的技術(shù)支持。

ICSim模擬分析

在了解CAN之前,我們先來理解一下什么是ECU(Electronic Control Unit),早期分布式的電子電氣架構(gòu)下,每個 ECU 通常只負(fù)責(zé)控制一個單一的功能單元,彼此獨立,分別控制著發(fā)動機、剎車、車 門等部件。雖然現(xiàn)在ECU變得越來越復(fù)雜,但其基本部件不會改變,ECU 控制車輛的不同功能,現(xiàn)代汽車中有多達(dá) 70 個 ECU。如果這些ECU需要通信,那么就用到了CAN。在CAN總線出現(xiàn)之前,汽車制造商使用點對點布線,因此大多數(shù)部件都需要互相連接才能實現(xiàn)通信。如果汽車布線時出現(xiàn)故障,診斷會變得非常困難。CAN的出現(xiàn)使這種狀況變得簡單,CAN是一種總線協(xié)議,它允許微控制器(MCU)和ECU相互通信,并且它是一種基于消息的協(xié)議。通過單個 CAN 接口,ECU 可以通過集中式系統(tǒng)與每個之間進行通信,涉及更少的布線,并且數(shù)據(jù)通過數(shù)字信號而不是模擬信號傳輸,它使信號在傳輸過程中發(fā)生錯誤的概率減小。要訪問汽車的CAN總線進行調(diào)試,我們需要連接汽車的OBD接口(現(xiàn)在汽車都使用OBD-II接口),一般情況下,這個接口位于駕駛員座位的前方附近。下圖中為汽車的調(diào)試接口

想要通過OBD-II接口連接電腦進行操作,就需要用到USB轉(zhuǎn)CAN的工具,淘寶一般有賣。

我們學(xué)習(xí)vehicle安全的最便宜簡單的方法是使用汽車模擬器。我們可以使用 ICSim工具,很方便的了解和學(xué)習(xí) CAN 的內(nèi)容。由于本小節(jié)只是簡單介紹CAN和ICSim模擬器的使用,使初學(xué)者對CAN有初步了解,對CAN的詳細(xì)內(nèi)容并不會進行講解,如果大家有興趣可以去看<<智能汽車安全攻防大揭秘>>這本書。ICSim(Instrument Cluster Simulator),是由Open Garages推出的工具。它可以產(chǎn)生多個CAN信號,同時會產(chǎn)生許多背景噪聲,讓我們可以在沒有汽車或不改造汽車的情況下即可練習(xí)CAN總線的逆向技術(shù)。ICSim 包括一個帶有車速表、門鎖指示燈、轉(zhuǎn)向信號燈和控制面板的儀表板。模擬控制器允許用戶與模擬汽車網(wǎng)絡(luò)進行交互,應(yīng)用加速、剎車、控制門鎖和轉(zhuǎn)向信號。

安裝ICSim環(huán)境,需要首先安裝ICSim所需依賴庫:

sudo apt installlibsdl2-dev libsdl2-image-dev

要發(fā)送、接收和分析 CAN 包,我們需要 CAN 分析工具。Can-utils 是一組 Linux 實用程序,允許 Linux 與車載 CAN 網(wǎng)絡(luò)進行通信。Can-utils 包含 4個我們經(jīng)常使用的主要工具:

sudo apt install can-utils
#candump : 顯示、過濾和記錄CAN數(shù)據(jù)到文件。candump并不會解碼數(shù)據(jù)。
#canplayer : 對記錄的CAN數(shù)據(jù)進行重放。
#cansend : 發(fā)送CAN數(shù)據(jù)。
#cansniffer : 顯示CAN數(shù)據(jù)并高亮顯示變化的字節(jié)。

然后將ICSim下載下來

b6cc2020-47a1-11ed-a3b6-dac502259ad0.png

切換到ICSim目錄,執(zhí)行"make"命令,就可以編譯成功。編譯成功后,就可以使用"icsim van0"來模擬車輛,我們另起一個終端,使用"controls vcan0",這時出現(xiàn)儀表盤的窗口是模擬控制器,并且控制器中的速度表一直忽上忽下的跳到在0mph以上的位置,說明ICSim工作正常。

下面,我們可以使用如下鍵位來操作控制器

上方向鍵加速
向左方向鍵左轉(zhuǎn)
向右方向鍵右轉(zhuǎn)
右shift+A/X開左車門(前/后)
右shift+B/Y開右前車門(前/后)
左shift+A/X關(guān)左車門(前/后)
左shift+B/Y關(guān)右前車門(前/后)

b75d1a58-47a1-11ed-a3b6-dac502259ad0.png

運行后,我們可以使用ifconfig來查看網(wǎng)絡(luò)接口,發(fā)現(xiàn)會多出來一個vcan0的網(wǎng)絡(luò)接口。

b7816a2a-47a1-11ed-a3b6-dac502259ad0.png

我們可以使用"candump vcan0"來抓取CAN包裹流量,這時我們對控制器進行操作就會抓取相應(yīng)命令的流量。如下圖,左側(cè)可以看到抓取的流量直接打印到屏幕上,顯示流量時還是比較亂的。

b7c38626-47a1-11ed-a3b6-dac502259ad0.png

這時我們可以使用"candump -l vcan0",candump會自動將抓取的流量包放入candump-xxx.log文件中。

b811ceda-47a1-11ed-a3b6-dac502259ad0.png

想要停止抓取可以按"ctrl+c"。查看一下抓取流量包,第一列,括號內(nèi)的是時間戳,第二列中vcan0為我們的虛擬can接口。后面的是ID和數(shù)據(jù),ID和數(shù)據(jù)以#號分割。

b894fcec-47a1-11ed-a3b6-dac502259ad0.png

candump可以監(jiān)聽并記錄原始數(shù)據(jù),會有很多對我們無用的數(shù)據(jù)。can-utils工具包中還有一款可以根據(jù)仲裁ID進行分組顯示,并對變化的數(shù)據(jù)以紅色顯示,使我們比較容易分辨,它就是cansniffer。我們使用"cansniffer -c vcan0"命令來對vcan0進行監(jiān)聽。

b9b31a3c-47a1-11ed-a3b6-dac502259ad0.png

我們可以測試一下,當(dāng)我按下左方向鍵時,儀表盤開始出現(xiàn)左轉(zhuǎn)向的燈。同時左側(cè)的流量包開始變動,但是我不太好觀察到哪里出現(xiàn)了變化。

bd441d04-47a1-11ed-a3b6-dac502259ad0.png

這時,我們可以將ID這一列截圖固定在左側(cè),因為cansniffer已經(jīng)對ID做了分類,當(dāng)進行左轉(zhuǎn)向的操作,就可以觀察出哪里出現(xiàn)了變化。如下圖所示,當(dāng)我按下左轉(zhuǎn)向時,發(fā)現(xiàn)左側(cè)多出了一行,這一行為"188#01000000",那么這一條流量包大概率是對轉(zhuǎn)向進行操作的包裹。

bebbd564-47a1-11ed-a3b6-dac502259ad0.png

同理,我們繼續(xù)測試一下右轉(zhuǎn)向,發(fā)現(xiàn)左側(cè)多出一行,即為"188#02000000"。發(fā)現(xiàn)和左轉(zhuǎn)向僅僅相差1字節(jié),說明id為188很有可能是對轉(zhuǎn)向的控制命令。接下來,我們驗證一下。

bf164ca6-47a1-11ed-a3b6-dac502259ad0.png

cansend可以模擬發(fā)送包裹,cansend命令的使用為"cansend vcan0 ID#XXXXXXXX"。上面我們已經(jīng)觀察到188為轉(zhuǎn)向控制ID,我們發(fā)送一下sniffer的左轉(zhuǎn)包裹,發(fā)現(xiàn)確實儀表盤出現(xiàn)了左轉(zhuǎn),證明了我們188確實是左轉(zhuǎn)控制ID。

c003f26c-47a1-11ed-a3b6-dac502259ad0.png

同理,我們測試一下右轉(zhuǎn)。

c02313ae-47a1-11ed-a3b6-dac502259ad0.png

按照前面的思路,我們測試一下開車門的操作,步驟和上面相同。當(dāng)我按下"右shift+A"時,左前車門開啟,同時我們發(fā)現(xiàn)開左前車門的ID為19B,并且數(shù)據(jù)為"00000E000000"。

c04702dc-47a1-11ed-a3b6-dac502259ad0.png

同時,測試一下關(guān)閉左前車門時的命令包裹。發(fā)現(xiàn)為"19B#00000F000000"。

c185f7de-47a1-11ed-a3b6-dac502259ad0.png

使用"cansend vcan0 19B#00000E000000"命令發(fā)送開啟左前車門的包裹,發(fā)送完畢后發(fā)現(xiàn)儀表盤左前車門打開。

c2f4143e-47a1-11ed-a3b6-dac502259ad0.png

使用"cansend vcan0 19B#00000F000000"命令發(fā)送關(guān)閉左前車門指令,發(fā)送完畢后,車門關(guān)閉。證實了我們分析的車門開啟和關(guān)閉的指令。

c32d63f6-47a1-11ed-a3b6-dac502259ad0.png

測試加油的指令時,上面的操作也可以比較方便的分析出加油指令I(lǐng)D和數(shù)據(jù)。這里不在重復(fù)講解,上面的方法固然好用,但是也有不適用的時候,比如情況比較復(fù)雜,出現(xiàn)的ID變化或者較多。我們還有一種方法可以分析出對車輛的指令。我們首先使用"candump -l vcan0"進行流量抓取,抓取過程中進行加油門操作,然后松開油門,使其速度將為最低,最后停止抓取流量。

這樣一來,整個的過程就可以抓取到log文件中。我們使用重放的發(fā)送,發(fā)送這個log文件中的所有內(nèi)容。

c367111e-47a1-11ed-a3b6-dac502259ad0.png

命令如下,使用"canplayer -I candump-xxx.log"命令就會將抓取到的流量重新發(fā)送一邊。發(fā)送后可以觀察到我們上面加速和減速的整個過程,接下里我們就要使用二分法截取加速的部分。

c3847362-47a1-11ed-a3b6-dac502259ad0.png

使用二分法截取加速過程,例如這里我抓取的log文件有200000條數(shù)據(jù),我們先截取前1000000條數(shù)據(jù)進行重放。觀察是否只是加速過程,這里我發(fā)現(xiàn)有減速過程就繼續(xù)使用二分法。一直當(dāng)我截取到20000-40000條時,我發(fā)現(xiàn)只為加速過程。然后我們就可以進行下一步了。

c4952f62-47a1-11ed-a3b6-dac502259ad0.png

我們將log文件的時間戳去掉后,使用"cat xxx.log | sort | uniq -c | sort -n"命令來分類我們的流量包日志文件。這條命令的結(jié)果是去重后,按照ID出現(xiàn)的次數(shù)進行排序。一般情況下,一直加油時發(fā)出的指令都是單次的,并不會重復(fù)。按照這一現(xiàn)象,我們分類后,發(fā)現(xiàn)出現(xiàn)1次,并且ID相同并且遞增的命令就是加速指令。

如下圖所示,"244#0000001xxx"即為加速指令。我們重放后,可以觀察到加速現(xiàn)象。

c501205a-47a1-11ed-a3b6-dac502259ad0.png

同理,我們也可以測試開關(guān)車門的指令,比如我這里開了4次左前車門,關(guān)了3次左前車門(開門和關(guān)門次數(shù)不同時容易比較分析)。然后使用"cat xxx.log | sort | uniq -c | sort -n"命令進行分類,分類后可以簡單方便的查找車開關(guān)車門的指令。

c5537512-47a1-11ed-a3b6-dac502259ad0.png

Fuzzing

我們可以使用savvyCAN工具對can協(xié)議進行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"進行安裝,這里我安裝完畢后的目錄為"~/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

c688d4ae-47a1-11ed-a3b6-dac502259ad0.png

安裝完畢后就可以使用"./savvyCAN"啟動工具,啟動后的頁面如下。我們需要先連接vcan0才能進行下一步操作。點擊Connection然后點擊"open Connection Window"。

c7385974-47a1-11ed-a3b6-dac502259ad0.png

點擊"Add New Device Connection - QT SerialBus Device-socketcan-vcan0",然后點擊"Create New Connections",最后"Save Bus Settings"就創(chuàng)建好連接了。

c783fe6a-47a1-11ed-a3b6-dac502259ad0.png

savvyCAN工具部分功能與我們上面使用的can-utils工具相同,下圖為RE tools中的sniffer功能,與我們上面操作使用的cansniffer功能相同,但是savvyCAN中變化的數(shù)據(jù)使用了顏色進行標(biāo)記,更便于我們辨識數(shù)據(jù)。

c7ef1cea-47a1-11ed-a3b6-dac502259ad0.png

savvyCAN工具的重點即為fuzz功能,點擊"Send Frames-fuzzing"就會出現(xiàn)下圖中的fuzzing window,這個窗口中的功能適用于我們想要fuzz否個ID范圍,并且可以自定義fuzz的數(shù)據(jù)。

下圖中為我測試0x244 ID的fuzz效果,綠框部分為我們想要fuzz數(shù)據(jù)的位數(shù),這里我設(shè)置只fuzz最后倆個bytes的數(shù)據(jù),并且數(shù)據(jù)范圍為00-FF。ID Scanning為Random模式,這里可以設(shè)置seqential,效果更為明顯。

c8c564bc-47a1-11ed-a3b6-dac502259ad0.png

fuzzing功能對我們測試某個范圍的ID功能極有幫助,可以幫助我們快速辨別出id的功能。

總結(jié)

這一小節(jié),我們學(xué)習(xí)了使用ICSim模擬器模擬車輛,并且通過can-utils和savvyCAN工具對CAN總線進行抓包和分析,初步了解了CAN的內(nèi)容。

蛇矛實驗室成立于2020年,致力于安全研究、攻防解決方案、靶場對標(biāo)場景仿真復(fù)現(xiàn)及技戰(zhàn)法設(shè)計與輸出等相關(guān)方向。團隊核心成員均由從事安全行業(yè)10余年經(jīng)驗的安全專家組成,團隊目前成員涉及紅藍(lán)對抗、滲透測試、逆向破解、病毒分析、工控安全以及免殺等相關(guān)領(lǐng)域。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 接口
    +關(guān)注

    關(guān)注

    33

    文章

    8258

    瀏覽量

    149976
  • CAN
    CAN
    +關(guān)注

    關(guān)注

    57

    文章

    2663

    瀏覽量

    462469
  • 總線協(xié)議
    +關(guān)注

    關(guān)注

    0

    文章

    111

    瀏覽量

    14812

原文標(biāo)題:物聯(lián)網(wǎng)安全實戰(zhàn)從零開始-CAN總線協(xié)議初探

文章出處:【微信號:蛇矛實驗室,微信公眾號:蛇矛實驗室】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    基于FPGA的飛行模擬器通信接口設(shè)計

    文章根據(jù)飛行模擬器的結(jié)構(gòu)特點,分析了現(xiàn)場總線技術(shù)和FPGA技術(shù)的發(fā)展,根據(jù)飛行模擬器的實際需要和總線自身特點,選用了CAN
    發(fā)表于 05-15 11:12 ?2610次閱讀

    CAN總線協(xié)議知識科普

    本文說的CAN即是一種總線,也是一種協(xié)議。因此,我們常聽見CAN總線,也常聽見CAN
    發(fā)表于 09-15 12:47 ?3171次閱讀

    淺談CAN FD總線協(xié)議幀格式

    假期更新了一文搞懂CAN總線協(xié)議幀格式,CAN FD總線協(xié)議怎能錯過?本篇博文將講解
    發(fā)表于 10-14 12:49 ?3179次閱讀
    淺談<b class='flag-5'>CAN</b> FD<b class='flag-5'>總線</b><b class='flag-5'>協(xié)議</b>幀格式

    基于SAE J1939協(xié)議的發(fā)動機總線數(shù)據(jù)模擬器開發(fā)設(shè)計

    在車載網(wǎng)絡(luò)的開發(fā)過程中,需要發(fā)動機節(jié)點向總線網(wǎng)絡(luò)發(fā)送報文,為了降低成本,提高開發(fā)效率,模擬發(fā)動機?;赟AE J1939協(xié)議巾車輛應(yīng)用層子標(biāo)準(zhǔn)及應(yīng)用層診斷子標(biāo)準(zhǔn),通過軟件編程進行發(fā)動機總線
    發(fā)表于 07-12 06:33

    怎么設(shè)計多通道實時CAN總線模擬器?

    及實時響應(yīng)的場合,單通道CAN總線不能滿足實際通信的要求。那么,我們究竟該如何設(shè)計多通道實時CAN總線模擬器呢?
    發(fā)表于 08-13 07:44

    CAN 的較高層協(xié)議和協(xié)議

    CAN 的較高層協(xié)議和協(xié)議 本文主要介紹了幾個基于CAN 的較高層協(xié)議CAL/CANopen DeviceNet SDS 并且對這幾個較
    發(fā)表于 03-22 15:31 ?34次下載

    基于CAN的較高層協(xié)議和協(xié)議

    基于CAN的較高層協(xié)議和協(xié)議
    發(fā)表于 10-18 16:38 ?21次下載
    基于<b class='flag-5'>CAN</b>的較高層<b class='flag-5'>協(xié)議和</b>子<b class='flag-5'>協(xié)議</b>

    基于PC104總線的車載深度模擬器設(shè)計

    深度模擬器根據(jù)設(shè)定指令產(chǎn)生期望的壓力輸出,用來模擬水下航行在不同深度所承受的水壓。利用PC104 總線產(chǎn)品體積小、嵌入式的特點,研制基于PC104
    發(fā)表于 06-17 17:30 ?30次下載
    基于PC104<b class='flag-5'>總線</b>的車載深度<b class='flag-5'>模擬器</b>設(shè)計

    多通道實時CAN模擬器設(shè)計方案

    在大量數(shù)據(jù)通信處理中,高可靠性及實時響應(yīng)的場合,單通道CAN總線不能滿足實際通信的要求。為此,介紹一種基于多通道實時CAN模擬器的設(shè)計方案。
    發(fā)表于 09-08 15:25 ?2150次閱讀

    基于CAN的較高層協(xié)議和協(xié)議

    基于CAN的較高層協(xié)議和協(xié)議
    發(fā)表于 12-14 16:39 ?13次下載

    基于FPGA的多協(xié)議隔離總線信號模擬器設(shè)計

    基于FPGA的多協(xié)議隔離總線信號模擬器設(shè)計
    發(fā)表于 01-07 19:08 ?0次下載

    基于CAN總線的分布式飛機客艙模擬器控制系統(tǒng)_郭潔

    基于CAN總線的分布式飛機客艙模擬器控制系統(tǒng)_郭潔
    發(fā)表于 01-16 13:45 ?1次下載

    多通道實時CAN總線模擬器設(shè)計方案解析

    及實時響應(yīng)的場合,單通道CAN總線不能滿足實際通信的要求。為此,介紹一種基于多通道實時CAN模擬器的設(shè)計方案。 1 CAN
    發(fā)表于 11-30 11:05 ?22次下載
    多通道實時<b class='flag-5'>CAN</b><b class='flag-5'>總線</b><b class='flag-5'>模擬器</b>設(shè)計方案解析

    CAN總線協(xié)議是什么?CAN總線協(xié)議有哪些?CAN總線協(xié)議知識分析

    本文說的CAN即是一種總線,也是一種協(xié)議。因此,我們常聽見CAN總線,也常聽見CAN
    的頭像 發(fā)表于 10-03 19:53 ?7.4w次閱讀
    <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>知識分析

    認(rèn)識CAN總線錯誤 CAN總線錯誤分析與解決

    認(rèn)識CAN 總線錯誤的第一步就是了解認(rèn)識CAN 總線協(xié)議和它的具體功能,這樣才能更容易地理解CAN
    發(fā)表于 08-14 15:18 ?5223次閱讀
    認(rèn)識<b class='flag-5'>CAN</b><b class='flag-5'>總線</b>錯誤 <b class='flag-5'>CAN</b><b class='flag-5'>總線</b>錯誤分析與解決