NVR500のIPSec暗号化キー値は、「Win10 VPN接続時のNVR500 L2TP/IPsec ISAKMP復号鍵が壊れて表示」で抽出した。cipher suitの組合せによって鍵が使用出来たり、出来なかったりする。NVR510の暗号化キー値も調べてみた。
(1)NVR510のIPSec暗号化キー値の記録
NVR510 (Rev.15.01.16)
(2)L2TP/IPSec端末のcipher suit設定
「NVR510 L2TP/IPSec VPNの暗号組合せ(cipher suite)をWindows/macOS/Linux(strongSwan/xl2tpd)で接続確認」または「Win10 VPN接続時のNVR500 L2TP/IPsec ISAKMP復号鍵が壊れて表示」の通りcipher suitを組合せて接続する。
(3)確認結果
・「NVR510 L2TP/IPSec VPNの暗号組合せ(cipher suite)をWindows/macOS/Linux(strongSwan/xl2tpd)で接続確認」の通り、cipher suitが「IKE(aes-sha1)ESP(aes256-sha256)」「IKE(aes256-sha1)ESP(aes256-sha256)」の時、L2TP/IPSec接続が出来ないがNVR510のログに接続時のIKE複合鍵(要素)とSA復号鍵(要素)が記録される(NVR500も同様)。
・IKE(ISAKMP)復号鍵(要素)
Consoleから「show ipsec sa gateway 2 detail」でIKEの復号鍵(表中の灰色背景の「key」)が記録されるが「先頭の8 bytes」だけで「aes128/aes256」には利用できない。
復号鍵(要素)「SKEYID_e」が最大32bytesまで記録される(aes256超が無いので32bytes超は不明)。
aes128の時は、「SKEYID_e」の先頭から16bytes(128bit)を使用する。
aes256-sha256の時は、「SKEYID_e」を32Bytes分(256bit)をそのまま使用する。
aes256-sha1の時は、「SKEYID_e」鍵要素から256bit鍵を導出する必要がある。
また、Consoleの「show ipsec sa gateway 2 detail」で表示される「key」は、256Bit鍵の先頭8Bytes(64bit)で、「SKEYID_e」と一致しない。
「IKE:インターネット鍵交換(RFC2409)」の「補遺B」から鍵長が不足する場合、下記のように導出する。NVR510のログデータで確認してみる。wiresharkで暗号化されたL2TP/IPSecパケットを復号させてみる
AES256-SHA1のISAKMP(IKE)が復号される。
・ESP復号鍵(要素)
Consoleから「show ipsec sa gateway 2 detail」でSAの復号鍵(表中の灰色背景の「key」)が記録される。16bytesなのでAES128で使用できる。AES256では、鍵長不足。「show log」で記録される「key material」は、16bytesで「key」と同じ。「key for encryption」「key for authentication」は、先頭8 bytesで利用できない。
AES256では、鍵長が不足するので、下記のように導出する必要がある。NVR510のログを確認すると「SKEYID_d」「SPI」「Ni_b」「Nr_b」は、使用出来そう。「PFS=off」であれば、phase2で「g(qm)^xy」が表示されない。式中のg(qm)^xyも省略。「PFS=on」で「DH Group 14(modp2048)」の「g(qm)^xy」は、128bytes(1024bit)以上は、省略(omitted)されるため利用出来ない。
IKE=AES256-SHA1-modp1024/ESP=AES256-SHA1-modp1024で確認してみた。再導出した256bit key値を使い、L2TP/IPSecパケットをwiresharkで確認してみる。
AES256-SHA1のESPパケットが復号される。
(4)記
「ネツエン」達の要求技術(知識)レベルが高すぎるので、
・「show ipsec sa gateway 2 detail」で表示される「key」は「復号出来る鍵長」で表示して欲しい。
・「ipsec ike log 2 key-info」の表示で、
「SKEYID_e」だけでなく「IKEv1 encryption key」を「復号できる鍵長」で表示して欲しい。
「g(qm)^xy」の「omitted」とせず、全体を記録して欲しい。
「SA」の「Key for encryption」と「key for authentication」を「復号できる鍵長」で表示して欲しい。
(1)NVR510のIPSec暗号化キー値の記録
NVR510 (Rev.15.01.16)
tunnel select 2
ipsec ike log 2 key-info
syslog debug on
(2)L2TP/IPSec端末のcipher suit設定
「NVR510 L2TP/IPSec VPNの暗号組合せ(cipher suite)をWindows/macOS/Linux(strongSwan/xl2tpd)で接続確認」または「Win10 VPN接続時のNVR500 L2TP/IPsec ISAKMP復号鍵が壊れて表示」の通りcipher suitを組合せて接続する。
Windows PowerShell
Set-VpnConnectionIPsecConfiguration -ConnectionName "接続名" -DHGroup Group14 -PfsGroup PFS2048 -CipherTransformConstants AES128 -AuthenticationTransformConstants SHA1 -EncryptionMethod AES128 -IntegrityCheckMethod SHA1
「pfs=off」は、「-PfsGroup None」を指定
(3)確認結果
・「NVR510 L2TP/IPSec VPNの暗号組合せ(cipher suite)をWindows/macOS/Linux(strongSwan/xl2tpd)で接続確認」の通り、cipher suitが「IKE(aes-sha1)ESP(aes256-sha256)」「IKE(aes256-sha1)ESP(aes256-sha256)」の時、L2TP/IPSec接続が出来ないがNVR510のログに接続時のIKE複合鍵(要素)とSA復号鍵(要素)が記録される(NVR500も同様)。
・IKE(ISAKMP)復号鍵(要素)
Consoleから「show ipsec sa gateway 2 detail」でIKEの復号鍵(表中の灰色背景の「key」)が記録されるが「先頭の8 bytes」だけで「aes128/aes256」には利用できない。
復号鍵(要素)「SKEYID_e」が最大32bytesまで記録される(aes256超が無いので32bytes超は不明)。
aes128の時は、「SKEYID_e」の先頭から16bytes(128bit)を使用する。
aes256-sha256の時は、「SKEYID_e」を32Bytes分(256bit)をそのまま使用する。
aes256-sha1の時は、「SKEYID_e」鍵要素から256bit鍵を導出する必要がある。
また、Consoleの「show ipsec sa gateway 2 detail」で表示される「key」は、256Bit鍵の先頭8Bytes(64bit)で、「SKEYID_e」と一致しない。
「IKE:インターネット鍵交換(RFC2409)」の「補遺B」から鍵長が不足する場合、下記のように導出する。
Ka = K1 + K2 + K3
K1 = prf ( SKEYID_e, 0 )
K2 = prf ( SKEYID_e, K1 )
K3 = prf ( SKEYID_e, K2 )
# show ipsec sa gateway 2 detail
SA[1] Duration: 10767s
Local ID: 172.24.1.2
Remote ID: 172.24.1.3
Protocol: IKE
Algorithm: AES256-CBC, SHA-1, MODP 2048bit
NAT Traversal: On, Keepalive: 300s
SPI: 51 55 4f 46 a8 1b ea ca c6 3c 61 c6 95 9b 03 4e
Key: b8 3a c5 a8 79 33 a2 16
----------------------------------------------------
---- show log
2020/06/06 09:45:38: [IKE] CKY-I
2020/06/06 09:45:38: [IKE] 51 55 4f 46 a8 1b ea ca
2020/06/06 09:45:38: [IKE] CKY-R
2020/06/06 09:45:38: [IKE] c6 3c 61 c6 95 9b 03 4e
*** 一部削除 ***
2020/06/06 09:45:38: [IKE] SKEYID_e
2020/06/06 09:45:38: [IKE] 07 24 34 98 88 c9 d1 49 ce 76 28 bd 8d 4d a2 66
2020/06/06 09:45:38: [IKE] 82 42 50 ec
-----------------------------------------------------
---- opensslでaes256用の256bit鍵を確認する
macOS Mojave(10.14.6)のターミナル上で確認
$ SKEYID_e = 0724349888c9d149ce7628bd8d4da266824250ec
$ prf = hmac-sha1
$ echo -n "00" | xxd -r -p | openssl dgst -sha1 -mac hmac -macopt hexkey:0724349888c9d149ce7628bd8d4da266824250ec -binary -out K1.bin
$ cat K1.bin | openssl dgst -sha1 -mac hmac -macopt hexkey:0724349888c9d149ce7628bd8d4da266824250ec -binary -out K2.bin
$ cat k1.bin K2.bin | xxd -p -l 32 -c 32 > Ka.txt
$ cat Ka.txt
b83ac5a87933a2164b53313bea7880d362cc6e1928020250c87420040178ca24
AES256-SHA1のISAKMP(IKE)が復号される。
・ESP復号鍵(要素)
Consoleから「show ipsec sa gateway 2 detail」でSAの復号鍵(表中の灰色背景の「key」)が記録される。16bytesなのでAES128で使用できる。AES256では、鍵長不足。「show log」で記録される「key material」は、16bytesで「key」と同じ。「key for encryption」「key for authentication」は、先頭8 bytesで利用できない。
AES256では、鍵長が不足するので、下記のように導出する必要がある。
Km = K1 + K2 + K3
K1 = prf ( SKEYID_d, [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b )
K2 = prf ( SKEYID_d, K1 | [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b )
K3 = prf ( SKEYID_d, K2 | [ g(qm)^xy | ] protocol | SPI | Ni_b | Nr_b )
IKE=AES256-SHA1-modp1024/ESP=AES256-SHA1-modp1024で確認してみた。
# show ipsec sa gateway 2 detail
SA[1] Duration: 10600s
Local ID: 172.24.1.2
Remote ID: 172.24.1.3
Protocol: IKE
Algorithm: AES256-CBC, SHA-1, MODP 1024bit
NAT Traversal: On, Keepalive: 300s
SPI: dd f4 69 2e 19 95 32 c3 f3 b2 a4 6a f0 a1 75 ef
Key: a3 63 fe 13 d2 e0 b4 4b
----------------------------------------------------
SA[2] Duration: 3400s
Local ID: 172.24.1.2
Remote ID: 172.24.1.3
Direction: send
Protocol: ESP (Mode: transport)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA)
SPI: cd d1 5a 92
Key: c7 27 db b3 f7 c3 5b 82 d6 8b 23 73 18 bc a1 47
----------------------------------------------------
SA[3] Duration: 3400s
Local ID: 172.24.1.2
Remote ID: 172.24.1.3
Direction: receive
Protocol: ESP (Mode: transport)
Algorithm: AES256-CBC (for Auth.: HMAC-SHA)
SPI: 69 aa 4f 7c
Key: 1f 41 9c a6 c9 9e 14 47 a9 f7 82 7e 80 9d 0f ef
----------------------------------------------------
---- show log
2020/06/07 14:32:22: [IKE] generate IPsec key material
2020/06/07 14:32:22: [IKE] SKEYID_d
2020/06/07 14:32:22: [IKE] a8 d3 e4 38 22 e8 51 28 94 30 24 f5 54 d7 00 89
2020/06/07 14:32:22: [IKE] 84 10 23 e9
2020/06/07 14:32:22: [IKE] g(qm)^xy
2020/06/07 14:32:22: [IKE] 86 50 6d 21 b5 e9 9c 4e 8f 29 7e f0 6b bd 41 75
2020/06/07 14:32:22: [IKE] 57 a2 c0 5f 5a 2c 76 3e 56 ff 81 49 51 cf 02 39
2020/06/07 14:32:22: [IKE] 51 91 5d 5e e9 ac e4 b6 77 31 1d cf c4 6d 1f 6e
2020/06/07 14:32:22: [IKE] 99 33 e7 56 6d 37 1c 93 e2 b8 91 49 2f 36 0c 3d
2020/06/07 14:32:22: [IKE] 1d ed bc c8 5c f4 50 df a9 22 fd 10 f3 6a c5 ad
2020/06/07 14:32:22: [IKE] 8d b1 ac 8e 64 18 fa c6 42 31 f7 a9 00 15 9c bb
2020/06/07 14:32:22: [IKE] 91 25 dc eb 1c 00 c6 30 b4 87 ca f2 ea be 4f 84
2020/06/07 14:32:22: [IKE] d6 69 63 73 e7 77 57 f6 a8 a5 ff 98 8e 5d 60 fc
2020/06/07 14:32:22: [IKE] protocol = 3
2020/06/07 14:32:22: [IKE] SPI
2020/06/07 14:32:22: [IKE] cd d1 5a 92
2020/06/07 14:32:22: [IKE] Ni_b
2020/06/07 14:32:22: [IKE] da 57 bd 73 73 94 eb 15 88 ae cd 45 ed 8d 27 f9
2020/06/07 14:32:22: [IKE] 09 f3 94 6c 8d ba 62 0c 9e 47 61 b8 35 64 d3 a2
2020/06/07 14:32:22: [IKE] Nr_b
2020/06/07 14:32:22: [IKE] 50 26 5e d3 fa e2 c0 14 fd ca 18 47 45 ea 54 2e
2020/06/07 14:32:22: [IKE] 13 9d 66 bc 33 b3 c5 de 2b 22 1a 9c ad 37 4e 40
2020/06/07 14:32:22: [IKE] 3d ba 08 f4 52 41 79 1a 7b 39 bf 18 22 c1 cd f0
2020/06/07 14:32:22: [IKE] 00 32 b5 a3 ba 71 25 be 6a 4f 97 8f 6d 30 36 c7
2020/06/07 14:32:22: [IKE] key material (first 16byte)
2020/06/07 14:32:22: [IKE] c7 27 db b3 f7 c3 5b 82 d6 8b 23 73 18 bc a1 47
2020/06/07 14:32:22: [IKE] generate IPsec key material
2020/06/07 14:32:22: [IKE] SKEYID_d
2020/06/07 14:32:22: [IKE] a8 d3 e4 38 22 e8 51 28 94 30 24 f5 54 d7 00 89
2020/06/07 14:32:22: [IKE] 84 10 23 e9
2020/06/07 14:32:22: [IKE] g(qm)^xy
2020/06/07 14:32:22: [IKE] 86 50 6d 21 b5 e9 9c 4e 8f 29 7e f0 6b bd 41 75
2020/06/07 14:32:22: [IKE] 57 a2 c0 5f 5a 2c 76 3e 56 ff 81 49 51 cf 02 39
2020/06/07 14:32:22: [IKE] 51 91 5d 5e e9 ac e4 b6 77 31 1d cf c4 6d 1f 6e
2020/06/07 14:32:22: [IKE] 99 33 e7 56 6d 37 1c 93 e2 b8 91 49 2f 36 0c 3d
2020/06/07 14:32:22: [IKE] 1d ed bc c8 5c f4 50 df a9 22 fd 10 f3 6a c5 ad
2020/06/07 14:32:22: [IKE] 8d b1 ac 8e 64 18 fa c6 42 31 f7 a9 00 15 9c bb
2020/06/07 14:32:22: [IKE] 91 25 dc eb 1c 00 c6 30 b4 87 ca f2 ea be 4f 84
2020/06/07 14:32:22: [IKE] d6 69 63 73 e7 77 57 f6 a8 a5 ff 98 8e 5d 60 fc
2020/06/07 14:32:22: [IKE] protocol = 3
2020/06/07 14:32:22: [IKE] SPI
2020/06/07 14:32:22: [IKE] 69 aa 4f 7c
2020/06/07 14:32:22: [IKE] Ni_b
2020/06/07 14:32:22: [IKE] da 57 bd 73 73 94 eb 15 88 ae cd 45 ed 8d 27 f9
2020/06/07 14:32:22: [IKE] 09 f3 94 6c 8d ba 62 0c 9e 47 61 b8 35 64 d3 a2
2020/06/07 14:32:22: [IKE] Nr_b
2020/06/07 14:32:22: [IKE] 50 26 5e d3 fa e2 c0 14 fd ca 18 47 45 ea 54 2e
2020/06/07 14:32:22: [IKE] 13 9d 66 bc 33 b3 c5 de 2b 22 1a 9c ad 37 4e 40
2020/06/07 14:32:22: [IKE] 3d ba 08 f4 52 41 79 1a 7b 39 bf 18 22 c1 cd f0
2020/06/07 14:32:22: [IKE] 00 32 b5 a3 ba 71 25 be 6a 4f 97 8f 6d 30 36 c7
2020/06/07 14:32:22: [IKE] key material (first 16byte)
2020/06/07 14:32:22: [IKE] 1f 41 9c a6 c9 9e 14 47 a9 f7 82 7e 80 9d 0f ef
2020/06/07 14:32:22: [IKE] key for encryption (first 8byte)
2020/06/07 14:32:22: [IKE] c7 27 db b3 f7 c3 5b 82
2020/06/07 14:32:22: [IKE] key for authentication (first 8byte)
2020/06/07 14:32:22: [IKE] 14 4a 35 37 e2 cc 6d 38
2020/06/07 14:32:22: [IKE] add IPsec SA[2]
2020/06/07 14:32:22: [IKE] key for encryption (first 8byte)
2020/06/07 14:32:22: [IKE] 1f 41 9c a6 c9 9e 14 47
2020/06/07 14:32:22: [IKE] key for authentication (first 8byte)
2020/06/07 14:32:22: [IKE] dd 12 85 4a cd e3 3d 2a
2020/06/07 14:32:22: [IKE] add IPsec SA[3]
---- opensslでaes256用の256bit鍵を確認する
macOS Mojave(10.14.6)のターミナル上で確認
$ SKEYID_d = a8d3e43822e85128943024f554d70089841023e9
$ g_qm_xy = 86506d21b5e99c4e8f297ef06bbd417557a2c05f5a2c763e56ff814951cf023951915d5ee9ace4b677311dcfc46d1f6e9933e7566d371c93e2b891492f360c3d1dedbcc85cf450dfa922fd10f36ac5ad8db1ac8e6418fac64231f7a900159cbb9125dceb1c00c630b487caf2eabe4f84d6696373e77757f6a8a5ff988e5d60fc
$ protocol = 03
$ SPI_i = 69aa4f7c
$ SPI_r = cdd15a92
$ Ni_b = da57bd737394eb1588aecd45ed8d27f909f3946c8dba620c9e4761b83564d3a2
$ Nr_b = 50265ed3fae2c014fdca184745ea542e139d66bc33b3c5de2b221a9cad374e403dba08f45241791a7b39bf1822c1cdf00032b5a3ba7125be6a4f978f6d3036c7
$ prf = hmac-sha1
$ k1_i=$(echo -n $g_qm_xy$protocol$SPI_i$Ni_b$Nr_b | xxd -r -p | openssl dgst -sha1 -mac hmac -macopt hexkey:a8d3e43822e85128943024f554d70089841023e9)
$ k2_i=$(echo -n $k1_i$g_qm_xy$protocol$SPI_i$Ni_b$Nr_b | xxd -r -p | openssl dgst -sha1 -mac hmac -macopt hexkey:a8d3e43822e85128943024f554d70089841023e9)
$ km_i=$(echo -n $k1_i$k2_i | cut -c 1-64 )
$ echo $km_i
1f419ca6c99e1447a9f7827e809d0fefdc3c6e68199d95825f62ceadd38cd5ab
$ k1_r=$(echo -n $g_qm_xy$protocol$SPI_r$Ni_b$Nr_b | xxd -r -p | openssl dgst -sha1 -mac hmac -macopt hexkey:a8d3e43822e85128943024f554d70089841023e9)
$ k2_r=$(echo -n $k1_r$g_qm_xy$protocol$SPI_r$Ni_b$Nr_b | xxd -r -p | openssl dgst -sha1 -mac hmac -macopt hexkey:a8d3e43822e85128943024f554d70089841023e9)
$ km_r=$(echo -n $k1_r$k2_r | cut -c 1-64 )
$ echo $km_r
c727dbb3f7c35b82d68b237318bca14719367031d40de3968ead454b249dc05e
AES256-SHA1のESPパケットが復号される。
(4)記
「ネツエン」達の要求技術(知識)レベルが高すぎるので、
・「show ipsec sa gateway 2 detail」で表示される「key」は「復号出来る鍵長」で表示して欲しい。
・「ipsec ike log 2 key-info」の表示で、
「SKEYID_e」だけでなく「IKEv1 encryption key」を「復号できる鍵長」で表示して欲しい。
「g(qm)^xy」の「omitted」とせず、全体を記録して欲しい。
「SA」の「Key for encryption」と「key for authentication」を「復号できる鍵長」で表示して欲しい。