在密码测评过程的过程中,我们经常会接触到SSL VPN和IPSec VPN,目前对于IPSec VPN的流量在密评中怎么分析,怎么去验证也是一个重要的知识点,我们在看相关标准GB/T 36968-2018《信息安全技术 IPSec VPN技术规范》的时候难免感觉到枯燥,并且此标准对于理解IPSec VPN非常重要,所以本文以标准和通过实例一起探索IPSec VPN流量在密评中怎么进行分析。
GB/T 36968-2018 《信息安全技术 IPSec VPN技术规范》
IPSec VPN流量包
发送方和响应方的私钥
SM2加解密与签名验签工具
SM4加解密工具
SM3计算工具
相关标准和流量包以及工具等下载链接会放在文章最后
IPSec的解释在网上很容易查到,这里我们不多做解释,只是简单的概括一下:
IPSec是通过将秘密消息封装在数字信封中,并对整个数字信封进行加密,来确保消息在传输过程中的安全性。
IPSec协议是套协议,由多个协议组成:IKE(密钥交换协议)、AH(封装)鉴别头、ESP(封装安全载荷)
IPSec的数据一般由两个阶段构成,主模式和快速模式,主模式有6个数据包,快速模式有3个数据包。这个点在标准中6.1.3.2章节与6.1.3.3章节中体现
第一阶段主模式主要是由设备密钥(非对称算法)协商出工作密钥,在协商过程中有一个重要作用SA(安全联盟),在数据包中体现ISAKMP协商,所以我们需要协议筛选出ISAKMP
下面我们对应标准对两个阶段9个数据包做详细分析,并进行相应的签名验证。
发起方给响应方发送一个SA载荷,这里需要注意的是对于两端通信,双方都可以发起请求。
我们看一下6.1.5.1消息头的格式,携带双方cookie,下一载荷,版本号,交换类型,标志等参数
在数据包中构成:
这里下一载荷的值为1,在载荷类型中表示安全联盟
交换类型的值为2,在标准中为身份保护类型
同理,变换载荷也是可以通过数据包中结构对应标准进行一个分析
对于完第一个消息分析到此为止,我们来看第二个消息。
对方发回来SA载荷和2个证书,签名证书在前,加密证书在后,同样对于消息头的分析与第一个消息一样,我们可以发现,第二个消息响应方的cookie有了值,浏览所有的数据包,发现在一组IPSec VPN流量中他们的cookie值相同。所以在实际生产环境中,可能我们抓取的数据包存在很多ISAKMP协议数据,这里我们可以通过双方cookie值来确定是同一组的流量数据。
第二个消息从标准看主要是响应端收到发送端发送的加密套件后,对比自己是否有相对应的加密套件,如果有就使用和发送端相同的加密套件加密数据,把自己的SPI值和选择好的加密套件发送给发送端。并且在这个过程携带响应方自己的双证书。在这个消息中我们重点关注的是证书信息。
我们可以通过在Certifcate Data中右键--复制--as hex stream,将获取到的值进行hex转base64,保存后查看证书信息,而获取证书是为了公钥信息为后面的解密及验签提供数据。
其实对于在流量包中,我们能很快的找到证书公钥,这里我们保存的是签名证书的值,他的公钥信息如下
在数据包中,我们将Certifcate Data展开2层,可以看到subjectpulickey的值就是公钥信息,同理我们使用私钥可以获取到公钥信息,这里我使用签名证书的私钥进行获取。
同理加密证书的相关值也可以进行提取,这里我们不多做赘述。
标准中讲到发起方和响应方交换数据,交换的数据内容包括 Nonce、身份标识(ID)等载荷。 Nonce 是生成加密密钥和认证密钥所必需的参数;ID 是发起方或响应方的标识。这些数据使用临时密 钥 Sk 进行加密保护,Sk 用对方加密证书中的公钥加密保护,并且,双方各自对数据进行数字签名。使 用SM2 算法进行加解密和数字签名验签的具体要求见 GB/T 35276。
我们先来看消息三在数据包中的构造,主要关注点在载荷值上
我们再来看看标准中过程中都是怎么说的:
前面我们通过消息1和消息2能获取到双方用的对称加密为SM4,用的非对称加密为SM2
用响应方私钥对ski进行一个非对称的运算,用ski对noce的密文进行一个对称算法的运算,用ski对id的密文进行一个对称运算。
第一个载荷:Payload: Private Use (128),在标准我们发现128是对称密钥载荷(SK),但是在数据包中显示私有使用,这里我们以国内标准为指导。
载荷的值的加密的,我们提取出值来
307902210083e6ecef3fb62d7d4683132d920a298dd88efc8342256fb751987a5c37300cd30220398674a09fc955c21d9218a5016994738d9eddb2939b133e8ed2273aa3a215d30420cf1f2e14abe2de8c81fc9f2fbf028648570af88dcdaa98659a4c3eb1f96975100410ac34d8306c55b五0003a96045184deb81
30表示类型,79转10进制为121,代表后面的字符数为121位。同理02是类型,后面21表示长度,我们将证书数据进行切割开
3079 0221 0083e6ecef3fb62d7d4683132d920a298dd88efc8342256fb751987a5c37300cd30220 398674a09fc955c21d9218a5016994738d9eddb2939b133e8ed2273aa3a215d30420 cf1f2e14abe2de8c81fc9f2fbf028648570af88dcdaa98659a4c3eb1f96975100410 ac34d8306c55b五0003a96045184deb81
我们对这一串字符进行解密,由于这是用公钥加密,我们需要用到私钥解密,先出处理上述数据,将标识全部删除后,获得最终需要解密的数据
83e6ecef3fb62d7d4683132d920a298dd88efc8342256fb751987a5c37300cd3398674a09fc955c21d9218a5016994738d9eddb2939b133e8ed2273aa3a215d3cf1f2e14abe2de8c81fc9f2fbf028648570af88dcdaa98659a4c3eb1f9697510ac34d8306c55b五0003a96045184deb81
这个数据为对称载荷SK的密文,需要注意的是我们解密的发送方的SK的密文
我们先对私钥进行解析,获取私钥因子,这里我们使用的发送方的加密私钥
2eb464dc25937be59938549f4cc6306cea1c2ecdcc491a4e3b4fc0bd29af1f99
我们进行SM2私钥解密,获取到对称载荷SK明文
e6b74813213bfe4759c20225ade2678e