周益旻,刘方正,杜镇宇,张 凯
(国防科技大学电子对抗学院,合肥 230037)
互联网安全协议(Internet Protocol Security,IPSec)是由IETF 于1998 年11 月提出的Internet 网络安全通信规范,为私有信息通过公网传输提供了安全保障[1]。虚拟专用网络(Virtual Private Network,VPN)可利用廉价接入的公共网络来传输私有数据,相较传统专线连网方式更具成本优势,受到各企业和电信运营商的青睐。IPSec VPN 是基于IPSec 协议的VPN 技术,常用的VPN 实现协议包括PPTP、L2TP、IPSec、MPLS 和SSL等[2]。从目前所有VPN 的实现方式来看,基于IPSec 的VPN 技术是一种安全性相对较高的VPN 技术[3]。IPSec VPN 使用IKE 协议验证IPSec 通信双方身份、建立安全关联(Security Association,SA)以及生成安全密钥。IKE协议对IPSec 的安全性至关重要,IKE 协议第1 版(简称IKEv1)由IETF 于1998 年发布,并于2005 年发布第2 版[4]。
虽然IPSec VPN 安全性较高[5],但是长期的应用过程中人们已经发现IKEv1 存在身份泄露[6]、中间人攻击[7]、拒绝服务攻击[8]等脆弱性问题。文献[9]从理论上分析了IKEv1 协议中存在的脆弱性问题,却没有给出具体的实现方案。文献[10]提出一种ARP欺骗实施中间人攻击的方法,在局域网中验证了该方法的可行性,但其不能应用在不同网段的VPN中。文献[11]通过VPN 指纹识别技术,获取VPN 服务器设备类型与版本信息,但是却没有给出具体的服务器流量获取方法。
本文分析IPSec VPN 的安全性漏洞,主要是密钥交换过程中IKE 协议存在中间人攻击以及数据传输过程中OSPF 路由选择协议存在的路由欺骗攻击,研究三种常规OSPF 路由欺骗方式在IPSec VPN 中间人攻击中的性能表现,同时构建IPSec VPN 流量劫持模型及攻击数据包,并设计实施中间人攻击的IPSec VPN 流量劫持与密钥获取算法。
IKEv1 协商密钥包括两个阶段:1)对身份进行认证并建立安全关联ISAKMP SA;2)建立IPSec SA,为AH 和ESP 封装数据包提供服务。
阶段1 与阶段2 的协商过程如图1 所示。消息①来自客户端,包括ISAKMP 数据包首部HDR、安全关联SA、以gxi为参数的DH 密钥交换材料KE(gxi)、随机数Ni 与身份信息IDii,将其作为第一条信息明文发送给服务器。消息②来自服务器,同样包括首部HDR 以及对客户端SA 的确认以及自身的密钥材料KE(gxr)、随机数Nr、身份信息IDir 与校验值HASH_R。消息③来自客户端,对服务器发送的数据进行HASH 校验,如果与自身计算的HASH 一致则通过身份认证,并回复一个HASH_I 值进行确认。
图1 激进模式预共享密钥协商过程Fig.1 Process of pre-shared key negotiation in aggressive mode
在预共享密钥认证的方式下,密钥SKEYID 计算如式(1)所示。消息②中客户端HASH_I计算如式(2)所示。消息③中服务器HASH_R 计算如式(3)所示VPN 双方共享密钥材料计算如式(4)~式(6)所示。IKEv1 阶段1 的协商完成,通信双方获得了保护阶段2密钥交换的ISAKMP SA 参数。阶段1 生成的密钥材料将用于保护阶段2 快速模式交换的3 条消息,如式(7)~式(9)所示。
其中,PSK 表示预共享密钥,gxy表示由gxi和gxr生成的DH 共享密钥,
_b 表示
有效载荷部分,如Ni_b表示随机数Ni 的有效载荷部分,CKY_I、CKY_R 分别表示客户端与服务器数据包首部HDR 中的Cookie 信息,M-ID 表示数据包中ID 字段,[]中参数为可选参数,非强制使用。
在阶段2 协商过程中,消息④来自客户端,包括ISAKMP 报头和IPSec SA 有效负载,SA 包含数据传输的所有提议和变换。在客户端和服务器之间将交换一个新的临时值Ni。消息⑤由服务器发送给客户端,其中包含ISAKMP 报头以及选定的SA,临时值Nr 和HASH(2)对消息④进行确认。消息⑥来自客户端,由客户端对服务器存在性进行验证并发送HASH(3)。以上3 条消息均使用SKEYID_e 进行加密。在不需要PFS 交换的情况下,后续密钥材料为KEYMAT=prf(SKEYID_d,protocol|SPI|Ni_b|Nr_b),至此IKEv1 阶段2 的密钥协商完成,通信双方计算出后续数据加密使用的密钥材料KEYMAT,用于加密数据传输。
在上述协商过程中,由于消息1 与消息2 均使用明文发送,因此攻击者在实现IPSec VPN 流量劫持的基础上,通过分析密钥协商阶段数据可以得到VPN 通信双方的身份信息以及除了预共享密钥PSK以外的所有VPN 密钥协商参数,预共享密钥PSK 可通过式(1)、式(3)结合口令字典暴力破解得出。阶段1 协商过程采用的Diffie-Hellman 密钥交换体制决定了中间人实施攻击存在的可能性。因此,只要攻击者破解了预共享密钥PSK,再通过伪造客户端与服务器双方的身份认证信息,攻击者就可分别与客户端、服务器尝试进行密钥协商,以实现IPSec VPN中间人攻击的目的。因此,实现IPSec VPN 流量劫持是进行中间人攻击的前提条件。
路由选择协议在因特网中决定着数据分组的转发路径,保证了分组能够跨越网络正确高效地到达目的地。OSPF 路由协议是因特网自治系统中最常用的内部网关协议之一[12]。OSPF 是一种典型的链路状态路由选择协议,路由器通过链路状态通告(Link State Advertisement,LSA)在链路状态发生变化时广播链路状态信息。相邻路由器之间交换LSA 分组,所有有效的LSA 存放在链路状态数据库中,路由器据此计算网络拓扑信息并得到路由表[13]。因此,在LSA 上路由信息的准确性与真实性对于数据流量的转发至关重要。
路由欺骗是一种利用协议漏洞伪造LSA 篡改路由信息的攻击方法。路由欺骗[14]攻击主要有双LSA攻击、邻接欺骗攻击、单路径注入攻击、远程虚假链接等。邻接路由欺骗常应用在中间人攻击[15]、DNS欺骗攻击[16]、拒绝服务攻击[17]等中,攻击者通过与网络中路由器建立邻接关系,配置OSPF 协议,触发相应的恶意LSA,通过洪泛机制传播给网络中其他路由,欺骗区域中其他路由器,污染其路由表,干扰流量的正常转发[18]。然而,对于IPSec VPN 中间人攻击,邻接路由欺骗虽然仅起到了流量劫持的效果,但却会影响攻击者后续密钥获取、数据篡改的实现。IPSec VPN 邻接路由欺骗过程如图2 所示。当攻击者通过与未设被动接口的R0 路由器建立邻接关系后,接入R0 路由器所在的OSPF 区域,以内部路由器身份注入一条关于VPN 服务器网段地址的恶意LSA,R0 收到这条消息后更新其路由表并宣告给其他邻接路由器,结合洪泛机制,整个路由区域内大范围路由器的路由表都将受到污染,当区域中存在客户端发往VPN 服务器通信数据时,攻击者将获取到客户端发往服务器的信息。然而,若攻击者与服务器之间不存在除R0 外的其他线路,那么当攻击者通过R0 向真实的VPN 服务器发送数据时,由于其邻接路由器路由表也被篡改,因此数据并不会成功的发送到服务器,从而影响后续攻击。
图2 IPSec VPN 邻接路由欺骗过程Fig.2 Process of IPSec VPN adjacent routing spoofing
IPSec VPN 单路径注入攻击过程如图3 所示。攻击者将R0 路由器作为跳板路由,伪造源地址为F0/1 的数据包,冒充R0 路由器,发送包含关于服务器网段路由信息的恶意LSA 给R1,R1 称为源污染路由器,R1 收到该LSA 之后,会将这些恶意的LSA 继续洪泛出去,使得区域1 内部路由器路由表、链路状态数据库均受到污染,前往服务器网段的数据包会转发给R0。由于该恶意LSA 是攻击者伪造的,因此当R0 收到R1 发回的LSAck 包之后,若仅采取丢弃处理,则不会引起自反击机制,这样保证了区域2 中路由器关于服务器路由地址的正确性,不影响后续攻击者对服务器方向数据的发送。然而,单路径注入攻击的条件在于跳板主机与源污染路由器之间只能存在一条路径,使得恶意LSA不会再次通过其他区域传播到跳板路由。因此,采用单路径注入攻击的方式进行路由欺骗,仅适用于可将客户端与服务器划分为两个区域,区域之间有且仅有一条路径连通的情况。双LSA 远程多注入是一种通过改变相关路径上的路由器LSA,达到对中间流量传输路径进行控制的攻击方式[19],IPSec VPN 双LSA 远程多注入攻击过程如图4 所示。
图3 IPSec VPN 单路径注入攻击过程Fig.3 Process of IPSec VPN single path injection attack
图4 IPSec VPN 双LSA 远程多注入攻击过程Fig.4 Process of IPSec VPN dual LSA remote multiple injection attack
OSPF 协议规定两个具有相同序列号、校验和且时间差小于15 min 的LSA 为相同的LSA。假定攻击者通过与网络中的路由器(图4 中的R0)建立邻接关系,获取到网络拓扑与OSPF 相关参数,那么双LSA 注入攻击就可利用该机制进行构造,并以一定时序在网络中发送关于某一个污染节点(也称受害路由器)(图4 中的R3)的“触发LSA”与“抗反击LSA”,双LSA 注入攻击过程如图5 所示。
图5 双LSA 注入攻击过程Fig.5 Process of dual LSA injection attack
攻击者于t0时刻发生“触发LSA”,“触发LSA”在传播到受害者路由器(R3)之前会影响所经过的路由器(图5 中的R1 和R2),当“触发LSA”经过洪泛于t1时刻到达受害者路由器时,受害者路由器于t3时刻会触发自反击机制,发送一个更新的“自反击LSA”,然而由于攻击者事先构造了关于该更新LSA 的具有相同序列号、校验和且时间差小于15 min 的“抗反击LSA”并已于t2时刻传播给其他路由器,此时其他路由再收到该受害路由器更新的LSA 之后,会认为与“抗反击LSA”相同而丢弃,导致网络中数据链路状态数据库发生改变,达到控制中间流量传输路径的效果。因此,采用双LSA 远程多注入的攻击方式,适用于客户端与服务器之间存在两条及以上链路的情况。本文对上述3 种路由欺骗方式在IPSec VPN 中间人攻击中的优劣势进行对比分析:1)邻接路由欺骗,控制流量传输路径、攻击者获取目标流量,影响范围大且攻击方式简单,但难以控制欺骗范围并影响后续攻击;2)单路径注入攻击,控制流量传输路径,容易控制欺骗范围,适用于目标网络之间仅存在唯一链路的情况;3)双LSA 注入攻击,控制流量传输路径,适用于目标网络之间存在多条链路的情况,攻击者需要获取OSPF 网络相关参数。
本文选用双LSA 注入攻击的方式,实现IPSec VPN 流量劫持。一般而言,通过长期的流量分析,VPN 客户端与服务器网关地址信息较易获取,但难点在于选择受害路由、构造“触发LSA”以及“抗反击LSA”并以合适的时序发送。攻击者在控制目标流量传输路径后,还需要结合路由控制手段,对目标流量进行转发以保证攻击者伪造的数据能够重新发送出去。
为方便算法描述,本文将IPSec VPN 网络分为Client 区域、Server 区域以及中间区域3 个部分。以劫 持Client→Server 单向流 量为例,将Client 与Server 之间的中间网络用有向图结构进行表示,每一个顶点代表一个网络节点,每一条边代表一条网络路径,箭头代表流向,如图6 所示。定义(Vi,Si)为中间网络中的一个网络节点,(V0,S0)和(Vn,Sn)分别为Client端至Server端路径在中间区域经过的第一个和最后一个路由器节点,其中,(V0,S0)表示中间区域中第一个入度为1 且所有VPN 流量均为流入的节点,(Vn,Sn)表示中间区域中第一个出度为1 且所有VPN 流量均为流出的节点。
图6 Client-to-Server 流量劫持模型Fig.6 Client-to-Server traffic hijacking model
选定一条Client→Server 可达路径Path,按流量经过顺序标记Path 上所有节点作为标记节点集FlagSet{(V0,S0),(V1,i1),…,(Vi,ii),…,(Vn,Sn)},即图6 中白色虚框节点。假定攻击者所控制的路由节点 为(Vi,ii)(S0
算法1IPSec VPN 流量劫持算法
FlagSet 输入顺序决定了劫持流量的方向,当输入顺序为(Vn,Sn)→(V0,S0),即可影响Server→Client流量。在不考虑LSA 洪泛时间与数据库更新时间的情况下对所有污染节点进行注入攻击,即可达到控制流量路径的目的。
由于无法对IPSec VPN 加密流量直接解密,直接对加密流量进行篡改会引起通信双方的警觉,因此攻击者必须进行身份欺骗:对于VPN 客户端,攻击者应伪装成VPN 服务器,发送伪造的响应数据包,对客户端数据请求进行响应,使得攻击者能够获取客户端加密密钥;对于VPN 服务器,攻击者应伪装成VPN 客户端,发送伪造的协商请求数据包,主动与服务器建立连接,实现IPSec VPN 中间人攻击。
算法2客户端KEYMAT 密钥获取算法
算法2 开启一个监听进程,对收到的数据流中第一条数据包进行检查,判断其源地址是否为VPN客户端地址;若不是,则跳出流程,检查下一条数据包,若是,则继续执行,判断其端口号是否为500 且Responder SPI 字段是否为0;若不是,则跳出流程,检查下一条数据包,若是,则表明收到客户端发来的阶段1 的协商请求数据包,对其进行解析并调用发包进程,构建响应数据包respondpacket_1,填入服务器Cookie、随机数Nonce、DH 公钥等关键载荷,利用式(3)计算HASH_R 发送给客户端,继续监听,并利用式(4)~式(6)输出阶段1 的密钥SKEYID,阶段1协商完毕;检查下一条数据包端口是否为500、Responder SPI 字段不为0 且MessageID 字段也不为0,若不是,则继续检查下一条数据包;若是,则表明收到了客户端阶段2 的协商请求,利用阶段1 的密钥SKEYID,调用解密进程,解析数据包并调用发包进程,构建响应数据包respondpacket_2,利用式(8)计算HASH(2),填入随机数、哈希载荷和身份载荷,发送给客户端,阶段2 协商完毕;攻击者获得VPN 客户端后续加密数据密钥KEYMAT,算法结束。
算法3服务器KEYMAT 密钥获取算法
在算法3中,攻击者利用流量劫持阶段获得的VPN协商参数,打开监听进程,伪造并发送协商请求aggressivepacket_1,对收到的数据包进行检查,判断源地址是否为服务器地址;若不是,则检查下一条数据包,若是,则判断端口号是否为500 且CKY_R ≠0;若不是,则检查下一条数据包,若是,则表明收到阶段1 的VPN服务器响应回复,提取数据包中随机数载荷Nonce 和KE 载荷,利用式(4)~式(6)计算并获得阶段1 密钥SKEYID,利用式(2)计算HASH_I,并构造阶段1 响应数据包aggressivepacket_2;监听下一条数据包,构造阶段2 协商请求quickpacket_1,通过SKEYID 加密后发送给VPN 服务器,若收到端口号为500 且CKY_R≠0、MessageID≠0 的数据包,表明收到阶段2 的VPN 响应数据包,利用式(9)计算HASH(3)载荷,构造响应回复quickpacket_2 加密后发送给VPN 服务器,至此阶段2协商完成,攻击者获得VPN 服务器后续加密密钥KEYMAT,算法结束。
为验证IKEv1 中实际存在的脆弱性以及VPN 流量劫持算法、IPSec VPN 密钥获取算法的正确性,本文利用GNS3 软件搭建仿真网络拓扑模拟跨网段IPSec VPN 环境并利用Scapy 库[20]伪造网络数据包。
实验主要采用以GNS3 软件[21]搭建的仿真环境进行验证,网络拓扑环境如图7 所示,其中R1,R2,…,R11 是思科C3660 路由器,网络分为客户端内网、服务器内网与中间网络三部分。中间网络由路由器R1、R2、R3、R4、R5、R6、R8 和R10 组成,配置OSPFv2 协议。路由器与主机端口IP 地址已在图7 中标注。路由器接口IP 地址为网络号加上路由器的标号,如R1 的两个接口地址为14.1.1.1 和31.1.1.1,R6 的两个接口地址为36.1.1.6 和65.1.1.6。IPSec VPN 配置:R7 为VPN 客户端,R9 为VPN 服务器。双方使用IKEv1 进行协商,密钥协商采用激进模式预共享密钥认证方式,加密模式为AES-CBC,校验算法为HMAC-SHA128,密钥交换使用DH-1 024。PC1 与PC2 分别位于客户端内网与服务器内网,使用网关路由器R7 与R9 之间建立的IPSec VPN 进行通信。攻击者配置:攻击者实际为一台Ubuntu16系统虚拟机,通过E1/0 端口连接R4 路由,R4 路由为攻击者可控路由。
图7 网络拓扑环境Fig.7 Network topology environment
3.2.1 IPSec VPN 流量劫持实验过程
为验证IPSec VPN 流量劫持算法的有效性,实验环境为客户端与服务器之间配置了两条链路,即R7-R3-R6-R5-R10-R8-R9 与R7-R3-R1-R4-R2-R8-R9。在正常情况下,客户端与VPN 服务器网关之间的通信流量不一定经过R4,也有可能经过R5,攻击者只实现了对R4的控制。利用双LSA 远程多注入攻击方式,使客户端与VPN 服务器网关之间的流量一定要经过R4。攻击者实现IPSec VPN 流量劫持主要分为路由欺骗、设置转发规则和配置策略路由3 个阶段。
IPSec VPN 流量劫持的具体步骤如下:
1)攻击者向R1、R2 注入受害者路由器R5“触发LSA”。
2)攻击者向R1、R2 注入受害者路由器R5“抗反击LSA”。
3)攻击者通过R4 添加转发规则,将目的地址为服务器网段(160.18.2.0)的数据包转发给攻击者(180.16.2.2)。
4)攻击者通过R4 添加转发规则,将目的地址为客户端网段(172.17.2.0)的数据包转发给攻击者(180.16.2.2)。
5)攻击者通过R4 在E1/0 端口配置策略路由,目的地址为服务器网段(160.18.2.0)的数据包转发给R2;目的地址为客户端网段(172.17.2.0)的数据包转发给R1。
6)攻击者主机打开流量转发。
步骤1 和步骤2 注入LSA。以污染R1 为例,攻击者构造关于R5 接口地址的“触发LSA”发送给R1,在1 s 后再发送“抗反击LSA”。当R5 收到“触发LSA”后仍需要5 s 时间才能发出“自反击LSA”,因此攻击者发送的“抗反击LSA”有足够的时间污染R5 的邻接路由。“抗反击LSA”加入了固定值与特定校验和使得能够与R5 产生的“自反击LSA”校验和一致,具体参数如表1所示。步骤3 和步骤4 对R4 添加路由规则,将R4 获取的IPSec VPN 流量转发给自己,R4 路由规则如表2 所示。步骤5 和6 对R4 配置策略路由,添加转发规则,将IPSec VPN 流量重新转发出去,如表3 所示。
表1 R5“抗反击LSA”过程的主要参数设置Table 1 Setting of main parameters for the process of R5“anti-counterattack LSA”
表2 R4 路由规则Table 2 Routing rules of R4
表3 R4 策略路由规则Table 3 Policy routing rules of R4
3.2.2 IPSec VPN 流量劫持实验结果分析
实验结果包括路由器路由表攻击前后对比、IPSec VPN 流量路径攻击前后对比、真实路由器链路状态数据库与被污染路由器链路状态数据库对比。表4 列出了客户端出口路由R3 路由表项在受到路由欺骗前后的主要参数设置。
表4 R3 被攻击前后路由表项的主要参数设置Table 4 Setting of main parameters of routing table entry of R3 before and after attacking
由表4 可知,R3 路由器不再选择R5、R6 所在的路径,转而选择R4 路由器所在的路径。攻击前客户端网关(R7)与VPN 服务器网关(R9)的流量传输路径如图8 所示。R7 前往R9 的流量经过R3、R6、R5、R10、R8路由器,而R9前往R7的流量传输选择了另外一条R2、R4、R1、R3的路径。攻击后R7与R9的流量传输路径如图9 所示,由于经过了中间人转发,因此中间路由没有完全显示。
图8 攻击前R7 与R9 的流量路径Fig.8 The traffic path of R7 and R9 before attacking
图9 攻击后R7 与R9 的流量路径Fig.9 The traffic path of R7 and R9 after attacking
攻击后R5 与R6 保存的关于R5 的LSA 如图10所示。可以看出,R5 保存的是真实的LSA,而R6 保存的实际上是攻击者构造的“抗反击LSA”,R6 链路状态数据库受到污染。
图10 R5 与R6 保 存 的LSAFig.10 LSA saved by R5 and R6
3.3.1 IPSec VPN 密钥获取实验过程
根据上文分析可知,攻击者获取VPN 通信流量后,通过破解预共享密钥PSK,中断流量转发,即可迫使客户端重新发送协商请求。攻击者运行客户端攻击程序,利用Scapy 库伪造服务器响应数据包进行通信。
根据客户端KEYMAT 密钥获取算法,客户端攻击程序需要构造并发送两个攻击数据包respondpacket_1 与respondpacket_2,并伪装成服务器与客户端进行通信。图11 给出了一个标准的服务器响应数据包结构。Scapy 中数据包的构建遵循网络协议分层的思想,并通过参数化赋值方式将源地址、目的地址、协议号填入数据包IP 头部,将源端口、目的端口填入数据包UDP 头部。因此,respondpacket_1 的结构为respondpacket_1=IP()/UDP()/ISAKMP()/ISAKMP_payload_SA()/ISAKMP_payload_KE()/ISAKMP_payload_Nonce()/ISAKMP_payload_Hash()/ISAKMP_payload_ID()。结合数据包标准格式并根据监听获得的参数信息,填入respondpacket_1 并进行校验,最终调用send 进程进行发送。在攻击程序运行完毕后,获得阶段1 密钥SKEYID 与阶段2 密钥KEYMAT,如图12 所示。此时,利用Wireshark 输入KEYMAT 参数对客户端发送的数据进行解密,得到的数据包如图13 所示。
图11 标准数据包结构Fig.11 Standard data pack structure
图12 客户端攻击程序运行结果Fig.12 Running results of client attack program
图13 客户端发送的数据包Fig.13 Data pack sent by the client
攻击者运行服务器攻击程序,伪造客户端发送协商请求数据包,通过服务器方认证,获得阶段1 和阶段2 的密钥SKEYID’与KEYMAT’,如图14 所示。攻击者将客户端发送的数据包进行篡改后,利用KEYMAT’加密后转发给服务器,服务器收到的实际数据如图15 所示。
图14 服务器攻击程序运行结果Fig.14 Running results of server attack program
图15 服务器收到的数据包Fig.15 Data pack received by the server
3.3.2 IPSec VPN 密钥获取实验结果分析
实验结果表明,攻击者在IPSec VPN 流量劫持的基础上实现了对IPSec VPN 客户端与服务器双方的身份伪造,通过攻击程序获取了客户端与服务器双方的通信密钥。攻击者利用获取的客户端密钥对客户端数据解密并篡改后通过服务器端密钥重新加密发送给服务器,服务器实际收到的是由攻击者篡改后的数据包,至此中间人攻击完成且通信双方均未发现攻击者。
本文分析IPSec VPN 中IKE 协议激进模式和OSPF 路由选择协议的安全性漏洞,设计IPSec VPN流量劫持算法与KEYMAT 密钥获取算法,通过搭建仿真环境并选取双LSA 注入路由欺骗攻击方式,实现跨网段IPSec VPN 中间人攻击并验证了IPSec VPN 协议的脆弱性。下一步可将本文研究成果应用在边界网络设备防护和骨干网络防御任务中,当IPSec VPN 等边界网络设备正常连接出现中断时,快速有效检测出中断原因并评估风险等级,以抵御类似的中间人攻击,而在数据传输的骨干网络中对于可能存在的路由欺骗攻击,主动检测异常的链路状态通告,找出潜在的攻击行为,保障骨干路由安全。