ChupaCarBrah-使用Beaglebone和Python进行汽车黑客攻击

2020-06-05 07:09:38

建立一个汽车黑客间谍设备,远程读取和发送CAN命令,跟踪GPS位置。所有这些都基于开源软件/硬件。

OBD II OBD2 16针分路器延长1X凸式和2X凹式延长电缆适配器。

Seed Grove通用4针转Beaglebone®蓝色4针母JST/SH转换电缆(10件装)。

在这个项目中,我使用Beaglebone Blue通过OBDII端口将其连接到车辆上的CAN总线。我展示了如何使用can-utils和python-can发送和接收CAN消息。我还将介绍如何将GPS模块和蜂窝调制解调器连接到Beaglebone,这样您就可以远程获取数据并将数据发送到移动中的汽车。我使用Python脚本收集GPS坐标并解码CAN消息(车速、引擎、RPM、温度等),然后将所有内容发送到在AWS上运行的简单Flask服务器。

我用塑料冲水装置盖板固定Beaglebone,用橡皮筋固定其他部分。我不得不在盖板的侧面钻了两个额外的洞,以与Beaglebone的洞相匹配。我建议使用彩色连接线。这里使用的颜色标准是:

Beaglebone引脚和CAN连接器如下所示。需要使用JST/SH连接器将连接线连接到Beaglebone罐槽。

将JST/SH连接器连接到Beaglebone Blue上的CAN插槽,如下所示。

将您的连接线连接到母接头。在我们的例子中,连接器有以下标准:黑色:接地;红色:不使用;黄色:CAN Hi;白色:CAN Lo。你的可能会不一样。

将黑色连接线的一端连接到直流桶形插孔适配器上的负极插槽中,但不要拧紧它。取另一根黑色连接线,并将其插入同一插槽中。把这两根黑线拧在一起。

将红色连接线连接到直流桶形插孔适配器上的正槽中。

直流桶形插孔适配器插入Beaglebone 12V输入插孔。OBDII将提供为Beaglebone通电所需的12V电压。

将连接线连接到凹式OBDII接头。您可能需要查看车辆手册,但通常OBDII的标准引脚是:

根据我们的连接线颜色代码约定,您需要将黑线连接到OBDII引脚5;将黄线连接到引脚6;将绿线连接到引脚14,将红线连接到引脚16。

在这一点上,您已经有了一个可以通过OBDII与您的汽车CAN总线进行交互的功能设备。如果这就是您要查找的全部内容,请跳到带CAN实用程序的CAN总线部分。

要构建完整的ChupaCarBrah设备,您仍然需要添加GPS模块、蜂窝调制解调器和电池。电池是可选的,但这是非常重要的情况下,您的汽车的电池耗尽,或OBDII电源断开(您将能够找到您的车辆,即使它的电池完全用完)。

将USB蜂窝调制解调器连接到Beaglebone上的USB端口。在将蜂窝调制解调器连接到Beaglebone之前,请确保您已将有效的SIM卡插入蜂窝调制解调器。

将Beaglebone连接到塑料板或任何其他您选择的绝缘材料上。

确保连接线固定在OBDII接头上。我也用了更多的橡皮筋。

现在您的硬件已经准备好了,让我们安装所有必要的软件,这样我们就可以开始玩CAN消息了。

打开Beaglebone并通过WiFi连接到它。我建议只在远距离使用蜂窝LTE网络,以便在您的数据计划上节省一些钱。确保您安装并更新了can-utils/socketCAN。运行以下命令:

root@Beaglebone:~#sudo ifconfig can0 can0:FLAGS=128nt;noarp>;mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueue elen 10(UNSPEC)RX数据包0字节0(0.0B)RX错误0丢弃0溢出0帧0 TX数据包0字节0(0.0B)TX错误0丢弃0溢出0载波0冲突0设备中断43。

如果您在第二行看到与<;NOARP>;类似的输出,则表示您的can0接口可用并已禁用。你想在把丘帕卡布拉接上车之前把它放下来。如果需要禁用它,请运行:

确认接口can0可用并禁用后,将ChupaCarBrah连接到您的汽车OBDII端口(也称为DLC-数据链路连接器)。具体位置请参考您的汽车手册,但它通常在靠近方向盘的仪表盘下面。

将ChupaCarBrah实际连接到您的汽车后,打开点火钥匙。你可能想要启动引擎,以防止耗尽你的汽车电池(不要犯我曾经犯过的错误)。设置波特率,在本例中为500Kbps,并打开can0接口:

root@Beaglebone:~#sudo ifconfig can0 can0:FLAGS=193;up,running,noarp>;mtu 16 unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00 txqueue elen 10(UNSPEC)RX数据包0字节0(0.0B)RX错误0丢弃0溢出0帧0 TX数据包0字节0(0.0B)TX错误0丢弃0溢出0载波0冲突0设备中断43。

如您所见,现在输出包含";<;up、runnig、NOARP&>&34;,这意味着您已经准备好发送一些CAN消息。打开另一个终端(ssh会话)并运行:

根据您的车辆,您可能会看到许多消息被捕获,类似于以下内容:

can0 418[8]50 FF 60 00 00 20 00 00 can0 412[6]1E 00 7A 00 8E 00 can0 2F1[8]00 00 79 00 00 00 can0 300[8]00 1B 80 89 9F FF 80 0A can0 248[8]00 08 00 09 00 00 41 01 can0 236[8]0F FF 10 00 F0 00 00 39 can0 328[8]00 00 80 00 D8 80 FF FF can0 330[8]0C FC FF。40 02 B0 40 01 1F FF 00 can0 309[7]1F FF 0F FF 00 can0 312[8]67 EF 07 EF 09 BF 07 92 can0 356[7]3F FF 3F FF 0B B8 00 can0 7BC[8]40 00 00 00 can0 218[8]8E 38 DD 42 00 00 00 can0 338[8]FF FF 00 FF FF 00 FF FF can0 315[7]28 00 00 00 8D 00 can0。

但是,对于某些车辆,包括我的车辆,ODBII CAN总线在默认情况下是安静的,并且只会对发送到总线的消息作出反应。如果这也是您的情况,您可以通过使用cansend命令发送一条检索车辆VIN号的消息来确认CAN正在工作。让坎通普在第二个终端上运行,然后返回到第一个终端。然后运行:

在运行";Candump";的终端上,您应该能够看到与以下内容类似的请求和响应:

root@Beaglebone:~#can0 can0 7DF[8]02 09 02 00 00 00 can07 E8[8]10 14 49 02 01 32 43 34 can0 484[8]03 7F 09 11 00 00 00。

第二行上的响应";7E8";将最后3个字节设置为32 43 34。如果我们将它从十六进制解码为ASCII,我们得到的是";2C4";,这是我的车辆VIN的实际前3位数字。

为获取车辆识别码而发送的消息是";7df#0209020000000000";。7DF是CAN仲裁ID(您希望使用这样的大数字进行测试,因为数字越高优先级越低)。";0209020000000000";是数据字段:

第一个";02";字节表示只有数据字段中接下来的两个字节是命令的一部分。剩余的";00";字节全部被忽略;

现在您已经确认can-utils工作正常,让我们使用Python发送更多命令。首先,确保安装了python-can pip模块:

然后,运行get_vin.py来检索您的汽车的VIN。以下是get_vin.py的Python代码:

导入CAN总线=can.interface.Bus(bustype=';socketcan';,通道=';can0';,比特率=500000)SERVICE_INT=9 PID_INT=2 msg=can.Message(仲裁_id=0x7DF,Data=[2,SERVICE_INT,PID_INT,0,0,0,0,0],IS_EXTENDED_ID=FALSE)尝试:bus.send(Msg)Response=bus.recv(超时=2)打印(响应),除can.CanError:Print(&#。)最后:bus.shutdown()。

您可以随意更改";service_int";和";pid_int";的值,并测试OBDII PID文档中的其他命令。

root@beaglebone:~#tio/dev/ttyO2-b4800[tio 17:04:53]tio v1.32[tio 17:04:53]按ctrl-t q退出[tio 17:04:53]已连接的$gpgga,170454.000,3500.87097,N,10641.14163,W,1,0,1.1,204.3,M,-34.0,M,0000*69$gpsa,A,3,30,07,111W,0.00,171.40,100520,A*79$GPGGA,170455.000,3500.87097,N,10641.14163,W,1,08,1.1,204.3,M,-34.0,M,,0000*68$GPGSA,A,3,30,07,11,28,01,0,17,13,2.2,1.1,2.0*33$GPGSV,3,1,12,30,74,271,37,07,62,163,35,11,51,074,37,28,46,294,18*74$GPGSV,3,2,12,01,41,120,31,08,30,049,31,17,26,226,27,13,23,302,28*73$GPGSV,3,3,12,15,04,323,14,23,16,208,19,,A*78$GPGGA,170456.000,3500.87097,N,10641.14163,W,1,08,1.1,204.3,M,-34.0,M,0000*6B$GPGSA,A,3,30,07,11,28,01,0,17,13,2.2,1.1,2.0*33$GPRMC,170456.000,A,3500.87097,N,10641.14163,W,0.00171.40,100520,A*7B[TIO 17:04:56]已断开连接。

按";ctrl-t q&34;可退出。您的位置将在GPRMC&34;句子中提供。例如,复制句子";$gprmc,170454.000,A,3500.87097,N,10641.14163,W,0.00,171.40,100520,A*79";并使用在线解码器进行解码:https://rl.se/gprmc

现在,让我们用Python做同样的事情。确保您已安装pySerial模块:

然后,运行get_gps_data.py来检索您的汽车的位置。以下是get_gps_data.py的Python代码:

导入时间导入串行GPS_DATA=";";UTF_DATA=";";";UTF_DATA=seral.Serial(';/dev/ttyO2';,4800)计数器=0,而utf_data.find(";GPRMC";)==-1:计数器+=1尝试:Ser_Data=ser.readline()utf_data=ser_data.decode()除外:UTF_DATA。time.睡眠(0.5)if计数器>;50:Break ser.close()if utf_data.find(";gprmc";)!=-1:utf_data=utf_data.place(';\r';,';';)utf_data=utf_data.place(';\n';,';';)gps_data=utf_data print(。

下一步是创建蜂窝LTE数据链路,这样即使汽车不在我们的WiFi网络范围内,您也可以访问GPS和CAN数据。

在本教程中,我使用USB Hologram.io蜂窝调制解调器。您可以随意使用其他选项。我将使用PPP连接,这样Python客户端就可以将数据发送到AWS上运行的服务器应用程序。请确保您安装了PPP,然后安装全息图-python:

您还需要订阅数据套餐并激活您的SIM卡。请参考官方全息图文档来准备好您的卡。

激活卡后,确保蓝色LED亮起,并且调制解调器上的红色LED闪烁。

为了测试互联网连接,您可以使用单个ICMP请求ping Google:

如果你得到回应,这意味着ChupaCarBrah连接到了蜂窝网络,它应该能够在LTE覆盖范围内的任何地方(几乎在美国的任何地方)渗透你驾驶的任何地方的汽车数据。

现在,让我们看看如何使用Python连接和断开全息图蜂窝网络。运行cell_test.py脚本检查您的LTE数据与互联网的连接。以下是示例脚本cell_test.py的Python代码:

从全息图导入psutil导入时间导入子流程。CustomCloud导入CustomCloud def全息图_NETWORK_CONNECT():全息图_NETWORK_DISCONNECT()时间。睡眠(2)CLOUD=CustomCloud(无,网络=蜂窝';)cloud.network.Disable_at_Sockets_mode()res=cloud.network.connect()message=";";if res:message=";PPP Session Started"。print(Message)def HERFERRAMP_NETWORK_DISCONNECT():为psutil.process_iter()中的进程打印(';检查现有的PPP会话';):try:pinfo=proc.as_dict(attrs=[';PID';,';name';])例外:如果';pppd';在以下情况下打印(";无法检查现有的PPP会话";),则尝试:pinfo=proc.as_dict(attrs=[';PID';,';name';])。]:print(';在PID上找到现有的PPP会话:%s';%pinfo[';PID';])print(';立即终止PID%s;%pinfo[';PID&39;])process=psutil.process(pinfo[';PID';])process.Terminate()process.Wait()HERHAMRAM_NETWORK_CONNECT()time.睡眠(2)PING_RESPONSE=sub.。/bin/ping";,";-C1";,";-w100";,";www.google.com";],stdout=subprocess.PIPE).stdout.read()print(ping_response se.decode())time.Sleep(2)全息图_网络_断开连接()。

root@Beaglebone:~#sudo python3 cell_test.py检查现有PPP会话PPP会话开始ping www.google.com(216.58.201.228)56(84)字节的数据。来自par10s33-in-f4.1e100.net的64字节(216.58.201.228):icmp_seq=1 ttl=49 time=420ms-www.google.com ping统计数据-1个数据包已传输,1个已接收,0%数据包丢失,时间0ms RTT min/avg/max/mdev=420.049/420.049/420.049/0.000 ms检查现有ppp会话发现PID:1559上的现有ppp会话,现在正在终止PID 1559。

现在您已经知道了如何使用Python发送和接收CAN消息、获取GPS位置以及连接到蜂窝网络;让我们把它们放在一起,创建一个极其简单的客户端和服务器应用程序来渗漏所有数据。

我给您带来了两个非常简单的Python脚本,它们可以作为构建更复杂的汽车黑客应用程序的框架。客户端脚本基本上是我到目前为止介绍的所有样例Python脚本的组合。它将在Beaglebone Blue上运行。服务器脚本是将在AWS(弹性豆茎)上运行的Bare Simple Flask应用程序,并将使用JSON格式存储和显示所有提取的数据。

可以在此处找到chupacarbrah.py客户端脚本。使用以下git命令将其克隆到Beaglebone:

客户端脚本从变量";OBD2_CSV_FILE";定义的CSV文件中读取要执行的OBDII PID命令列表。然后解析命令以创建CAN消息。CSV文件格式包括一个";Enabled";列,允许您启用(设置为1)或禁用(设置为0)要执行的特定OBDII PID。默认情况下,该脚本使用具有以下命令子集的simple.csv文件:

文件OBD2_STD_PID_enabled.csv包含要启用/禁用的所有可用的OBDII PID命令。在启用额外命令之前,请确保您了解这些命令的作用,并了解您正在执行的操作。

chupacarbrah.py客户端脚本将使用CSV文件中的OBDII PID公式解码所有响应,并将数据与GPS坐标一起发布到AWS上的Flask应用程序。确保在变量server_url";上定义服务器URL。我们将很快介绍如何将服务器脚本部署到AWS以及如何获取服务器URL。

它将显示从CAN响应消息解码的当前数据,并每隔1分钟将所有内容发送到服务器。

可以在此处找到chupacarbrah_server.py脚本。它将公开两个端点,以便您可以发送和获取渗出的数据:

客户端脚本将使用";post/api/v1/car";端点提交所有数据。然后,您可以使用";get/api/v1/status";从您的Web浏览器舒适地监控JSON数据。

让我们设置一个简单的本地Flask应用程序,并在这两个端点上运行一些快速测试。在本教程的后面部分,我将展示如何将这个相同的本地应用程序部署到AWS。

(Virt)acchetin@Sacchetins-macbook-Air EB-flask%python3 application ation.py*Serving Flask app";application";(惰性加载)*环境:生产警告:请勿在生产环境中使用开发服务器。改为使用生产WSGI服务器。*调试模式:OFF*在http://127.0.0.1:5000/上运行(按Ctrl+C退出)。

发送一些虚拟数据以确保一切正常。打开新终端,使用cURL发送一些数据:

本地服务器将使用CAR_UUID进行回复,在本例中为:";51f317ec266e4adb956212201f87ba52";。打开浏览器(优先打开Firefox,因为它本地解析JSON)并访问http://localhost:5000/api/v1/status。

如果您能够看到您刚刚用cURL发布的虚拟数据,这意味着您的Flask应用程序已经准备好部署到AWS。

首先,您需要在AWS上创建一个帐户,并在您的计算机上安装AWS客户端。请在此处创建您的AWS帐户。所述部署应用程序的步骤基于此处提供的官方AWS文档。

确保您可以登录到AWS控制台。然后,安装AWS客户端:

可选,但强烈建议您:再次运行EB init以配置默认密钥对,以便可以连接到使用SSH运行应用程序的EC2实例:

是否要为您的实例设置SSH?(y/n):y选择密钥对。1)my-keypair 2)[新建KeyPair]。

创建环境大约需要5分钟。环境创建过程完成后,以EB OPEN打开您的网站:

它将打开Web浏览器并自动加载您的新服务的URL。复制URL,返回到Beaglebone,编辑客户端脚本chupacarbrah.py,并将变量更改为您的AWS应用程序的实际URL。使用My Deployment示例,";server_url";的值应设置为:

您的URL会有所不同,但格式应该相似。重新启动Beaglebone上的chupacarbrah.py,从现在开始,它将开始向AWS发送数据。

您也可以将一些虚拟数据发送到您的AWS应用程序进行测试。重复";post/api/v1/car";curl请求,将localhost:5000替换为您设置的变量";server_url";的值。例如:

打开火狐浏览器,再次访问http://chupacarbrah-env.eba-bdahj3wp.us-east-2.elasticbeanstalk.com/。您应该会看到您从ChupaCarBrah设备发送的所有虚拟数据以及所有渗出的数据。

我目前正在写一系列关于汽车黑客的网络安全报告。请继续关注我的中等页面,了解更多关于您今天刚刚构建的ChupaCarBrah设备所能做的一切。

多读