引言
最近我有机会研究知名安全公司F-Secure关于Guardtec KeyWe智能门锁漏洞的发现。F-Secure研究人员发现,由于设计缺陷,攻击者可以拦截并解密合法锁主的通信流量。他们的博客(发布于2019年12月)内容极其引人入胜且信息丰富。我很快受到激励,试图复现他们的研究成果。
尽管F-Secure奠定了基础,但他们谨慎地没有透露过多信息,甚至对部分工具进行了脱敏处理。在我的研究过程中,我不断回顾他们的博客,特别是在我自己发现新的相关信息时。本文旨在整合我的笔记、记录研究过程,并向他人介绍一些很酷的Android/iOS应用逆向工程工具和方法。
有用信息
KeyWe(门锁)与(移动)应用之间的通信通过蓝牙低功耗(BLE)数据包传输,这些数据包使用标准ECB AES-128密码加密以防止第三方窃听。消息通道的安全性完全基于三个用于加密和解密OTA(空中传输)AES-128数据包的密钥:
- 通用密钥(CommonKey):用于初始密钥交换
- 应用密钥(AppKey):用于加密从应用到门锁的数据包
- 门锁密钥(DoorKey):用于加密从门锁到应用的数据包
密钥生成
CommonKey完全基于一个静态的16字节值,该值简单地用设备蓝牙地址的最后5个字节枚举而成。
经过对多个KeyWe设备的进一步检查,所有检查设备之间唯一的区别是设备蓝牙地址的最后两个字节!这表明CommonKey是高度可预测的,并且完全基于每个设备的16字节静态值中的两个字节。
AppKey和DoorKey由两个算法(并经过严重混淆)方法makeAppKey
和makeDoorKey
创建。F-Secure人员创建了一个很好的工具,通过模拟这两个方法的操作来生成三个秘密密钥(尽管他们对工作进行了脱敏和混淆,使其基本无害)。然而,经过相当长的时间后,我能够使用一个方便的开源工具Frida(稍后详述)自己逆向工程这些方法的功能。
AppKey和DoorKey的创建包括向makeAppKey
和makeDoorKey
函数传递两个参数。这两个参数分别是AppNumber和DoorNumber。
AppNumber是一个静态(硬编码)的12字节值(用四个零字节填充):92 4b 03 5f bd a5 6a e5 ef 0e d0 5a 00 00 00 00
。注意:AppNumber用CommonKey加密,并作为用户会话的第一个数据包传输发送给门锁,从而启动会话。
DoorNumber是一个动态(每次新会话都会更改)的12字节值(用四个零字节填充),由门锁生成。该值(也用CommonKey加密)在接收到AppNumber后发送给应用。
注意:这两个“开场”传输(AppNumber和DoorNumber)完成了初始密钥交换过程,并允许创建AppKey和DoorKey,这将为应用和门锁之间的安全OTA通信提供保障。
应用流程图
现在我们已经生成并交换了AppKey和DoorKey,双方现在可以加密/解密发送或接收的数据包。所有由应用传输的数据包将使用AppKey加密,所有由门锁传输的数据包将使用DoorKey加密。双方都知道对方的加密方案,因此可以解密数据包。
下图演示了典型用户会话的事件顺序:
应该注意的是,所有这些数据包都在每个用户会话开始时OTA传输,并且这13个数据包都根据传输方向使用AppKey或DoorKey加密。
逆向Android APK
所有移动应用都以APK(Android应用包)文件形式下载。APK文件以ZIP格式保存,通常通过Google Play商店直接下载到Android设备,但也可以在其他网站上找到。在逆向工程Android APK时,我发现使用第三方网站搜索相关APK的旧版本通常很有帮助。我的最爱是https://apkpure.com/。
软件要求
- Java版本1.8.0_251
- ADB(Android调试桥)版本1.0.41
- APKStudio(Apktool的包装器)版本2.4.1
- Dex2Jar版本
- Jadx版本1.1.0
- Frida版本12.8.9
硬件要求
- 已Root的Android手机
典型的APK包含一些非常有用的内容,例如AndroidManifest.xml、classes.dex和resource.arsc文件;以及Meta-INF和res文件夹。有几种不同的方法可以打开PC上的APK。显然,因为它是一个ZIP文件,任何各种UNZIP提取器都可以正常工作,但是使用像Dex2Jar、Apktool和Jadx(仅举几例)这样的工具提供了额外的优势,例如将.dex文件转换为Java代码以提高可读性,以及GUI支持以便于导航代码。
DEX文件(Dalvik可执行文件)是用于初始化和执行Android移动平台应用的开发人员文件。像Apktool这样的工具可以将DEX(机器语言)文件反编译为Smali(汇编语言源)文件。我们还可以使用像dex2jar这样的工具将DEX文件转换为JAR(Java)文件,并使用jadx GUI将JAR文件作为Java源代码打开。Java源代码比Smali源代码更容易阅读。有许多选项可用于导航Android APK,包括我的最爱APKStudio。
由于有许多选项可用,描述实施这些工具中任何一个所涉及的各种步骤超出了本文的范围。我建议下载它们并尝试几种技术以找到最适合您的方法。网上有很多有用的教程。
使用Frida
F-Secure研究人员在他们的博客中表示,他们能够使用名为Frida的工具拦截Android应用中的函数调用。我之前不知道这个工具,所以决定检查一下。这个工具太神奇了!理解如何实施Frida超出了本文的范围。然而,可以说,Frida允许研究人员附加到应用程序中的现有函数,并动态转储参数和返回值。这绝对值得一看!https://frida.re/docs/home/
Frida w/toolkit安装
|
|
要求:
- frida-server和adb(Android调试桥)
- 用于调试APK的已Root Android手机(我用了旧的Samsung GS5)
在已Root手机上安装frida-server 要安装服务器,请导航到https://github.com/frida/frida/releases并下载适用于所用特定手机平台的相应文件。 (如果不确定手机的架构,请下载并运行Droid Hardware Info(来自Google Play商店))
初始设置:(在已Root手机上安装frida-server)
|
|
一旦frida-server安装在已Root手机上,按如下方式开始新会话:
|
|
最初,我在协调学习新工具(Frida)方面遇到了困难,同时还要承担寻找F-Secure人员在其博客中引用的相同函数调用的负担。由于F-Secure的公告,供应商严重混淆了最新版本,这意味着不再有“makeAppKey”或“makeDoorKey”函数可以附加。我还发现供应商加入了安全措施,以防止在已Root手机上运行KeyWe应用程序。F-Secure研究人员使用python和Frida javascript创建了一个很酷的工具,附加到有问题的