中间人(MitM)蓝牙低能耗攻击实战解析

本文详细介绍了针对KeyWe智能锁的蓝牙低能耗中间人攻击技术,包括硬件配置、软件依赖、攻击步骤及流量拦截过程,展示了如何利用树莓派和Gattacker工具实现实时通信中继。

中间人(MitM)BLE攻击

Ray Felch //

引言

延续我对智能锁攻击的研究(参见博客《逆向工程智能锁》),我决定将重点转向另一种攻击技术,即中继攻击。中继攻击是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 obfuscated 了他们的代码。然而,这正是构建良好的MitM攻击真正闪耀的地方!很多时候,MitM攻击不关心固件或移动应用程序的内部工作原理,因为它们只是实时拦截两个合法设备的通信并传递(中继)未修改的信息。

对于这个例子,我们的MitM中继攻击包括欺骗目标外围设备(在我们的例子中是KeyWe锁),以便让受害者的设备(手机)连接到我们的假外围设备。连接时,假外围设备将受害者的手机数据包中继到目标设备(锁),同时监控和捕获交换的流量。在这种情况下,假外围设备和配套设备处理“来回”流量的中继,而受害者完全不知道会话被拦截。

硬件要求

  • (2) Raspberry Pi 3B+
  • (2) Kinivo BTD-400 蓝牙低能耗适配器
  • KeyWe智能锁(或其他BLE智能设备,如August Lock等)

软件要求

先决条件

注意:使用最新版本的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.101(中央Pi)和 ssh pi@192.168.1.102(外围Pi)
  • 确保您的RPi是最新的,并安装了所有依赖项(推荐全新安装)
1
2
3
$ sudo apt update
$ sudo apt dist-upgrade -y
$ sudo apt install python-dev build-essential curl git mc -y

NodeJS

Nodejs是一个开源的、异步的“事件驱动”跨平台JavaScript运行时环境,用于构建网络应用程序。

安装节点版本管理器(nvm)

1
2
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.36.0/install.sh | bash
nano ~/.bashrc

附加到bashrc文件末尾:

1
2
3
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # 这加载nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # 这加载nvm bash_com
1
2
$ source ~/.bashrc
$ nvm -v  (验证版本 - 应为0.35.3或更高)

安装NodeJS(版本8.x.x)

1
$ nvm install 8.0.0    (注意:我的攻击使用了8.17.0,但8.0.0应该可以,尽管未验证)
1
2
$ which node    (获取节点路径)
/home/pi/.nvm/versions/node/v8.0.0/bin/node

添加路径到 ~/.profile:

1
2
# nodejs路径
export PATH=/home/pi/.nvm/versions/node/v8.0.0/bin/node:$PATH

验证正确的节点版本:

1
2
$ node -v     (验证节点版本是8.0.0)
$ sudo node -v    (验证节点版本是8.0.0 - 添加以帮助防止“节点版本不正确”错误条件)

重要更新:最新版本的raspbian(Buster)默认安装节点版本10.21.0作为root,不幸的是nvm(节点版本管理器)不与sudo命令一起工作。经过详尽搜索解决方案,我发现了一个替代的“节点版本管理器”称为“n”可以工作,并允许我将root节点版本从10.21.0更改为8.0.0。由于稍后在攻击中需要执行基于sudo的命令(特定于BLE适配器的蓝牙硬件控制接口),root和非root节点版本必须相同。不正确的节点版本将在执行该sudo命令时抛出“节点版本不匹配”错误。

安装“n”(节点版本管理器)

1
$ npm install -g n  

安装后,n在环境变量N_PREFIX指定的目录的子目录n/versions中缓存节点版本,默认为/usr/local;并且活动节点版本直接安装在N_PREFIX中。

1
2
3
4
5
6
7
8
9
# 创建缓存文件夹(如果缺失)并取得所有权
sudo mkdir -p /usr/local/n
sudo chown -R $(whoami) /usr/local/n

# 取得节点安装目标文件夹的所有权
sudo chown -R $(whoami) /usr/local/bin /usr/local/lib /usr/local/include /usr/local/share

# “n”节点版本管理器现已安装并配置
n 8.0.0    (这将按要求将root节点版本更改为8.0.0)

蓝牙依赖项

1
2
3
4
5
$ sudo apt install bluetooth bluez libbluetooth-dev libudev-dev -y

$ npm install noble        (中央nodejs模块)
$ npm install bleno        (外围nodejs模块)
$ npm install gattacker    (用于MitM攻击的蓝牙BLE安全评估工具)

攻击概述

这种中继攻击基础设施由两个通过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。

连接后立即,来回通信被拦截、捕获并在手机和锁之间实时代理。整个会话,包括门的解锁,被拦截和记录,使受害者 unaware 他/她的会话已被泄露。

上面的屏幕截图显示了拦截的流量。中央Pi显示JSON调用,外围Pi显示实际的传入(写)和传出(读-通知)数据包数据。此屏幕截图仅代表连续滚动会话流量的一小部分。颜色编码为蓝色的数据包是传入(写)数据包,颜色编码为绿色的数据包是传出(读-通知)数据包。

总结

对我来说,这被证明是一个非常 informative 和有趣的攻击选项。在我之前对这种智能锁的攻击中,它需要数月的逆向工程,处理 heavily obfuscated 的代码和更新,redacted 安全评估工具,以及弃用的Linux软件模块。这种MitM攻击,在克服最初的软件和硬件准备之后,几乎不需要时间来实现,并且不需要您了解任何有关安全协议或固件如何操作的信息!

此外,最重要的是,这种攻击平台可以移动到目标任何蓝牙低能耗设备,而无需对MitM硬件或软件进行任何更改!例如,如果我们想目标August智能锁、Yale智能锁或任何BLE智能设备,攻击平台已准备就绪!只需将您的中央Pi尽可能靠近目标设备,并将您的外围Pi靠近预期受害者的设备(手机、钥匙扣等)。启动树莓派,您就可以开始了。

最后,我想说

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计