某款充电桩分析

    “这篇文章介绍了我们对Zaptec Pro充电桩进行分析的过程,Zaptec Pro充电桩是一种电动汽车充电桩”

    这篇文章展示了我们是如何测试这个设备的,包括我们在这个过程中的一些经历和过程。通过分析设备的固件,并编译自定义引导程序,我们能够root设备,并深入了解它是如何工作的。


介绍

    在过去的几年里,电动汽车已经变得非常普遍。在挪威,它们占所有新车销量的一半以上。电动汽车的充电桩已经成为我们日常生活所依赖的关键基础设施。与此同时,关于它们如何工作的信息有限。

    出于好奇,我们决定购买Zaptec Pro。该模型适用于大型网络安装,如停车场和公寓楼等。

设备概述

    充电桩是一个令人惊讶的强大设备。运行了一个基于Debian的操作系统,具有Wi-Fi,4G LTE,蓝牙。在幕后,Zaptec有一个完整的云系统,用来打开和关闭充电桩,并为电力消耗计费。Zaptec使用Azure IoT Hub与他们的设备进行通信和控制。

Teardown

该充电桩有两个PCB,堆叠在一起,并通过40针连接器连接。底部PCB包含大部分与电源相关的组件,而上部PCB包含“智能”组件。

某款充电桩分析

深入研究上层PCB,有几个感兴趣的组件:
  • 在绿色有压电蜂鸣器和RGB指示灯LED
  • 蓝色的是RFID组件
  • 黄色是4G调制解调器和天线
  • 橙子是高通公司的QCA7005芯片组,用于电力线(PLC)网络通信
  • 紫色区域是PIC24E微控制器
  • 从左至右红色部分是512 MB NAND闪存芯片、基于ARM Cortex-A7的微控制器和512 MB RAM。

某款充电桩分析

调试接口

    我们之前通过将设备连接到Wi-Fi网络并运行端口扫描了解到该设备运行Linux。它在端口22上有一个SSH。
    暴力破解不起作用,所以是时候在PCB上寻找调试接口了。这块板子的布局相当清晰,组件被分成了几个不同的部分。在板子上最有可能运行Linux的芯片是ARM处理器。它也位于闪存和RAM芯片旁边。
    由于它是一个ARM处理器,我们希望看到JTAG/SWD接口或UART串行端口。如果JTAG/SWD端口保持启用,理论上应该可以让我们转储固件并修改正在运行的代码。处理器在物理上具有所有这些引脚,并且可以通过查看CPU找到。然而,对BGA焊接是不可行的。因此,我们或多或少地要依靠设计者在PCB上公开的内容。尽管不难注意到一个未焊接的3引脚位于NAND闪存的左侧。

某款充电桩分析
接头有三个引脚,一个接地,所以它可能是:
  • 无(在生产固件中禁用)
  • ARM的串行线调试(SWD)
  • UART
我们焊接了一个接头,并将逻辑分析仪连接到引脚上,发现了一个串行接口。
某款充电桩分析

控制台日志提供了有用的设备信息,但不幸的是没有给我们提供一个shell。引导加载程序也被锁定,不允许中断启动过程,这阻止了我们在U-Boot环境中进行操作。

就在这时,我们意识到ARM处理器下面的那个小银色矩形几乎正好是一个microSD卡槽的尺寸。

某款充电桩分析

我们把一个SD卡插入插槽,然后重新启动了充电桩。但它没有启动。要么成砖了,要么充电桩试图将SD卡作为引导设备使用,而我们没有让它启动的东西。拔出SD卡并重新启动验证了我们的怀疑。

调查启动过程

    我们尝试使用基于相同处理器的各种开发板镜像来刷写SD卡,结果参差不齐。一些镜像成功启动,但不可避免地会在加载Linux内核之前在U-Boot中挂起。

这个问题最终归结为开发板和Zaptec PCB之间存在硬件差异,导致镜像不兼容。Zaptec可能使用了不同的内存,或者将各种组件连接到了不同的引脚上。

    U-Boot和Linux了解设备的硬件配置方式是通过设备树。这本质上是一个描述硬件(如RAM和闪存存储)的文件,以便操作系统知道如何与它们交互。通常,设计者会根据板子原理图来创建设备树。由于我们无法访问Zaptec的原理图,我们被迫寻找其他解决方案。

转储NAND闪存

    访问设备的固件总是很好的。它不仅可以提供有关设备如何工作的进一步信息,而且如果我们能够访问Zaptec设备树,它可以让我们编译自己的兼容引导程序或操作系统。
    我们成功地使用TL866II Plus编程器对TSOP 48 NAND芯片进行拆焊并转其内容。
某款充电桩分析

某款充电桩分析

某款充电桩分析

固件分析

编程器生成的二进制文件是NAND闪存的逐字节精确拷贝。这带来了一些挑战,因为我们想要分析的分区与其他数据混合在一起,比如纠错位和为了磨损平衡而保留的空间。这被称为外带(OOB)数据,由集成到ARM处理器中的NAND控制器引入。
某款充电桩分析
Damien Cauquil于2019年在HITB Amsterdam举行了一次演讲,详细介绍了这个过程如何在基于I.MX的处理器上工作。幸运的是,他发布了一个删除OOB数据的工具。它会产生一个二进制文件,类似于U-Boot或Linux与NAND闪存交互时所看到的。
某款充电桩分析

在固件中研究了一段时间后,我们成功地从启动分区中提取出了Zaptec的设备树二进制文件。

编译自定义引导程序

    我们考虑过构建能够从SD卡启动的Linux系统,但最终决定只编译U-Boot。如果我们重新焊接了NAND闪存,并且能够进入U-Boot环境,我们就可以控制传递给Linux内核的引导参数。这将允许我们进入单用户模式,这基本上只是让您直接进入根Shell而不提示输入密码。

    我们将设备树二进制文件包含在U-Boot构建过程中,并将引导加载程序烧录到了SD卡中。一旦进入我们的自定义U-Boot环境,我们设置了一些环境变量,告诉U-Boot从NAND闪存启动并进入单用户模式。

某款充电桩分析
一旦进入单用户模式,我们设置一个新的root密码,并在没有SD卡的情况下重新启动。现在我们可以通过WiFi使用我们的新root密码连接SSH了!
某款充电桩分析
现在有了对运行设备的root访问权限,我们想研究充电桩如何工作的。


蓝牙PIN码

该设备出厂时设置了一个四位数的PIN码。它印在盒子上,不能更改。它用于管理一些设置,例如充电桩如何连接到互联网。

某款充电桩分析


我们想回答的两个问题是:
  • PIN码是如何生成的?许多物联网设备从容易猜测的标识符(如序列号或MAC地址)生成安全代码。如果在这种情况下这是真的,也许我们可以管理任意设备。
  • 访问设备PIN码可以做什么?你能免费充电或启动比特币矿工的僵尸网络吗?
据我们所了解,PIN码似乎是在设备最初编程时从工厂服务器设置的。浏览设备上出现的第一批日志可以得出这个线索。

某款充电桩分析


由于PIN代码(和Azure访问令牌)是从工厂中的服务器提供的,因此我们无法很快访问生成这些秘密的代码。理想情况下,PIN应该是一个真正的随机数,而不是基于标识符或一些不可靠的密码。
这仍然引出了一个问题:如果你知道PIN码,你实际上能做些什么呢?在购买充电器之前,我们对Android应用进行了反编译,并对蓝牙低功耗(BLE)功能进行了调查。在Android应用程序的BLE特征列表中,“RunCommand”显然是一个有趣的选项。
某款充电桩分析

在Android应用程序的代码中进一步挖掘,发现了通过蓝牙开始和停止充电的命令。假设你有PIN码,也许你可以通过蓝牙发出这些命令来免费充电?

某款充电桩分析


现在,通过访问充电桩的代码,我们可以看到它实际上是做什么的。BLE接口是用Python编写的,这使得事情很容易浏览。

某款充电桩分析

基本上,在这里发送到BLE特征的任何值都会传递给smart_service.RunCommand()函数。smart service是在充电器上运行的另一个使用.NET mono编写的进程。Python通过D-Bus消息接口与smart service通信。让我们去看看RunCommand函数能做什么。

某款充电桩分析


.NET代码似乎只实现了Reboot和UpdateFirmware命令。StartCharging和StopChargingFinal命令看起来是在Android应用程序中部分实现的功能,但在充电器上从未实现。因此,通过蓝牙接口除了重新配置设备,可能导致其断开网络并停止工作外,似乎并没有太多可以做的事情。

值得注意的是,由于BLE的性质,当设备由技术人员配置时,可能会窃听到PIN码,但这需要有人在那个确切的时刻进行监听。Zaptec还在Python代码中实现了PIN码暴力破解保护机制。如果您多次输入错误的PIN码,蓝牙接口将关闭。蓝牙接口关闭的时间会随着每次错误的PIN尝试而增加。因此,您可以暴力破解PIN码,但这需要很长时间。从表面上看,对于攻击者来说,访问蓝牙接口似乎并不是非常有趣。


SSH监听器

将设备连接到网络后,我们要做的第一件事就是弄清楚是否有硬编码的root密码。
没有
Zaptec在充电桩上放置了两个公共SSH密钥,但shadow文件是空的,直到我们在单用户模式下自己配置了密码。

某款充电桩分析


云连接性

我们想要研究的最后一个点是云。我们在早期捕获了一些数据包,并知道充电桩正在与Azure IoT Hub通信,但无法看到它正在发送什么,因为流量是加密的。
通过root访问,我们能够安装自己的根证书,并通过mitmproxy对流量进行加密来执行TLS解密。

某款充电桩分析


通过分析解密的PCAP,我们可以验证充电桩是否使用共享访问签名与Azure IoT Hub进行通信,共享访问签名是一种身份验证机制,可以根据工厂提供的秘密获取凭据。
查看发布到IoT Hub的一些消息,可以发现它发送回Zaptec的数据类型。快速浏览一下可以发现一些东西,比如Linux内核日志和电力消耗数据。

某款充电桩分析


我们还看了一下.NET代码,看看它通过IoT Hub能够做的一切。我们无法轻松测试此功能是否有效,但我们确实发现了Zaptec远程调试设备的方法。
第一个是一个名为RunRemoteCommand的函数。这会将从云接收到的消息内容直接传递给Process.Start。

某款充电桩分析


第二个有趣的函数StartRemoteTunnel似乎允许Zaptec创建一个反向shell返回到互联网上的SSH侦听器。

某款充电桩分析


结论

    总而言之,我们在调查过程中没有发现任何严重的安全问题。尽管在一些方面可能还有改进的余地。例如,如果他们使用签名固件或加密NAND闪存,我们将更难获得对设备的root访问权限。这两个功能都得到了已经内置在充电桩中的ARM处理器的支持。

某款充电桩分析

某款充电桩分析


原文始发于微信公众号(安全脉脉):某款充电桩分析

版权声明:admin 发表于 2024年4月8日 下午5:53。
转载请注明:某款充电桩分析 | CTF导航

相关文章