IPSec解密

加密IPSec报文类型

IKE协商阶段

  1. IKE协商阶段,部分IKE报文会被加密:
    • IKEv1:
      • 主模式(Main):Phase 1第5、6个包,Phase 2全部报文。
      • 野蛮模式(Aggressive):Phase 1第3个包,Phase 2全部报文。
    • IKEv2:
      • IKE_AUTH阶段的全部报文。
      • CREATE_CHILD_SA的全部报文。
  2. 报文封装格式(默认端口):
    • 没有NAT-T:以上报文为UDP 500封装。
    • 有NAT-T:以上报文为UDP 4500封装。
  3. 如果在config system settings下修改了ike-port为非500,例如修改为5555,不论有没有NAT-T,IKE协商报文全部用UDP 5555来封装。
  4. 不仅包含IKE协商报文,IPSec协商成功后或协商中发送的被加密的Information报文也属于此类型。
  5. 当遇到IKE协商失败的情况时,如果IKE Debug无法判断具体的原因,可能需要解密IKE报文来进行判断。

IPSec业务阶段

  1. IPSec业务阶段,所有的业务流量会被ESP封装并加密。
  2. 报文封装格式:
    • 没有NAT-T:所有的加密报文为IP Protocol 50的ESP包。
    • 有NAT-T:所有的加密报文为UDP 4500封装(默认端口)的ESP包。
  3. 如果在config system settings下修改了ike-port为非500,例如修改为5555:
    • 没有NAT-T,所有的加密报文为IP Protocol 50的ESP包。
    • 有NAT-T:所有的加密报文为UDP 5555封装的ESP包。
  4. 当遇到IPSec隧道两端内网的PC无法互相通信时,在FortiGate上抓取明文,报文都已送入隧道接口,但不确定ESP报文是否正确发出和接收,此时可以抓取ESP并解密后判断业务流量丢失是发生在FortiGate还是外部网络。

ESP解密步骤

  1. 关闭FortiGate IPSec一阶段配置中的npu-offload(VM虚机不需要执行此步骤),否则抓出的ESP包解密后无法看到正确的明文。

    注意执行此操作后,IPSec隧道会新进行协商,且之后IPSec业务流量无法被NP加速,请在业务窗口期执行;或不执行此步,使用中间可抓包的设备(如交换机的端口镜像)执行抓包操作。
    config vpn ipsec phase1-interface
        edit "to_Home_WAN1"
            set npu-offload disable
        next
    end
    
  2. 执行如下get vpn ipsec tunnel name <Tunnel_name>命令收集当前IPSec隧道的解密信息:

    image-20231212110158600

    • local-gateway:本地IPSec加密点IP为172.22.6.128
    • remote-gateway:对端IPSec加密点123.112.241.12
    • inbound(解密方向):
      • SPI:ae302828
      • enc:解密算法为AES-CBC,解密密钥为c868e83ee8db83545caa8ba5934d4e87b74d33fb340de74d48f093a6a270237e
      • auth:验证算法为sha256,验证密钥为25bdd6f80db24fd2712eaa5b7246ec9855c97a00abf5e621b6fd5a3e7b4709e5
    • outbound(加密方向):
      • SPI:4906cc41
      • enc:解密算法为AES-CBC,解密密钥为b5905acef4a4406e49579e6d21e3ba5b04570d29b4c26b63fcf98092e12db42f
      • auth:验证算法为sha256,验证密钥为a47b7d28ac667c874487bd2c894a6f4c98f078ea336125d615474295b8fc7cac
  3. 以上密钥信息也可以通过diagnose debug application ike -1的输出结果中找到。

    FortiGate # diagnose debug application ike -1
    FortiGate # diagnose debug enable
    ......
    ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: IPsec SA dec spi ae302828 key 32:C868E83EE8DB83545CAA8BA5934D4E87B74D33FB340DE74D48F093A6A270237E auth 32:25BDD6F80DB24FD2712EAA5B7246EC9855C97A00ABF5E621B6FD5A3E7B4709E5
    ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: IPsec SA enc spi 4906cc41 key 32:B5905ACEF4A4406E49579E6D21E3BA5B04570D29B4C26B63FCF98092E12DB42F auth 32:A47B7D28AC667C874487BD2C894A6F4C98F078EA336125D615474295B8FC7CAC
    ike 0:to_Home_WAN1:221:to_Home_WAN1:18115: added IPsec SA: SPIs=ae302828/4906cc41
    ike 0:to_Home_WAN1: HA send IKE connection add 172.22.6.128->123.112.241.12
    ......
    
  4. 在IPSec通讯接口上抓取ESP包:

  5. 这里我们以有NAT-T环境为例,在ESP报文的出接口wan1上抓取UDP 4500的ESP加密报文,如果没有NAT-T,则抓取IP Protocol 50的报文(GUI方式抓包方法详见故障排查→Sniffer工具→通过GUI界面抓包章节)。

    也可以在CLI下使用sniffer抓取格式6的ESP报文,再转换为Wireshark可以打开的格式,详见如下章节:

    故障排查→Sniffer工具→使用wireshark打开抓包文件

    image-20231212110642303

  6. 执行两个IPSec站点之间的流量访问后,停止抓包后下载抓包文件,使用Wireshark打开下载的抓包文件,右键点击任意一个ESP报文,依次选择“协议首选项→Encapsulating Security Payload→ESP SAs...”。

    image-20231212111503585

  7. 点击左下角的➕,分别新建outbound方向和Inbound方向的SA,根据步骤2或3收集到的网关地址、SPI、算法及密钥信息,填入相应的配置中,填写完成后,点击OK按钮。

    image-20231212175451472

    image-20231212175650867

    • 所有的SPI、加密密钥、验证密钥填入时前边都要加入字符0x,如outbound方向的SPI应填写为0x4906cc41。
    • 加密算法和验证算法根据步骤2或3收集到的算法选择,这里选择为AES-CBC[RFC3602]和HMAC-SHA-256-128[RFC4868]。
  8. 此时即可以看到ESP中加密的明文内容。

    image-20231212112917174

注意事项

  1. 如果在config system settings下修改了ike-port,且存在NAT-T环境,则抓取ESP报文时过滤UDP端口为设置的ike-port端口号(详见VPN技术→IPSec VPN→点到点VPN→修改IPSec协商端口章节),如下所示,将两端FortiGate的ike-port均修改为5555。

    config system settings
        set ike-port 5555
    end
    
  2. ESP报文抓取后并使用Wireshark打开,由于ESP报文被UDP 5555封装,Wireshark无法直接解析出这是ESP报文,而是识别为其他协议。这时我们需要右键点击抓到的UDP 5555报文,选择“Decode As...”按钮。

    image-20231212141519672

  3. 在弹出的“Decode As...”窗口中,选择UDP 5555的当前列为“UDPENCAP”,即UDP封装的ESP。

    image-20231212163927602

  4. 再次查看抓到的ESP包,Wireshark可以解析到ESP包头,随后继续使用本章节介绍的ESP解密方法进行解密即可。

    image-20231212141854870

IKE解密步骤

IKEv1

  1. 抓取IKE报文不需要关闭npu-offload。首先在IKE协商前开启抓包,这里我们以有NAT-T + IKEv1主模式的环境为例,抓取UDP 500或UDP 4500的数据包。如果没有NAT-T,则只需抓取UDP 500的数据包(GUI方式抓包方法详见故障排查→Sniffer工具→通过GUI界面抓包章节)。

    也可以在CLI下使用sniffer抓取格式6的IKE报文,再转换为Wireshark可以打开的格式,详见如下章节:

    故障排查→Sniffer工具→使用wireshark打开抓包文件

    image-20231212153251879

  2. 发起IKE协商或重协商,并保存抓取的IKE协商报文(ISAKMP)。

  3. 协商完成后,在FortiGate上执行get vpn ike gateway <tunnel_name>获取IKE密钥信息,需要获取2个如下信息。

    image-20231212151457812

    • 发起方的SPI(Cookie):这个值从“id/spi”项的值中“/”前边的16进制字符获取,此例中为7992f75f885621d0(发起方的Cookie永远在“/”符号之前)。
    • key:54e29ac67129db6d96c7e03b20b877f2bdb4b15288826e8e13cb202b0bb2cccf(需要将中间的“-”字符删除)。
  4. 以上解密材料也可以通过diagnose debug application ike -1的协商过程输出结果中找到(如果IKE协商过程中失败,或协商成功后就中断,来不及使用步骤3的命令查看密钥信息,可以使用此方法代替)。

    FortiGate # diagnose debug application ike -1
    FortiGate # diagnose debug enable
    ......
    ike 0:to_Home_WAN1:291: ISAKMP SA 7992f75f885621d0/f522761ae47783ad key 32:54E29AC67129DB6D96C7E03B20B877F2BDB4B15288826E8E13CB202B0BB2CCCF
    ......
    
  5. 使用Wireshark打开步骤2中抓取的IKE协商报文(ISAKMP)。可以看到IKEv1主模式从第5个报文开始加密。右键点击任意一个ISAKMP报文,依次选择“协议首选项→Internet Security Association and Key Management Protocol→IKEv1 Decryption Table...”。

    image-20231212145759536

  6. 在弹出的“IKEv1 Decryption Table”窗口中,点击左下角的➕按钮,在“Initiator's COOKIE”中填写步骤3或4获取的发起方的SPI(Cookie):7992f75f885621d0;在“Encryption Key”中填写步骤3或4获取的key 54e29ac67129db6d96c7e03b20b877f2bdb4b15288826e8e13cb202b0bb2cccf。随后点击OK按钮。

    image-20231212152037579

  7. 此时即可以看到IKEv1协商报文中加密的明文内容。

    image-20231212152628756

IKEv2

  1. 抓取IKE报文不需要关闭npu-offload。首先在IKE协商前开启抓包,这里我们以有NAT-T + IKEv2的环境为例,抓取UDP 500或UDP 4500的数据包。如果没有NAT-T,则只需抓取UDP 500的数据包(GUI方式抓包方法详见故障排查→Sniffer工具→通过GUI界面抓包章节)。

    也可以在CLI下使用sniffer抓取格式6的IKE报文,再转换为Wireshark可以打开的格式,详见如下章节:

    故障排查→Sniffer工具→使用wireshark打开抓包文件

    image-20231212153251879

  2. 发起IKE协商或重协商,并保存抓取的IKE协商报文(ISAKMP)。

  3. 协商完成后,在FortiGate上执行get vpn ike gateway <Tunnel_name>获取IKE密钥信息,需要获取8个如下信息。

    image-20231212155229510

    • 发起方的SPI(Cookie):这个值从“id/spi”项的值中“/”前边的16进制字符获取,此例中为9b81bb2ff4687f35(发起方的Cookie永远在“/”符号之前)。
    • 响应方的SPI(Cookie):这个值从“id/spi”项的值中“/”后边的16进制字符获取,此例中为c589483b12220768(响应方的Cookie永远在“/”符号之后)。
    • 加密算法:从“proposal”项中获取,此例为AES-128。
    • 验证算法:从“proposal”项中获取,此例为SHA-256。
    • SK_ei:44655c0119f850aa413ac8a3382e9cf1(需要将中间的“-”字符删除)。
    • SK_er:85b64b08dd028d1d-3142238395fcdb00(需要将中间的“-”字符删除)。
    • SK_ai:b416e2d3d84af464966a40d04798a805eac288448d2940d2f56f42ef13c5c7af(需要将中间的“-”字符删除)。
    • SK_ar:cb2308de4db789ea2ced21363bf1cc3fd3fa379a1391a7f430376dd12c06ca87(需要将中间的“-”字符删除)。
  4. 以上解密材料也可以通过diagnose debug application ike -1的协商过程输出结果中找到(如果IKE协商过程中失败,或协商成功后就中断,来不及使用步骤3的命令查看密钥信息,可以使用此方法代替)。

    FortiGate # diagnose debug application ike -1
    FortiGate # diagnose debug enable
    ......
    ike 0: comes 123.112.242.243:500->172.22.6.128:500,ifindex=5,vrf=0....
    ike 0: IKEv2 exchange=SA_INIT_RESPONSE id=9b81bb2ff4687f35/c589483b12220768 len=432
    ......
    ike 0:to_Home_WAN1:297: matched proposal id 1
    ike 0:to_Home_WAN1:297: proposal id = 1:
    ike 0:to_Home_WAN1:297:   protocol = IKEv2:
    ike 0:to_Home_WAN1:297:      encapsulation = IKEv2/none
    ike 0:to_Home_WAN1:297:         type=ENCR, val=AES_CBC (key_len = 128)
    ike 0:to_Home_WAN1:297:         type=INTEGR, val=AUTH_HMAC_SHA2_256_128
    ike 0:to_Home_WAN1:297:         type=PRF, val=PRF_HMAC_SHA2_256
    ike 0:to_Home_WAN1:297:         type=DH_GROUP, val=MODP2048.
    ike 0:to_Home_WAN1:297: lifetime=86400
    ......
    ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ei 16:44655C0119F850AA413AC8A3382E9CF1
    ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_er 16:85B64B08DD028D1D3142238395FCDB00
    ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ai 32:B416E2D3D84AF464966A40D04798A805EAC288448D2940D2F56F42EF13C5C7AF
    ike 0:to_Home_WAN1:297: IKE SA 9b81bb2ff4687f35/c589483b12220768 SK_ar 32:CB2308DE4DB789EA2CED21363BF1CC3FD3FA379A1391A7F430376DD12C06CA87
    ......
    
  5. 使用Wireshark打开步骤2中抓取的IKE协商报文(ISAKMP)。可以看到IKEv2从IKE_AUTH Initiator Request报文开始加密。右键点击任意一个ISAKMP报文,依次选择“协议首选项→Internet Security Association and Key Management Protocol→IKEv2 Decryption Table...”。

    image-20231212154636161

  6. 在弹出的“IKEv2 Decryption Table”窗口中,点击左下角的➕按钮,依次填写步骤3或4获取的解密材料信息。随后点击OK按钮。

    image-20231212160505055

    image-20231212160612517

  7. 此时即可以看到IKEv2协商报文中加密的明文内容。

    image-20231212161115286

注意事项

  1. 如果在config system settings下修改了ike-port,无论是否存在NAT-T环境,抓取IKE协商报文时要过滤UDP对应设置的ike-port端口号(详见VPN技术→IPSec VPN→点到点VPN→修改IPSec协商端口章节),如下所示,将两端FortiGate的ike-port均修改为5555,所有的IKE协商包和Information报文会被UDP 5555封装。

    config system settings
        set ike-port 5555
    end
    
  2. IKE报文抓取后并使用Wireshark打开,由于IKE报文被UDP 5555封装,Wireshark无法直接解析出这是ISAKMP报文,而是识别为其他协议。这时我们需要右键点击抓到的UDP 5555报文,选择“Decode As...”按钮。

    image-20231212162155578

  3. 在弹出的“Decode As...”窗口中,选择UDP 5555的“当前”列为“UDPENCAP”,然后点击OK按钮后(注意在修改了ike-port后,这里要选择UDPENCAP,而不是ISAKMP)。

    image-20231212163927602

  4. 可以看到Wireshark可以解析到IKEv1和IKEv2的ISAKMP协商报文。随后继续使用本章节介绍的IKE解密方法进行解密即可。

    • IKEv1:

      image-20231212164117828

    • IKEv2:

      image-20231212163304657

Copyright © 2024 Fortinet Inc. All rights reserved. Powered by Fortinet TAC Team.
📲扫描下方二维码分享此页面👇
该页面修订于: 2024-01-19 15:00:00

results matching ""

    No results matching ""