机器中间人(MitM)BLE攻击
引言
延续我对智能锁攻击的持续研究(参见博客《逆向工程智能锁》),我决定将重点转向另一种攻击技术,即中继攻击。中继攻击是MitM攻击的一种形式,不要与更知名的重放攻击混淆。
MitM攻击通常涉及拦截两方之间的数据,以便在将数据转发给预期接收者之前查看/修改数据。MitM攻击包括控制两个不知情方之间的来回通信。双方认为他们在相互交谈,但实际上,对话由MitM攻击者代理。拦截的消息可以被攻击者修改或保持不变,具体取决于攻击者的意图。
与MitM攻击不同,重放攻击是一种攻击类型,攻击者捕获合法设备的无线通信,以便在所有者不在时重放它(通常未更改)。重放攻击的一个例子可能是攻击者捕获无钥匙遥控器的信号以打开门锁,以便在受害者不在家时重放它。
另一方面,中继攻击是MitM攻击的一种形式,攻击者秘密地将通信从一个合法设备中继到另一个合法设备,而发射器不知道超出了工程通信距离限制。这方面的一个例子可能是攻击者捕获附近钥匙卡的RF信号并将其转发给目标车辆附近的同伙以打开车门。这似乎是最近伦敦两名攻击者在30秒内偷走特斯拉Model S所使用的攻击类型。
https://www.pcmag.com/news/tesla-model-s-stolen-in-30-seconds-using-keyless-hack
概念验证
对于我的MitM研究,我选择继续使用KeyWe智能锁,因为我已经熟悉其操作和功能,并且该锁是当前市场上商业智能锁的典型代表。提醒一下,KeyWe智能锁由Guardtec制造,并使用蓝牙低功耗(BLE)与Android或iOS手机上的移动应用程序通信。它去年12月被F-Secure成功利用,最近又被我自己利用。因此,供应商已实施了一些步骤来减轻其暴露并 heavily 混淆了他们的代码。然而,这正是构建良好的MitM攻击真正闪耀的地方!很多时候,MitM攻击不关心固件或移动应用程序的内部工作原理,因为它们只是实时拦截两个合法设备的通信并传递(中继)未修改的信息。
对于此示例,我们的MitM中继攻击包括欺骗目标外围设备(在我们的案例中为KeyWe锁),以便让受害者的设备(手机)连接到我们的假外围设备。连接时,假外围设备将受害者的手机数据包中继到目标设备(锁),同时监视和捕获交换的流量。在此场景中,假外围设备和配套设备处理“来回”流量的中继,而受害者完全不知道会话被拦截。
硬件要求
- (2) Raspberry Pi 3B+
- (2) Kinivo BTD-400 蓝牙低功耗适配器
- KeyWe智能锁(或其他BLE智能设备,如August锁等)
软件要求
先决条件
- Noble: https://github.com/noble/noble
- Bleno: https://github.com/noble/bleno
- GATTACKER: https://github.com/securing/gattacker
- NodeJS(仅版本8.xx.x)
注意:使用最新版本的NodeJS时我遇到了许多问题,并发现最稳定的版本(关于Gattacker工具)是版本8.xx.x。
此外,我发现使用NVM(Node版本管理器)极大地有助于维护经常弃用的应用程序/工具之间的兼容性。
准备两个树莓派
- 创建新的raspbian(Buster)映像,使用balenaEtcher安装到两个SD卡
- 将空白SSH文件复制到SD卡的启动目录(以允许通过ssh进行无头操作)
- 将SD卡插入两个RPi并通电
- 在笔记本电脑上打开两个终端,每个Pi一个
- 确定每个RPi的IP地址(我创建了静态IP以便于使用)
- ssh pi@192.168.1.21(中央Pi)和 ssh pi@192.168.1.22(外围Pi)
- 确保您的RPi是最新的并安装了所有依赖项(推荐全新安装)
|
|
NodeJS
Nodejs是一个开源的、异步的“事件驱动”跨平台JavaScript运行时环境,用于构建网络应用程序。
安装节点版本管理器(nvm)
|
|
附加到bashrc文件末尾:
|
|
|
|
安装NodeJS(版本8.x.x)
|
|
|
|
添加路径到 ~/.profile:
|
|
验证正确的节点版本:
|
|
重要更新:似乎最新版本的raspbian(Buster)默认安装节点版本10.21.0作为root,不幸的是nvm(节点版本管理器)不与sudo命令一起工作。在详尽搜索解决方案后,我发现了一个替代的“节点版本管理器”称为“n”可以工作,并允许我将根节点版本从10.21.0更改为8.0.0。重要的是根和非根节点版本必须相同,因为需要在攻击后期执行基于sudo的命令(特定于BLE适配器的蓝牙硬件控制接口)。不正确的节点版本将在执行该sudo命令时抛出“节点版本不匹配”错误。
安装“n”(节点版本管理器)
|
|
安装后,n在环境变量N_PREFIX指定的目录的子目录n/versions中缓存节点版本,默认为/usr/local;活动节点版本直接安装在N_PREFIX中。
|
|
蓝牙依赖项
|
|
攻击概述
此中继攻击基础设施包括两个通过wifi连接的树莓派,并使用Gattacker(用于蓝牙低功耗安全评估的nodejs包)进行web-socket流量。左侧的中央Pi是web-socket从属(关于攻击向量),需要尽可能靠近目标(锁)。右侧的外围Pi是web-socket主(关于攻击向量),需要尽可能靠近受害者(手机)。注意:附加的RPi BLE适配器需要彼此充分分开以使攻击可靠工作(超出BLE的典型范围,或大约30米)。
GATTACKER模块配置
工作方式:
在中央Pi(RPi-1)上,我们运行命令“node ws-slave”,使RPi-1进入本地主机的监听模式。
在外围Pi(RPi-2)上,我们将执行所有节点命令,从命令#1“node scan”开始,提示中央Pi监听附近的所有BLE广告信标并将其记录到JSON文件。
从上面的屏幕截图中可以看出,中央Pi发现了几个BLE广告信标。设备#1将其mac地址(外围ID)广告为6F:64:C1:87:E8:E1,其地址类型为“random”,其可连接状态为“true”。
设备#2将其mac地址(外围ID)广告为6B:D7:78:E8:9b:66,其地址类型为“random”,其可连接状态为“true”。
另一个有趣的信息是“RSSI”(接收信号强度指示)。此值可用于指示我们离源有多近。数字越高(更正),我们离设备越近。
设备#3将其mac地址(外围ID)广告为8C:C8:F4:0F:4C:93,其地址类型为“public”,其可连接状态为“true”。设备#3的“RSSI”为-61,表明它可能比设备#1或#2更靠近中央Pi。
有趣的事实:从Android版本8(iOS版本14)开始,智能手机将隐藏其实际mac地址(默认情况下),以防止侦听器使用其实际mac地址构建设备活动历史和/或用于跟踪目的。他们隐藏mac地址的方式是通过生成随机mac地址来连接网络。通过查看mac地址的OUI(组织唯一标识符)部分的第二位数字,很容易确定mac地址是否是随机的。
如果第二位数字的位1(本地位)被设置,则它是一个随机地址。如果第二位数字是2、6、A或E,则它是一个随机化的Apple设备。(参见下图) https://www.nctatechnicalpapers.com/Paper/2019/2019-mac-randomization-in-mobile-devices/download
设备#3是我们的明显目标,方便地由“localName”:KeyWe指示。目标设备的地址类型为“public”。
现在我们找到了感兴趣的目标,我们停止扫描并在外围Pi上发出命令#2,即“node scan -o 8C:C8:F4:0F:4C:93”。这基本上告诉中央Pi根据其mac地址(在我们的案例中为8C:C8:F4:0F:4C:93)锁定指定设备,并探索所有GATT服务和特征。同样,此信息记录到“services”JSON文件中。
从上面的屏幕截图(特别是中央Pi)中,我们可以看到一些唯一通用ID(UUID)、句柄和属性(读、写、通知等),有助于促进传入和传出数据包。我们还可以看到GATT特征和描述符,这些是一些可用GATT服务独有的。此外,请注意发现的信息保存到“devices/8cc8f40f4c93.srv.json”。
此时,我们在外围Pi上发出命令#3,“sudo ./mac_adv -a devices/8cc8f40f4c93_KeyWe-8cc8f40f4c93.adv.json”,外围Pi将其BTD-400适配器mac地址更改为锁的地址,并开始以非常快的间隔(每20mS)进行广告,从而欺骗实际锁。
从上面的屏幕截图中,观察之前创建的两个JSON文件保存在gattacker/devices目录中。还要注意,外围Pi BTD-400 BLE适配器的地址在发出命令#3(sudo mac_adv)之前是5C:F3:70:9C:F1:91。执行命令#3后,我们需要重置适配器(“sudo hciconfig hci0 reset”)。我们现在可以看到BLE适配器的地址已更改为8C:C8:F4:0F:4C:93(我们的锁的地址)。
此时,我们的外围Pi现在欺骗锁的mac地址,并以每20mS的速率发送之前记录的锁的广告信标。中央Pi和外围Pi现在都已武装并准备好进行攻击(如“INITIALIZED”横幅所示)。外围Pi现在等待连接请求。
受害者在他/她的手机上打开移动应用程序。手机看到(欺骗的)锁的广告信标并连接到外围Pi。
连接后立即,来回通信被拦截、捕获并在手机和锁之间实时代理。整个会话,包括门的解锁,被拦截和记录,使受害者不知道他/她的会话已被泄露。
上面的屏幕截图显示了拦截的流量。中央Pi显示JSON调用,外围Pi显示实际的传入(写)和传出(读-通知)数据包数据。此屏幕截图仅代表连续滚动会话流量的一小部分。颜色编码为蓝色的数据包是传入(写)数据包,颜色编码为绿色的数据包是传出(读-通知)数据包。
总结
对我来说,这被证明是一个非常信息丰富且有趣的攻击选项。在我之前对此智能锁的攻击中,它需要数月的逆向工程,处理 heavily 混淆的代码和更新,编辑的安全评估工具以及弃用的Linux软件模块。这种MitM攻击,在克服初始软件和硬件准备后,几乎不需要时间来实现,并且不需要您了解安全协议或固件如何操作!
此外,最重要的是,此攻击平台可以移动到目标任何蓝牙低功耗设备,而无需对MitM硬件或软件进行任何更改!例如,如果我们想目标August智能锁、Yale智能锁或任何BLE智能设备,攻击平台已准备就绪!只需将您的中央Pi尽可能靠近目标设备,并将您的外围Pi靠近预期受害者的设备(手机、钥匙卡等)。启动树莓派,您就可以开始了。
最后,我想说我拥有此概念验证中使用的智能锁和智能手机。虽然我证明了它可以做到,但它确实需要我在手机上打开移动应用程序。在现实世界中,等待受害者回家并打开他/她的移动应用程序来解锁门仍然允许我们捕获会话,但不幸的是,如果不首先逆向移动应用程序,将不允许我们以后重放攻击。
然而,有许多商业可用的智能锁提供“自动解锁”功能,当所有者靠近锁时门将解锁。这是一个“便利功能”,严重削弱了锁的安全性,如果在移动应用程序中启用,可能容易受到这种MitM攻击。在这种情况下,将中央Pi靠近受害者的家并坐在星巴克对面受害者可能足以让手机连接到我们的外围Pi并解锁门,而无需实际打开移动应用程序。这是一个假设的例子,当然,将非常非法且强烈不推荐!
这是一个有趣的项目,创建此攻击平台非常便宜。两个树莓派和两个Kinivo BTD-400 BLE适配器的总成本低于100美元,非常值得投资。我强烈建议进行投资并在您自己的一个或多个个人蓝牙低功耗设备上试验此MitM攻击!