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