rabbit51

it's since Nov.30 2005
May.29 2014, transferred from broach

フレッツ「サービス情報サイト」がリニューアルされている

2019-03-29 16:58:58 | ネットワーク
フレッツ光ネクスト「サービス情報サイト」がリニューアルされていた。。。。
つい最近までこの画面だったのだが


突然この画面になった。。。おまけに「安全ではありません」と。。。


「https://」でアクセスしてみたら「403 Forbidden」


でも「鍵」マークが付いているのでサーバ証明書を確認してみる


「https://」への準備中かな。。。
「通知なしに変更をかけるのは、NTTらしくない」

--- 2019/05/02 追記
フレッツ「サービス情報サイト」がSSL対応した
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ぷららのプライベートホームページが「安全ではありません」・・・

2019-03-27 14:50:00 | ネットワーク
3月26日iOS12.2(16E227)がリリースされアップデートした


ぷららの「プライベートホームページ」で作成したサイトが


「安全ではありません」と表示されるようになった。。。。


macOS Sierraのsafari(12.1 [Mar.26, 2019])でも「安全ではありません」と


このサービスは、ユーザが(Let's Encrypt等で)独自にSSL化する事が出来ない。「ぷらら」の早急なSSL対応を期待する。

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Win10 VPN接続時のNVR500 L2TP/IPsec ISAKMP復号鍵が壊れて表示

2019-03-22 13:00:00 | NVR500
NVR500 L2TP/IPsec VPNサーバにWindows 10 VPNアプリから接続してみた。
NVR500は、Rev.11.00.38
Windows 10は、バージョン 1803/OSビルド 17136.619
Windows 10は、NAT Traversalが利用できるようレジストリに設定が必要である情報が多く見受ける。(HKLM¥SYSTEM¥CurrentControlSet¥Services¥PolicyAgent¥AssumeUDPEncapsulationContextOnSendRule=(DWORD)2)
確認してみたが、上記バージョンでは、設定不要である。

「L2TP」を選択し、
「VPNサーバアドレス」「共有鍵」と「ユーザ名」「ユーザパスワード」を設定


接続


WiresharkでL2TP/IPsecのパケットを解析するため「ヤマハNVR500のL2TP/IPsec VPNパケットをWiresharkで解析」で作成したLUAスクリプトでISAKMP/ESP復号鍵を抽出してみた。

NVR500の設定は、
(ISAKMP)部 [IKE sa]
ipsec ike encryption gateway_id 3des-cbc (default):[3des-cbc/des-cbc/aes-cbc/aes256-cbc]
ipsec ike group gateway_id mod1024 (default):[mod768/mod1024/mod1536/mod2048]
ipsec ike hash gateway_id sha (default):[sha256/sha/md5]
ipsec ike pfs gateway_id off (default):[on/off]
*応答側で動作する場合は、定義された選択肢内で相手側のproposalに合わせられる。端末側のproposalに従うため設定しない。
(ESP)部 [ESP sa]
ipsec sa policy policy_id gateway_id esp aes-cbc sha-hmac
(iOS/macOSは、sha256-hmacでエラーとなる。nvr500から有効な暗号鍵(first 16bytes に依存)を得るには、aes-cbc)

接続直後のNVR500
「show ipsec sa」
「show ipsec sa gateway 2 detail」
の結果(シリアルコンソール)

(ISAKMP)部 SA[1]で
  aes256-cbc
  sha-1
  modp2048

(ESP)部 SA[2]SA[3]で
  aes-cbc
  hmac-sha




LUAスクリプトの実行

結果、(ISAKMP)部の鍵が20Bytes(160bits)で抽出された。aes256-cbcなので32Bytes(256bits)のはずだが。。。

ログを確認してみると確かに「SKEY_ID」が20Bytesしか記録されていない

「show ipsec sa gateway 2 detail」で表示されるSA[1]のKEY 8Bytes とSKEY_ID値の先頭8Bytesと一致しない。この20BytesのデータでISAKMPデータを復号できない。

(ESP)部で記録される鍵は、aes-cbcのespデータを復号できる



iPhone6S(iOS)/macOS Sierra(iPhone6SでWiFiテザリング)で接続すると(ISAKMP) aes256-cbc/sha2-256/modp2048 (ESP) aes-cbc/hmac-shaで接続する。Windows10と(ISAKMP)部のIntegrityCheckMethodが異なる。
iOS/macOSと同じように(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続するようPowershellの「Set-VpnConnectionIPsecConfiguration」で指定してみた。

設定するパラメータは、「AuthenticationTransformConstants」「CipherTransformConstants」「DHGroup」「IntegrityCheckMethod」「PfsGroup」「EncryptionMethod」と「ConnectionName」で、全てを指定しないとエラーになる。

「AuthenticationTransformConstants」で「Accepted Values」に「SHA1」が見当たらない。

どうも「SHA1-96」を省略結合した「SHA196」が「SHA1」を示すようだ。指定値とし「SHA1」または「SHA196」。表示は、「SHA196」となる。

「IntegrityCheckMethod」では、「Accepted Values」に「SHA1」記載、解説には「SHA196」

指定値「SHA1」で表示値「SHA1」となる。

NVR500側の「aes-cbc」「aes256-cbc」「sha-hmac」「sha256-hmac」設定と「Set-VpnConnectionIPsecConfiguration」のパラメータ設定値の組み合わせで、接続結果を下表にまとめた。太字(ボールド)は、iOS/macOSで接続した時。セル背景グリーンは、Win10デフォルトでの接続時。




--- powershell command ---
設定変更
Set-VpnConnectionIPsecConfiguration -AuthenticationTransformConstants SHA1 -CipherTransformConstants AES128 -ConnectionName "L2TP IPsec on NVR500" -DHGroup Group14 -EncryptionMethod AES256 -IntegrityCheckMethod SHA256 -PfsGroup PFS2048

設定内容を確認
 (Get-VpnConnection -Name "L2TP IPsec on NVR500").IPSecCustomPolicy


初期値に戻す
 Set-VpnConnectionIPsecConfiguration -ConnectionName "L2TP IPsec on NVR500" -RevertToDefault
----------------

(ISAKMP)部でaes256-cbc/sha2-256/modp2048で接続されたことが確認できる


LUAスクリプトでログから鍵を抽出する。


「SKEYID_e」も32Bytes(256bits長)が記録される。キー値の先頭8Bytesと「show ipsec sa gateway 2 detail」の(ISAKMP)部KEY値が一致することを確認。


生成された「ikev1_decryption_table」「esp_sa」鍵ファイルをWiresharkに取込みパケット解析する。ISAKMP部が復号されているのを確認。



結果
NVR500のL2TP/IPsec接続で、ISAKMPフェーズ1で「SHA1」が選択されるとログに記録される復号鍵が壊れている


追記
上記接続表の斜体文字(Italic)で示した条件で接続するとISAKMPのフェーズ1でSA[1]が生成され、フェーズ2でSA[2](send)、SA[3](receive)のSAが生成される。さらにSA[4]なる接続を確立しようとしてタイムアウトで接続に失敗する。NVR500には、SA[1]-SA[3]が削除されSA[4]だけ残っているのが確認された。Win10側の挙動としては、接続失敗までに長い時間がかかる。その間に「show ipsec sa gateway 2 detail」でSAの状態が確認できる。下記例では、SA[4]が生成されていないが、接続失敗後にSA[3]が残っている。条件により異なるのだと思う。何れにしても「ヤマハ」さんが解決する事と思う。
(追記):SA[1],SA[2],SA[3]が生成され、接続失敗で、SA[1],SA[2]が削除され、SA[3]が残る。SA[3]が生存中に再度接続が行われるとSA[1],SA[2],SA[4]が生成され、再度接続失敗でSA[1],SA[2],SA[3]が削除され、SA[4]が残る。というような状況。


Powershellで条件を設定


Win10のVPN接続で「長い接続中表示」の後の接続失敗表示


接続中の「show ipsec sa」の結果


接続中の「show ipsec sa gateway 2 detail」の結果


接続失敗表示後の「show ipsec sa」と「show ipsec sa gateway 2 detail」の結果



コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

ヤマハNVR500のL2TP/IPsec VPNパケットをWiresharkで解析

2019-03-15 12:00:00 | NVR500
ヤマハNVR500にL2TP/IPsec VPN機能が追加されて約1年半が経った。利用しているISP(ぷらら)のIPv6 IPoE接続サービスが開始され快適なIPv6環境となった。IPv6経由のIKEv2/IPsec VPN接続環境も出来、IPv6環境でのMTUも確認した。MTU確認時にぷららIPv4 PPPoE接続のNVR500 L2TP/IPsec VPNパケットを解析した。NVR500のログから解析用の鍵をLUAスクリプトで抽出したのでメモしておく。


(1)NVR500でISAKMPとESP用鍵を記録する
L2TP/IPsec接続中に「show ipsec sa」でgateway_idを確認し「show ipsec sa gateway gateway_id detail」で鍵が表示されるらしい。iPhone(iOS 12.1.4)でAeon mobile(IIJ/Docomo)経由でL2TP/IPsec VPN接続し、sshで接続して確認してみる。

「Key: ** ** ** ** ** (confidential) ** ** ** ** **」?
「administrator」なのですが。。。
正当な表示者としての「秘密の合言葉(option argument)」でもあるのでしょうか?
Google調査してみるが、記述を見つけられない。。。
思い直して「シリアルコンソール」から表示してみると

コピー&ペーストだと手が掛かるので、シリアルコンソールから
「show ipsec sa gateway gateway_id detail > sd1:/local/ipsec-keys.txt」で書き出してみる。
おいおい、また、「Key: ** ** ** ** ** (confidential) ** ** ** ** **」!
「administrator」として認められていない。。。悲しい。。。
YAMAHA RTシリーズのFAQ / IPsec&IKE&VPNの「トラブルシューティング」「どうやって調べたらよいですか?」「 ipsec ike logコマンド」 に従い、「ipsec ike log gateway_id key-info」を設定し、「syslog debug on」。
iPhone(iOS12.1.4)は、ヤマハの動作確認済みクライアント一覧に従いAES256-CBC/SHA-HMACに設定し接続。

「show ipsec sa gateway gateway_id detail」の結果
このデータは、「show ipsec sa gateway gateway_id detail > ipsec-sa.txt」でファイル化出来ない.
copy&pastである。以下のログデータも含め「AES-CBC/SHA-HMAC」で接続した時のデータである。

ISAKMP部では、AES256-CBC/SHA256-HMACで処理が行われている。
Diffie-Hellman値は、modp2048が選択される。
ESP部は、指定されたAES-CBC/SHA-HMACが選択される。ISAKMP部でSHA256が扱えて、ESP部でSHA256が扱えない不思議。
Remote IDは、接続元のグローバルIPv4アドレス。
Local IDは、NAT後のイントラネット側IPv4アドレス。
ISAKMP部のSPIは、CKY-Iの8バイトとCKY-Rの8バイトを結合した16バイトの値が表示されている。Keyは、SKEYID_eの32バイトから先頭8バイトを表示。
ESP部のSPIは、SPIの8バイト。Keyは、key material (first 16 bytes)の16バイトを表示。AES256-CBCが選択されていてもKey materialは、16バイトしか表示されない。

このコマンド結果は、セキュリティ対策や暗号化方式の追加変更に伴い変更が十分な検討が行われていないように見受けられる。
AES256-CBC/SHA-HMAC接続時のデータ



ISAKMP部

NVR500のL2TP/IPsecのISAKMPは、IKEv1との事で、wiresharkが必要とする「CKY-I」値8バイトと「SKEYID_e」値32バイトの鍵データ(256bits)を取り出す。
AES256-CBC/SHA-HMAC接続時のデータ


ESP部

「Local ID -> Remote ID」(send)送信方向のSA情報(responder)としてSPI値4バイト。暗号化方式AES256-CBCの鍵「Key material」値32バイト(256bits)のはずだが、「(first 16 bytes)」って。。。。128bitsだがどうするの。。。
「Remote ID -> Local ID」(receive)受信方向のSA情報(initiator)としてSPI値4バイト。Key material値32バイトも「(first 16 bytes)」。。。
これでは、wiresharkで復号出来ない。
シリアルコンソールの「show ipsec sa gateway gateway_id detail」もAES256-CBCの鍵長16バイト。。。

認証確認用鍵は、「(first 8 bytes)」(64 bits)がログされている。SHA-HMACは、20 bytes(160 bits)で計算し、96 bitsが使用される。160 bitsに満たない鍵は、0x00で補完される。8 bytes(64 bits)で設定したが認証確認できないので鍵長不足と判断。このデータは使用しない。ただし、Wiresharkの「esp_sa」設定で「Authentication」が「NULL」指定だと認証確認データ長が確定出来ないようで、ESP復号がうまくいかない。「HMAC-SHA-1-96 [RFC2404]」を指定する。
AES256-CBC/SHA-HMAC接続時のデータ



L2TP/PPP部

L2TP/IPsec VPN接続が完了しても「Local ID」用のグローバルIPv4アドレスがログに記録されていない。
「show status pp 1」として「ぷららISP」へのPPPoE接続情報から得るしかない。
「Remote ID」用のグローバルIPv4アドレスは、ESP部の「respond IPsec phase to 163.49.207.102」ログで取得。

(2)鍵長対策
消極的対策として、「wiresharkパケット解析」するときだけ暗号化鍵長を短くする。。。
「詳細設定と情報」「VPN接続の設定」「VPN接続設定の修正(Anonymous)]」「VPN接続設定の 修正」「VPN Anonymous 接続 共通設定」で「暗号アルゴリズム=AES-CBC」とする。
または、「詳細設定と情報」「コマンドの実行」で「ipsec sa policy 2 2 esp aes-cbc sha-hmac」とする。
解析作業終了後は、「ipsec sa policy 2 2 esp aes256-cbc sha-hmac」で戻す。

(3)鍵抽出用LUAスクリプト
NVR500の外部メモリSD1をファイル共有設定している。
ここにLUAスクリプトを置き、wireshark用のISAKMP及びESP鍵ファイルを出力する。
Windows10からは、利用できない(レジストリ設定で利用できるらしい)が、Windows7あるいは、macOS(10.12.6)から利用できる。macOSでは、ファインダーで「移動」「サーバへ接続」「cifs://nvr500.familyname/local」

スクリプトは、rt.command("show log")でlogData変数にログを取込み解析する予定であったが、エラーとなる。そこで、一度ファイルに書き出し、再度変数に読み込む事で回避した。たまに、ファイル書き出しが終わる前に読み込みが実行されるとエラーになるので、rt.sleep()で時間調整が必要になる事もある。適宜対応する。
-------- GetNVR500ISAKMPESPKey.lua --------
--[[
	Mar.8 '2019 Rabbit51
	GetNvr500ISAKMPESPKey.lua
]]
logTmp = "sd1:/local/GetNvr500ESPlog.txt"
espsapath = "sd1:/local/"
local logData, iip, rip, ispi, rspi, ieky, reky, dt, r, m
local icky, isakmpkey
local sendconf, receiveconf

function loadLogFile(logfile)
	local handle = io.open(logfile,"r")
	local content=handle:read("*all")
	handle:close()
	return content
end

if arg[1] ~= nil then
    logData = loadLogFile(arg[1])
else
    r,m = rt.command("delete logTmp")
   if r == nil then rt.syslog("info","[LUA] "..arg[0].." "..m ) end
    r,m = rt.command("show log | grep 'IKE|L2TP|ANONYMOUS01' > "..logTmp)
    -- logファイルが生成される前にloadLogFile()が実行される場合にsleep()で時間調整
    -- rt.sleep(6)
    if r ~= nil then
        logData = loadLogFile(logTmp)
    else
        rt.syslog("info","[LUA] "..arg[0].." show log command error" )
		return r,m
    end
end

print("now matching...\r\f")

-- ISAKMP
local tcky, eky1, eky2
for tcky,eky1,eky2 in string.gmatch(logData, "%[IKE%] CKY%-I%s.-%[IKE%]   ([%w ]+)%s.-%[IKE%] SKEYID_e%s.-%[IKE%]   ([%w ]+)%s.-%[IKE%]   ([%w ]+)") do
	if tcky ~= nil then
		icky = string.gsub(tcky," ","")
		isakmpkey = string.gsub(eky1," ","")..string.gsub(eky2," ","")
	end
end

-- find last IKEv1 connection and get that global ip address and date
local pos = 1
while true do
	local pbt,pet,iipt,dtt = string.find(logData, "%[IKE%] respond IPsec phase to ([%d%.]+)%s-([%d/: ]+): ", pos)
	if pbt ~= nil then
		pb=pbt
		pe=pet
		iip = iipt
		dt = dtt
		pos = pet
	else
		break
	end
end
dt = string.gsub(dt,"[/: ]","")

-- get the SPI and the encryption key of Responder
local spi,ekey
pb,pe,spi,ekey = string.find(logData,"%[IKE%] SPI%s.-%[IKE%]   ([%w ]+).-%[IKE%] key material %(first 16byte%)%s.-%[IKE%]   ([%w ]+)",pe)
if pb ~= nil then
	rspi = spi
	rekey = ekey
	pos = pe
else
	rt.syslog("info","[LUA] "..arg[0].." No Responder SA...")
end
-- get the SPI and the encryption key of Initiator
pb,pe,spi,ekey = string.find(logData,"%[IKE%] SPI%s.-%[IKE%]   ([%w ]+).-%[IKE%] key material %(first 16byte%)%s.-%[IKE%]   ([%w ]+)",pe)
if pb ~= nil then
	ispi = spi
	iekey = ekey
else
	rt.syslog("info","[LUA] "..arg[0].." No Initiator SA...")
end
rspi=string.gsub(rspi," ","")
ispi=string.gsub(ispi," ","")
rekey=string.gsub(rekey," ","")
iekey=string.gsub(iekey," ","")

-- Get the Global IP Address of Responder
r,m = rt.command("show status pp 1")
if r == true then
	rip=string.match(m,"PP IP Address Local: ([%d%.]+),")
else
	rt.syslog("info","[LUA] "..arg[0].." "..m)
end

sendconf=string.format("%s,%s\n",icky, isakmpkey)
local fh,estr,ecode = io.open(espsapath..dt.."ikev1_decryption_table","w")
if fh == nil then
	fh:close()
	return nil,estr,ecode
else
	fh:write(sendconf)
	fh:close()
end

sendconf=string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv4",rip,iip,"0x"..rspi,"AES-CBC [RFC3602]","0x"..rekey,"HMAC-SHA-1-96 [RFC2404]","")
receiveconf=string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv4",iip,rip,"0x"..ispi,"AES-CBC [RFC3602]","0x"..iekey,"HMAC-SHA-1-96 [RFC2404]","")
fh,estr,ecode = io.open(espsapath..dt.."esp_sa","w")
if fh == nil then
	fh:close()
	return nil,estr,ecode
else
	fh:write(sendconf)
	fh:write(receiveconf)
	fh:close()
end

print("isakmp cookie id="..icky)
print("isakmp key="..isakmpkey)
print("Local IP Address -> "..rip)
print("Remote IP Address -> "..iip.."\r\fConnection date -> "..dt)
print("Responder SPI="..rspi.."\r\fResponder EKEY="..rekey)
print("Initiator SPI="..ispi.."\r\fInitiator EKEY="..iekey)


(4)Wiresharkでキャプチャ作業
NVR500の「コマンド実行」
「ipsec sa policy 2 2 esp aes-cbc sha-hmac」
「syslog debug on」

Wiresharkのキャプチャ実行
NVR500 L2TP/IPsec VPN 接続
*** キャプチャのための作業***
Wiresharkのキャプチャ終了
Wiresharkのキャプチャデータを保存

NVR500の「コマンド実行」
「ipsec sa policy 2 2 esp aes256-cbc sha-hmac」
「syslog debug off」
「lua sd1:/local/GetNvr500ISAKMPESPKey.lua」
実行結果が表示されないので、ファイル生成を確認
「show file list sd1:/local」

Wiresharkの実行PC(Macbook pro)上で
「cat /Volumes/local/20190313220052ikev1_decryption_table >> .wireshark/ikev1_decryption_table」
「cat /Volumes/local/20190313220052esp_sa >> .wireshark/esp_sa」
Wiresharkの再起動(終了起動)し保存したキャプチャデータの読込
パケットの解析

メモ1: 「syslog debug on」の状態だとwindows10のdhcpcからnvr500の知らない「[DHCPv6] unsupported option vender-opts(0x11)」通知メールが出続けるので「syslog debug off」必須。


--- 2019/04/18追記:
Win10 VPN接続時のNVR500 L2TP/IPsec ISAKMP復号鍵が壊れて表示
コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

Strongswan IKEv2 IPsec VPNパケットをWiresharkで解析

2019-03-12 17:18:26 | ネットワーク
Buffalo WZR-HP-G300NHをOpenWrt化Strongswan IKEv2 IPsec VPNサーバをIPv6経由で利用出来るよう設置した。VPN接続時のMTUを確認するためWiresharkでパケットキャプチャ解析した。IKEv2 IPsecパケットは、暗号化されているため、復号処理し解析する必要がある。Wiresharkで復号処理する方法は、沢山解説されている。要は、復号用の鍵を設定するのだが、接続毎に鍵が変わるので手間がかかる。

 WiresharkのISAKMPとESP用復号鍵は、「ikev1_decryption_table」「ikev2_decryption_table」「esp_sa」に設定されている。CSV設定されているので、Strongswanのログから必要な鍵を抽出してCSVレコードとして書き出すLUAスクリプトを用意してみた。

(1)Strongswanの設定
StrongswanのログデータにISAKMPとESP鍵を記録させるために「/etc/ipsec.conf」の「cofig setup」に「charondebug="cfg 2,ike 4,chd 4"」を追加する。ISAKMP鍵は、「IKE」のログレベルを「4」。ESP鍵は、「CHD」のログレベルを「4」。接続時の暗号方式と認証確認方式を記録させるため「CFG」ログレベルを「2」とした。

(2)iPhone(iOS 12.1.4)でIKEv2/IPsec VPN接続時のログ
復号処理に必要な鍵情報を赤文字とした

-------- [ CFG 2 ] --------
Tue Mar 12 14:11:09 2019 daemon.info : 14[CFG] selected proposal: IKE:AES_CBC_256/HMAC_SHA2_256_128/PRF_HMAC_SHA2_256/MODP_2048
Tue Mar 12 14:11:12 2019 daemon.info : 15[CFG] looking for peer configs matching *****

Tue Mar 12 14:11:12 2019 daemon.info : 06[CFG] selected proposal: ESP:AES_CBC_256/HMAC_SHA2_256_128/NO_EXT_SEQ
Tue Mar 12 14:11:12 2019 daemon.info : 06[CFG] selecting traffic selectors for us:

-------- [ IKE 4 ] --------
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] Sk_ai secret => 32 bytes @ 0x005a2e70
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: B8 1C 6B A0 32 89 BB 67 0F CC B5 A4 A4 88 12 C9 ..k.2..g........
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: B6 2B AC C4 CA 46 19 6C 1E 5A 75 E6 9B 3D 27 2F .+...F.l.Zu..='/
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] Sk_ar secret => 32 bytes @ 0x005a2ea0
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: 62 72 A6 FC 36 C2 74 85 32 B4 E2 02 75 78 E3 82 br..6.t.2...ux..
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: 47 D4 EB BA 71 56 CD B0 74 4A 0A 2A A7 71 E1 9C G...qV..tJ.*.q..
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] Sk_ei secret => 32 bytes @ 0x005a2ed0
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: 7E 57 77 E4 DB 65 07 7B 96 25 42 E1 CB E6 06 C5 ~Ww..e.{.%B.....
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: 77 F2 E1 C6 DF 3F FD B3 CA 94 FD E1 2B 0F 78 CE w....?......+.x.
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] Sk_er secret => 32 bytes @ 0x005a3d40
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: 4C 10 59 FE B8 4F E0 55 36 62 9D A3 A1 B8 23 9A L.Y..O.U6b....#.
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: 08 33 18 88 01 60 82 C4 FE 22 66 39 C9 60 31 DC .3...`..."f9.`1.

Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] Sk_pr secret => 32 bytes @ 0x005a2e70
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: 97 CC D2 94 F6 96 0A 80 0F 8C AC 94 EF DE 9A B5 ................
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: 1A 3E 5D 30 2C 8B 05 79 EB E4 DE 08 90 AC DB A3 .>]0,..y........
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] natd_chunk => 34 bytes @ 0x005a1610
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 0: CF 08 AB 72 6A EC 61 CF 9F 29 96 8F AE E8 06 C1 ...rj.a..)......
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 16: 24 09 00 10 XX XX YY 20 00 00 00 00 00 12 00 01 $....@. ........
Tue Mar 12 14:11:11 2019 daemon.info : 14[IKE] 32: 01 F4 ..

-------- [ CHD 4 ] --------
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] CHILD_SA eap-id-passwd{1} state change: CREATED => INSTALLING
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] using AES_CBC for encryption
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] using HMAC_SHA2_256_128 for integrity
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] seed => 48 bytes @ 0x76f07970
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 0: 77 42 E3 E8 58 F4 0F 6E 52 F1 B6 EB 48 B8 B7 62 wB..X..nR...H..b
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 16: 2E A9 D1 6B 2F 03 92 0C 83 B3 F5 52 84 8F 92 8A ...k/......R....
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 32: BA 72 D7 01 3C B1 4A 05 B3 27 B8 84 91 54 03 33 .r..<.J..'...T.3
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] encryption initiator key => 32 bytes @ 0x0059edf0
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 0: C5 B6 26 B7 E9 AB E8 58 05 C5 44 51 63 C3 55 08 ..&....X..DQc.U.
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 16: EC 1D 7F 49 65 51 E1 2A 28 31 A4 CC 7F 3A 7F EB ...IeQ.*(1...:..
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] encryption responder key => 32 bytes @ 0x0059ee50
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 0: BB C3 BB 8D 32 B6 3B A2 25 D9 E7 C3 E3 91 61 B0 ....2.;.%.....a.
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 16: 63 55 73 39 23 EC 3D 2B 76 96 FC 56 51 B5 8C 80 cUs9#.=+v..VQ...
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] integrity initiator key => 32 bytes @ 0x0059ee20
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 0: C5 9B CC 73 5D BC C9 54 1A 5B 5F C7 65 D2 EB 06 ...s]..T.[_.e...
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 16: CA 30 21 2D 1E 7A F1 F6 B1 93 D1 E2 FE 04 F0 CF .0!-.z..........
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] integrity responder key => 32 bytes @ 0x005a10b0
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 0: 36 C0 25 E9 23 88 07 C5 70 11 B2 D2 66 1F 56 1D 6.%.#...p...f.V.
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] 16: 7A CF D4 80 C4 E5 DF BF FC AB 40 35 97 0C F3 E5 z.........@5....
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] adding inbound ESP SA
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] SPI 0xc1e902e4, src 2001:240:2407:23f2:8c4a:9b67:bcfd:9f04 dst 2409:10:XXXX:YY20::12:1
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] adding outbound ESP SA
Tue Mar 12 14:11:12 2019 daemon.info : 06[CHD] SPI 0x0361a0b3, src 2409:10:XXXX:YY20::12:1 dst 2001:240:2407:23f2:8c4a:9b67:bcfd:9f04
-
---------------

(3)Wireshark用鍵データ
鍵データは、iPhone(iOS)、macOS、Windows10用として生成する(暗号化方式と認証確認方式を限定)
Windowsでは、「%APPDATA%¥Wireshark」ディレクトリ
macOSでは、「/Users/<username>/.wireshark」ディレクトリ
に配置される「ikev2_decryption_table」及び「esp_sa」ファイルにマージした後、wiresharkを起動するか「設定プロファイル」を設定し直す事で取り込まれる。

ikev2_encryption_table
CF08AB726AEC61CF,9F29968FAEE806C1,7E5777E4DB65077B962542E1CBE606C577F2E1C6DF3FFDB3CA94FDE12B0F78CE,4C1059FEB84FE05536629DA3A1B8239A08331888016082C4FE226639C96031DC,"AES-CBC-256 [RFC3602]",B81C6BA03289BB670FCCB5A4A48812C9B62BACC4CA46196C1E5A75E69B3D272F,6272A6FC36C2748532B4E2027578E38247D4EBBA7156CDB0744A0A2AA771E19C,"HMAC_SHA2_256_128 [RFC4868]"

esp_sa
"IPv6","2001:240:2407:23f2:8c4a:9b67:bcfd:9f04","2409:10:XXXX:YY20::12:1","0xc1e902e4","AES-CBC [RFC3602]","0xC5B626B7E9ABE85805C5445163C35508EC1D7F496551E12A2831A4CC7F3A7FEB","HMAC-SHA-256-128 [RFC4868]","0xC59BCC735DBCC9541A5B5FC765D2EB06CA30212D1E7AF1F6B193D1E2FE04F0CF"
"IPv6","2409:10:XXXX:YY20::12:1","2001:240:2407:23f2:8c4a:9b67:bcfd:9f04","0x0361a0b3","AES-CBC [RFC3602]","0xBBC3BB8D32B63BA225D9E7C3E39161B06355733923EC3D2B7696FC5651B58C80","HMAC-SHA-256-128 [RFC4868]","0x36C025E9238807C57011B2D2661F561D7ACFD480C4E5DFBFFCAB4035970CF3E5"

(4)LUAスクリプト
Strongswanが動作するOpenWrtのコマンドラインで実行する(コードの整理整頓はしていない)。キャプチャ日時は、IKEv2/IPsec VPN接続で暗号化方式と認証確認方式が選択された時点とした。「string.gmatch()」のパターンで日時を先にすると時間が掛かるため、暗号化方式や認証確認方式が選択された行の次行日時をキャプチャした。抽出する鍵は、ログデータの最後に記録された情報とした。

-------- 実行結果 --------
root@OpenWrt:~# lua GetISAKMPKeys.lua
Captured date: Mar 12 14:11:11 2019
Encryption: AES_CBC_256
Authentication: HMAC_SHA2_256_128

SPi=CF08AB726AEC61CF
SPr=9F29968FAEE806C1
ei=7E5777E4DB65077B962542E1CBE606C577F2E1C6DF3FFDB3CA94FDE12B0F78CE
er=4C1059FEB84FE05536629DA3A1B8239A08331888016082C4FE226639C96031DC
ai=B81C6BA03289BB670FCCB5A4A48812C9B62BACC4CA46196C1E5A75E69B3D272F
ar=6272A6FC36C2748532B4E2027578E38247D4EBBA7156CDB0744A0A2AA771E19C

CF08AB726AEC61CF,9F29968FAEE806C1,7E5777E4DB65077B962542E1CBE606C577F2E1C6DF3FFDB3CA94FDE12B0F78CE,4C1059FEB84FE05536629DA3A1B8239A08331888016082C4FE226639C96031DC,"AES-CBC-256 [RFC3602]",B81C6BA03289BB670FCCB5A4A48812C9B62BACC4CA46196C1E5A75E69B3D272F,6272A6FC36C2748532B4E2027578E38247D4EBBA7156CDB0744A0A2AA771E19C,"HMAC_SHA2_256_128 [RFC4868]"

root@OpenWrt:~# lua GetESPKeys.lua
Captured date: Mar 12 14:11:12 2019
Encryption: AES_CBC_256
Authentication: HMAC_SHA2_256_128
encryption=AES-CBC [RFC3602]
integrity=HMAC-SHA-256-128 [RFC4868]

SPi=0xc1e902e4
sri=2001:240:2407:23f2:8c4a:9b67:bcfd:9f04
dsi=2409:10:XXXX:YY20::12:1

SPo=0x0361a0b3
sro=2409:10:XXXX:YY20::12:1
dso=2001:240:2407:23f2:8c4a:9b67:bcfd:9f04

eni=0xC5B626B7E9ABE85805C5445163C35508EC1D7F496551E12A2831A4CC7F3A7FEB
enr=0xBBC3BB8D32B63BA225D9E7C3E39161B06355733923EC3D2B7696FC5651B58C80
ini=0xC59BCC735DBCC9541A5B5FC765D2EB06CA30212D1E7AF1F6B193D1E2FE04F0CF
inr=0x36C025E9238807C57011B2D2661F561D7ACFD480C4E5DFBFFCAB4035970CF3E5

"IPv6","2001:240:2407:23f2:8c4a:9b67:bcfd:9f04","2409:10:XXXX:YY20::12:1","0xc1e902e4","AES-CBC [RFC3602]","0xC5B626B7E9ABE85805C5445163C35508EC1D7F496551E12A2831A4CC7F3A7FEB","HMAC-SHA-256-128 [RFC4868]","0xC59BCC735DBCC9541A5B5FC765D2EB06CA30212D1E7AF1F6B193D1E2FE04F0CF"

"IPv6","2409:10:XXXX:YY20::12:1","2001:240:2407:23f2:8c4a:9b67:bcfd:9f04","0x0361a0b3","AES-CBC [RFC3602]","0xBBC3BB8D32B63BA225D9E7C3E39161B06355733923EC3D2B7696FC5651B58C80","HMAC-SHA-256-128 [RFC4868]","0x36C025E9238807C57011B2D2661F561D7ACFD480C4E5DFBFFCAB4035970CF3E5"
-------- GetISAKMPKeys.lua --------
function execCommand(command)
	local handle = io.popen(command,"r")
	local content=handle:read("*all")
	handle:close()
	return content
end
-- get the last matched keys
function getKey(str,pattern)
        local xl,yl,zl,x,y,z
        for x,y,z in string.gmatch(str,pattern) do
                xl = x
                yl = y
                zl = z
        end
        return xl, yl, zl
end
-- strongswan log charondebug="CFG 2,IKE 4,CHD 4"
if arg[1] ~= nil then    
        local fh=io.open(arg[1],"r")
        logResult = fh:read("*a")   
        fh:close()                  
else                                
        -- Get system log of strongswan
        local logcmd = 'logread -e "\\[[IC][KF][EG]\\]"'
        logResult=execCommand(logcmd)                
end                                 
-- captured date and encryption, authentication                                                                                  
local m = {Jan="01";Feb="02";Mar="03";Apr="04";May="05";Jun="06";Jul="07";Aug="08";Sep="09";Oct="10";Nov="11";Dec="12" }         
local enc,auth,dtx = getKey(logResult,"selected %a+: IKE:([%w_]+)/([%w_]+)/.-%w ([%w: ]+) daemon")                               
local mon,dd,hh,mm,ss,yy = string.match(dtx,"(%w+) (%d+) (%d+):(%d+):(%d+) (%d+)")                                               
local dt=yy..m[mon]..dd..hh..mm..ss                                                                                              
print("Captured date: "..dtx)                                                                                                    
print("Encryption: "..enc.."\nAuthentication: "..auth.."\n")

local x,y = getKey(logResult,"Sk_ai.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local ai=string.gsub(x..y," ","")
x,y = getKey(logResult,"Sk_ar.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local ar=string.gsub(x..y," ","")
x,y = getKey(logResult,"Sk_ei.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local ei=string.gsub(x..y," ","")
x,y = getKey(logResult,"Sk_er.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local er=string.gsub(x..y," ","")

x = getKey(logResult,"Sk_pr.-natd_chunk.-0: ([%x ]+)  ")
x = string.gsub(x," ","")
local spr = string.sub(x,17,32)
local spi = string.sub(x,1,16)

-- write out the key data for wireshark                                         
local fh,estr,ecode  = io.open(dt.."ikev2_decryption_table","w")                                    
if fh == nil then                                                               
        fh:close()                                                              
        return nil, estr, ecode                                                 
else                                                                            
        fh:write(string.format("%s,%s,%s,%s,%q,%s,%s,%q\n",spi,spr,ei,er,"AES-CBC-256 [RFC3602]",ai,ar,"HMAC_SHA2_256_128 [RFC4868]"))
        fh:close()                                                              
end        

print(string.format(" SPi=%s\nSPr=%s\nei=%s\ner=%s\nai=%s\nar=%s\n",spi,spr,ei,er,ai,ar))
print(string.format("%s,%s,%s,%s,%q,%s,%s,%q\n",spi,spr,ei,er,"AES-CBC-256 [RFC3602]",ai,ar,"HMAC_SHA2_256_128 [RFC4868]"))
----------------



-------- GetESPKeys.lua --------
function execCommand(command)
	local handle = io.popen(command,"r")
	local content=handle:read("*all")
	handle:close()
	return content
end
-- get the last matched keys
function getKey(str,pattern)
	local xl,yl,zl,x,y,z
	for x,y,z in string.gmatch(str,pattern) do
		xl = x
		yl = y
		zl = z
	end
	return xl, yl, zl
end

if arg[1] ~= nil then
	local fh=io.open(arg[1],"r")
	logResult = fh:read("*a")
	fh:close()
else
	-- Get system log of strongswan charondebug="CFG 2,IKE 4,CHD 4"
	local logcmd = 'logread -e "\\[C[HF][DG]\\]"'
	logResult=execCommand(logcmd)
end
-- captured date and encryption, authentication
local m = {Jan="01";Feb="02";Mar="03";Apr="04";May="05";Jun="06";Jul="07";Aug="08";Sep="09";Oct="10";Nov="11";Dec="12" }
local enc,auth,dtx = getKey(logResult,"selected %a+: ESP:([%w_]+)/([%w_]+).-%w+ ([%w: ]+) daemon")
local mon,dd,hh,mm,ss,yy = string.match(dtx,"(%w+) (%d+) (%d+):(%d+):(%d+) (%d+)")
local dt=yy..m[mon]..dd..hh..mm..ss
print("Captured date: "..dtx)
print("Encryption: "..enc.."\nAuthentication: "..auth)

-- picking up keys
local x,y = getKey(logResult,"encryption initiator.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local eni=string.gsub(x..y," ","")
x,y = getKey(logResult,"encryption responder.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local enr=string.gsub(x..y," ","")
x,y = getKey(logResult,"integrity initiator.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local ini=string.gsub(x..y," ","")
x,y = getKey(logResult,"integrity responder.-0: ([%x ]+)  .- 16: ([%x ]+)  ")
local inr=string.gsub(x..y," ","")

local z
x,y,z = getKey(logResult,"inbound ESP SA.-SPI (0x[%x]+), src ([%x:]+) dst ([%x:]+)")
local SPi = x
local sri = y
local dsi = z
x,y,z = getKey(logResult,"outbound ESP SA.-SPI (0x[%x]+), src ([%x:]+) dst ([%x:]+)")
local SPo = x
local sro = y
local dso = z

x,y = getKey(logResult,"CHILD_SA.-using ([%w_]+) for.-using ([%w_]+) for")
local encryption=x
local integrity=y

if x == "AES_CBC" then
	encryption = "AES-CBC [RFC3602]"
else
	encryption = "NULL"
end

local xx,yy = string.match(y,"HMAC_SHA2_(%d+)_(%d+)")
if y == "HMAC_SHA1_96" then
	integrity = "HMAC-SHA-1-96 [RFC2404]"
elseif  string.match(y,"HMAC_SHA2_") ~= nill then
	integrity = "HMAC-SHA-"..xx.."-"..yy.." [RFC4868]"
else
	integrity = "NULL"
end

-- write out the key data for wireshark
local fh,estr,ecode  = io.open(dt.."esp_sa","w")
if fh == nil then
	fh:close()
	return nil, estr, ecode
else
	fh:write(string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv6",sri,dsi,SPi,encryption,"0x"..eni,integrity,"0x"..ini))
	fh:write(string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv6",sro,dso,SPo,encryption,"0x"..enr,integrity,"0x"..inr))
	fh:close()
end

print(string.format(" encryption=%s\nintegrity=%s\n",encryption,integrity))
print(string.format(" SPi=%s\nsri=%s\ndsi=%s\n",SPi,sri,dsi))
print(string.format(" SPo=%s\nsro=%s\ndso=%s\n",SPo,sro,dso))
print(string.format(" eni=0x%s\nenr=0x%s\nini=0x%s\ninr=0x%s\n",eni,enr,ini,inr))
print(string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv6",sri,dsi,SPi,encryption,"0x"..eni,integrity,"0x"..ini))
print(string.format("%q,%q,%q,%q,%q,%q,%q,%q\n","IPv6",sro,dso,SPo,encryption,"0x"..enr,integrity,"0x"..inr))
----------------

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする