T-mobile开创了智能手机嵌入原生无缝支持WiFi调用的技术。这种集成WiFi调用功能的技术与当今大部分智能手机供应商所采用的方案一样。T-mobile在2016年5月于德国首次引入VoWiFi,你可以让语言通话在LTE与WiFi网络直接无缝切换。
本文将会对VoWiFi相关的安全性进行分析。在此之前如果你对电信网络协议不够熟悉,可能会对文中大量使用的缩写感到迷茫,对此我十分抱歉。但是请相信我,在未来的日子里你肯定会去适应它。
在开始分析之前,我想有必要提示大家一些重要信息。我们的主要目标接口是用户客户端与 IP多媒体子系统 (IMS)服务器之间的接口。需要观察的有epdg1(虚拟接口)以及wlan0(真实无线接口),我们使用Samsung S6 gadget以及一张电信(德国)SIM卡进行分析。大多数IPSec使用 ISAKMP [3]协议利用 EAP-AKA [5]作为 IKEv2 的一部分,同时我们使用 SIMtrace [2]通过嗅探SIM卡与手机之间的流量提取会话密钥。
我们的分析发现了一些有趣的东西,例如呼叫者的IMEI被泄露,私有IP,IMS服务器版本以及供应商名称等信息被披露。这是通过嗅探虚拟接口epdg1获得的信息,它包含了 SIP服务器 — 用户客户端内的信号流量。虚拟接口epdg1以 ESP 数据包封装在IPSec。此时此刻,这些都还没有进行加密。当这些数据通过wlan0接口发送到服务器之后才使用 IPSec 进行加密。我们仍然在尝试解密wlan0加密数据包的过程以祈求能有更多精彩的发现。但在深入细节之前,让我们携手一起了解一些背景知识。
Voice over Wi-Fi (VoWiFi)顾名思义即通过WiFi网络提供的语音业务。用户可以在无移动信号的条件下拨打电话,VoWiFi是Voice over LTE (VoLTE)的互补技术。两者都利用IP多媒体子系统(IMS)技术将语言流量转换成IP数据包。
在IKEv2协议流中,有两个主要阶段。主要是为ESP(封装安全协议)或者AH(认证头协议)完成建立SA安全联盟(SA,security association),两者皆属于IPSec协议。
第一阶段,包含的IKE_SA_INIT用以处理下一阶段会用到的4个主要参数。加密算法,身份验证算法(完整性检查),伪随机函数(PRF)以及迪菲-赫尔曼密钥交换(Diffie Helman group)。基于密钥交换参数以及迪菲-赫尔曼密钥交换(DH key exchange)在下一个阶段会出现一个加密的流量。在这个加密流量中,存在实际的加密参数以及安全联盟的ESP或者AH。这样意味着你可以在使用IKEv2建立SA安全联盟之后,快速找到ESP数据包(或者AH)。
第二阶段[6]
下面这张图表简单的解释了EAP-AKA身份验证。Peer为用户客户端以及身份验证服务器。在此不对Server name或者协议流进行深入讲解,这里包括代理以及身份验证服务器等等。在此我们把它们统一叫做服务器。这对我们了解服务器之间所发生的信息没有影响。
在Peer与身份验证器之间有一个初始化身份交换。身份验证器运行AKA(Authentication and Key Agreement,认证和密钥协议)算法,生成一个会话密钥。基于这个会话密钥,服务器会生成AUTN和RAND值,这两个值会发送给Peer。
AUTN用于服务器进行身份验证,RAND是一个随机挑战。这可以理解为服务器发送一道谜题给Peer进行解决。Peer执行相同的AKA算法验证AUTN,基于发送的RAND获取会话密钥,之后发送一个响应值以及RES。因此服务器可以完成对Peer的验证。如果RES与预期的值相匹配,就会返回一个EAP成功信息。在身份验证过程中该会话密钥没有被传播。
EAP AKA完整身份验证过程,RFC 4187.
现在为了获取会话密钥,我们将使用 Osmocom Simtracer [2],它可以嗅探SIM卡与手机之间的数据通信。将SIM卡置于simtracer之中,再把simtracer连接到手机的SIM卡槽。Peer在SIM中运行AKA算法,SIM包含了执行预共享密钥。一旦生成会话密钥,就会发送到电话应用程序中。如果在wireshark中运行捕获按钮,我们可以将其视为一个gsm_sim响应包。一个名为APDU的payload包含了这个会话密钥,其分为两部分,一个为IK(integrity key)一个CK(confidentiality key)
Wireshark解析器显示使用SIMtrace嗅探到的IK及CK
为了进行Wifi呼叫,电话中创建了一个IPSec信道。其集成了一个vpnclient后台进程,当进行呼叫操作会在第一时间开始运行。
—————————————— logcat snippet ———————————— 10-06 20:53:27.450 5872 5872 I vpnclientd: Added interfaces: 10-06 20:53:27.450 5872 5872 I vpnclientd: 15: ‘epdg1’ mtu 1500 ————————————————————————————————
我们可以嗅探虚拟接口epdg1,很容易发现在该接口的数据包没有进行加密(为了完整性保护)。其直接使用我们用simtracer嗅探的IK。
在wireshark中使用Gcrypt库,我们可以解密数据包来看看底层数据
之后我们可以看到嵌入在ESP数据包下的SIP(session initiation protocol,会话发起协议)数据包
使用Gcrypt解密ESP数据包后得到的SIP数据
在SIP数据包中发起了一个WiFi呼叫,我们可以挖掘出一些诸如私有IP,呼叫者IMEI,供应商等信息。
现下,我们将焦点注视在由vpnclient后台进程创建的虚拟接口,实际上真实数据包由wlan0发送。这些都是加密的并且密钥是由IKEv2协议生成。身份验证以及加密密钥都使用到EAP-AKA。同样的你也可以在日志中找到蛛丝马迹:
——————————————————————————————————————————————————————- 10-06 20:53:29.180 5872 5872 I vpnclientd: IKEv2 SA [Initiator, NAT-T] negotiation completed: 10-06 20:53:29.180 5872 5872 I vpnclientd: Local Authentication Method : EAP AKA 10-06 20:53:29.180 5872 5872 I vpnclientd: Remote Authentication Method : EAP AKA 10-06 20:53:29.180 5872 5872 I vpnclientd: IKE algorithms : aes256-cbc, hmac-sha1, hmac-sha1-96 10-06 20:53:29.180 5872 5872 I vpnclientd: Diffie-Hellman : group 2 (dh-modp-1024) 10-06 20:53:29.180 5872 5872 I vpnclientd: Local IKE peer 192.168.1.1:54621 ID (intentionally suppressed) 10-06 20:53:29.180 5872 5872 I vpnclientd: Remote IKE peer 10.20.1.1:4500 ID epdg.epc.mnc001.mcc262.pub.3gppnetwork.org 10-06 20:53:29.180 5872 5872 I vpnclientd: Initiator SPI 660cfdc3 0ff7a47c Responder SPI 92810520 15282ee2 ——————————————————————————————————————————————————————-
嗅探wlan0接口显示最初IKEv2通过ESP数据包作为ISAKMP继承
我们尝试着理解该密钥是如何生成的。正如我们之前所讨论的,在SA安全联盟进行密钥交换中分为两个阶段。在第一个阶段中,SA安全联盟为第二阶段进行密钥交换,在第二阶段,实际的SA安全联盟为之后的ESP数据包进行交换。我们比较感兴趣第二阶段,通过嗅探SIM卡与手机之间的接口,我们获得了CK和IK。所以我们不需要进行解密操作。但我们需要知道接下来会发送什么。以下为摘自RFC 4187有关PRNG(伪随机数生成器)的资料,这是获取密钥的关键。
On EAP-AKA full authentication, a Master Key (MK) is derived from the underlying AKA values (CK and IK keys), and the identity, as follows. MK = SHA1(Identity|IK|CK) The Master Key is fed into a Pseudo-Random number Function (PRF), which generates separate Transient EAP Keys (TEKs) for protecting EAP-AKA packets, as well as a Master Session Key (MSK) for link layer security and an Extended Master Session Key (EMSK) for other purposes. The "|" character denotes concatenation, and "^" denotes exponentiation. Step 1: Choose a new, secret value for the seed-key, XKEY Step 2: In hexadecimal notation let t = 67452301 EFCDAB89 98BADCFE 10325476 C3D2E1F0 This is the initial value for H0|H1|H2|H3|H4 in the FIPS SHS [SHA-1] Step 3: For j = 0 to m - 1 do 3.1. XSEED_j = 0 /* no optional user input */ 3.2. For i = 0 to 1 do a. XVAL = (XKEY + XSEED_j) mod 2^b (here b=160, and XKEY is MK) b. w_i = G(t, XVAL) (I still need to figure out what this is
*参考来源: insinuator ,FB小编鸢尾编译,转载请注明来自FreeBuf(FreeBuf.COM)