为汽车信息娱乐系统生根的Bosch lcn2kai主机

2021-01-29 12:09:27

我的Nissan Xterra配备了(当时)现代化的主机,该主机具有触摸屏,内置导航,倒车摄像头显示,多媒体功能和智能手机连接。某些更高级的功能只能通过NissanConnect App使用,这需要注册和订阅。我从未使用过它,甚至不确定它是否仍受支持。

如果能够在设备上执行代码,甚至开发我们自己的扩展程序和应用程序,那不是很好吗?

我想看到的功能之一是一个简单的GPS数据记录器,该想法将作为反向工程和扎根工作的指导和目标。在本文中,我介绍了分析系统的方法,枚举可能的攻击面,通过物理访问获得外壳并利用其来开发不需要拆开仪表盘并产生干净根的漏洞通过SSH访问。

我将分享在您的车辆上重现此代码的代码,以及实现GPS数据记录目标的示例应用程序。但是,在这里您绝对找不到绕过任何DRM /版权机制的信息,尤其是与导航地图和任何在线服务有关的信息。此外,本文中的任何代码或说明均不附带任何保证,因此,请您自担风险。

有关如何扎根您的Nissan主机的快速指南,请遵循:Rootshell How-To

我想建立一个扩大的清单,其中列出了受我们滥用以获取根外壳访问权限的错误影响的主机和汽车品牌/型号/年份。到目前为止,该列表包括从2015年左右开始推出的众多日产车型,包括Xterra,Rogue,Sentra,Altima,Frontier以及其他一些日产商用车。鉴于所涉及的主机是由博世制造的,很可能在许多其他车辆中也可以找到相同的平台。

简而言之,如果您的耳机看起来与上面的照片相似,则此漏洞利用程序(或类似的变体)可能会起作用。

在内部(和部分在外部),Bosch和Nissan似乎将此主机版本称为lcn2kai,这就是我将在这些文档中解决的方式。如果有人碰巧知道它代表什么,我想知道。

最终,我希望无需使用螺丝刀就能在汽车上扎根。我并不陌生地将东西拆开,但是有一个奇怪的习惯,那就是在重新组装后最终得到多余的零件。这基本上将指导我首先要在哪里寻找漏洞。

从头看,它安装在汽车上时,通过扶手/控制台中的USB端口或通过蓝牙连接与外界进行交互。 USB端口用于通过USB闪存驱动器或智能手机提供其他多媒体内容,并且可以使用蓝牙连接与智能手机进行交互(播放音乐,免提通话,NissanConnect应用程序...)。理想情况下,我将寻找一个代码执行漏洞,该漏洞可以通过任意一种触发,因为它可以就地执行,而无需从仪表板上卸下主机。

一个“秘密”可以通过按并按住" App"按钮,然后旋转" TUNE"逆时针旋转几下,然后顺时针旋转,然后再次逆时针旋转。输入该作弊代码后,将打开一个新菜单,其中包含多个诊断选项,主机版本信息以及固件更新选项。

越狱和扎根其他汽车信息娱乐系统和音响装置的文章(例如关于越狱的Subaru Starlink的出色文章)一直特别关注固件升级,因为那是在系统暴露最严重的时候。

在随机的在线论坛上共享的lcn2kai固件更新版本有多种,以一种或另一种方式获得。自从销售以来,正在更新的主机部件尚未更新,与此版本相关的部件在所有版本中均保持不变。

固件更新是通过先插入包含固件更新映像的USB记忆棒,然后进入秘密菜单,选择更新/升级选项并按照说明进行的。启动升级过程后,系统将重启进入升级模式,对提供的固件升级文件进行彻底的密码验证,然后才继续进行复制/闪存/更新。

固件文件和软件包未加密,但已正确数字签名。固件升级的每个组成部分(内核,引导加载程序,Linux文件系统...)都通过标准的公钥加密算法进行了哈希处理和签名,整个方案看起来很可靠。我谨慎地希望避免破坏任何DRM,因此我决定继续使用书签,如果其他所有操作均失败,请返回此过程。

裸露的USB端口的预期用途是为那些长驱动器加载GB的MP3,通过智能手机播放Spotify最喜欢的内容或用作USB充电器。话虽如此,知道主机支持是否具有用于并支持任何其他设备的驱动程序会很有趣。通常的技巧是简单地插入键盘,希望它可以为您提供控制台访问权限。

检查根本是否支持键盘(如果基础系统是Linux)的一个简单技巧是发出Magic SysRq Key序列来尝试重新引导系统。这实际上在lcn2kai上确实有效,但是事实证明,键盘根本没有连接到控制台。因此,尽管内核确实处理SysRq密钥,否则它毫无用处。

我们可以尝试插入随机的USB设备,但是该列表通常相对较短。一种更自动化的方法是使用Facedancer和umap2。 Facedancer可以仿真不同的USB设备,因此可以简单地在不同的VID和PID值之间循环,以检测主机支持哪些设备。 Umap2带有一个名为umap2vsscan的脚本,该脚本可以执行以下操作:

这将扫描大量已知的VID和PID组合,并将打印出相应的设备(以及来自VID / PID的Linux驱动程序)。由于这可能需要一段时间,因此我们可以对列表进行过滤,以关注我们感兴趣的内容。我基本上对有两种类型的设备感兴趣,他们希望找到对它们的支持:一种可以通过udev或其他方式连接到串行控制台的TTL2USB适配器(例如FTDI串行电缆),或者是一种将有望自动配置,或通过DHCP获取地址。将umap2随附的列表编辑为仅包含这些内容,可以使我们拥有约1000台设备,这在合理的时间内是可以接受和执行的,请注意不要在等待此过程完成的情况下杀死汽车电池。

[ALWAYS]找到1个受支持的设备(共1098个):[ALWAYS]0。vid:pid 077b:2226,供应商:Linksys,产品:USB200M 100baseTX适配器,驱动程序:drivers / net / usb / asix_devices.c,信息:设备未达到设置的配置状态

这是个好消息。非常常见的USB以太网适配器使用驱动程序asix_devices.c。您当地的电子产品商店中有一个随机品牌的价格可能约为10美元。我找到了适合此目的的一个:

在购买之前,确保USB以太网适配器确实使用asix_devices驱动程序的一种方法是在制造商的网站上搜索Linux驱动程序。尽管几乎没有用,因为每个Linux安装都已经内置了它,但是您经常可以找到一个包含该设备使用的驱动程序的压缩包。

现在的问题是它是否会真正起作用。将USB以太网适配器插入汽车的USB端口,通过以太网电缆将其连接到笔记本电脑,然后观察LED指示灯是否点亮!设备似乎已初始化,但是没有DHCP请求。但是,使用Wireshark嗅探网络表明,某些东西正在发送来自IP 172.17.0.1的数据包。此外,它似乎正在将TCP SYN数据包发送到目标地址为172.17.0.5的端口7000。看起来lcn2kai希望将以太网连接的另一端分配为172.17.0.5,并且实际上使用此静态IP配置便携式计算机的以太网端口似乎可以正常工作。启动netcat监听端口7000,它将从lcn2kai获得连接,该连接将发送一堆二进制数据。稍后将揭示这是跟踪框架的一部分,可能用于在开发过程中帮助调试。

在这一点上,我希望找到某种服务器在某个端口上侦听,这可以作为一个很好的攻击点,但是没有运气。通过Nmap扫描设备后发现,除一个端口外,所有端口均被防火墙阻止。对于SSHd,该端口为22,但是即使它没有被防火墙阻止,也没有人在监听它。不过,这是个好消息。这意味着一旦启用SSH服务器,我们将有一种简单的方法来连接系统。

我探索了其他一些明显的攻击地点,希望能随机打击黄金。这些包括通过文件系统名称,电话蓝牙ID,驱动器上的特殊文件进行命令注入的各种尝试……这些都没有立即起作用。是时候获得一个测试设备并在内部进行深入研究,以尝试获得具有物理访问权限的外壳了。

您可以在eBay上轻松找到lcn2kai主机。如果它们是从撞毁的汽车上来的,或者缺少一两个按钮,那么您可以便宜地买到它们。那就是我所做的,几天后,这个出现在我家门口。

接通设备电源很简单。它需要12V的电压,最多最多需要1安培的电流,因此任何台式电源都可以正常工作。为了使装置通电,除了Vcc和GND之外,还必须将点火针连接到Vcc。

除了电源之外,我们还应该花些时间断开USB端口。如果幸运的话,您在eBay购买的产品可能已经带有线束。我没有。

将整个单元拆开后,我们可以看到重要的钻头在底侧,而钣金主体充当了一个大型散热器。

板上可以区分几组组件。我猜想左侧有一个STMicro FM / AM /音频IC,Maxim GPS中端和一个SiriusXM的Altera吗?主CPU是ARM,由NEC根据其外观制造。我找不到该产品的具体数据表,但稍后我们将能够收集更多信息。在主CPU旁边是两个未填充的标头。这两个的上部实际上在金属外壳的底部排列有一个覆盖孔,这表明它打算用某种调试头进行伪造并在开发期间使用。

板子的两边都没有有用的标签,但是这两个未填充的接头脚印可能是开始寻找UART的好地方。使用示波器,这很简单,只需用探针触摸电极板,然后重新启动设备电源,直到找到看起来像数据的东西。经过反复试验,这将快速识别串行控制台TX引脚(照片中的橙色)。弄清楚RX引脚不太明显,但是您可以做的是连接一个USB /串行适配器并编写一个脚本,将脚本喷出字符到其TX引脚。另一方面,一旦启动设备并且TX引脚看上去很安静,您只需将示波器探头保持在其上即可。现在,如果幸运的话,控制台上将显示回显,因此一旦您击中了正确的RX引脚,数据将再次开始在TX上显示。同样,通过反复试验(和持久性),人们也可以识别RX(照片中的蓝线)。下一步是猜测波特率,这只是尝试几个标准值(请记住先将USB串行适配器接地至正确的设备接地)。

Lcn2kai的控制台使用115200波特,将其连接并启动设备会向我们显示以下启动日志:

[0.009674] [0.009698] U-Boot 2010.03-00391-gf3b3496(2014年5月15日-16:53:57)用于NEC NEmid [0.009754] [0.009772](C)2009-2010 Robert Bosch汽车多媒体,CM-AI / PJ -CF32,Dirk Behme [0.009830] CPU:400MHz的MPCore [0.009866] U-Boot#1(env @ 0x40080000)[0.009904]开发板:基于NEmid的LCN2kai TSB4示例(1G)开发板[0.009954]开发板ID:0x3007(#1 )[0.011105] DRAM:1 GB [0.011185] PRAM已清除[0.011208]复位计数器已清除[0.011238]复位计数器的值为0 [0.011962]闪存:S-Die [0.012041]闪存:64 MB [0.012073] ***警告-错误的CRC,使用默认环境[0.012117] [0.012538]入:串行[0.012563]出:串行[0.012587]错误:串行[0.014028]已清除复位计数器[0.014063]已清除复位计数器[0.014509]网络:未找到以太网。[ 0.014592]按下任意键以停止自动引导:0 [0.017803] ##从Legacy Image引导内核在40920000 ... [0.017889]图像名称:triton_min_dualos [0.017926]图像类型:ARM RbcmRTOS内核图像(未压缩)[0.017987]数据大小:1294164乙ytes = 1.2 MB [0.018040]加载地址:80000000 [0.018074]入口点:80000290 [0.018140]正在加载内核映像... OK [0.050506] OK [0.050965] [0.050978]正在启动客户操作系统... [0.051045] ##正在启动来自Legacy Image的内核在40220000 ... [0.051146]图像名称:Linux-2.6.34.13-02018-g843e5c6 [0.051192]图像类型:ARM Linux内核图像(未压缩)[0.051253]数据大小:2076344字节= 2 MB [0.051306 ]加载地址:86000000 [0.051341]入口点:86000000 [0.051389]加载内核映像... OK [0.116345] OK [0.236196] [0.236213]启动内核... [0.236239]解压缩Linux ...完成,启动内核。

好吧,我们到了某个地方。我们可以从中发现很多有用的信息。首先,正如预期的那样,使用U-Boot引导系统。 NEC Nemid似乎是基础平台的名称。 CPU是400MHz的MPCore,尤其是双核。在启动操作系统时,发现很明显首先要启动RTOS,然后是Linux,这非常有趣。 RTOS的映像名称为triton_min_dualos,通过一些快速查询可以发现它基于T-Kernel或Tron,后者是一种受日本制造商欢迎的实时操作系统。

这种安排很有意义,一个RTOS处理诸如CANbus数据等对时间敏感的东西,一个常规OS(Linux)处理UI,网络,多媒体...

Warning: Can only detect less than 5000 characters