はじめに
WireSharkでIKEトンネルを復号化する方法を調べてみましたので、ご紹介します。1, 2
VPNサーバとして、strongSwanとSoftEther VPNを取り上げます。
IKEのシーケンス
IKEはフェーズ1の第5メッセージ以降、ISAKMP SAで暗号化されます。したがって、それ以降のシーケンスをWireSharkでキャプチャして動作を確認しようとしても、暗号化されていて、読むことができません。このISAKMP SAにより暗号化されている部分を復号化する方法をご紹介します。
通常、以下のように暗号化されたことだけが表示されます。
復号化のためには、暗号化に用いられた鍵の取得が必要です。
strongswanで暗号化鍵を取得する方法
strongSwanが動作しているサーバでログレベルを変更します。
# strongswan stroke loglevel ike 4
IPSec接続した後に、ログを確認すると、以下のように出力されているはずですので、5F...59の部分と13...73の部分が鍵文字列になりますので、これをコピーしておきます。
Nov 15 11:18:31 ip-10-0-1-99 charon: 14[IKE] encryption key Ka => 32 bytes @ 0x1aef120
Nov 15 11:18:31 ip-10-0-1-99 charon: 14[IKE] 0: 5F D2 67 B3 28 10 52 EC B5 3B 14 84 A5 1A 71 59 _.g.(.R..;....qY
Nov 15 11:18:31 ip-10-0-1-99 charon: 14[IKE] 16: 13 25 86 3F 9E 41 7C 0C A9 34 C2 BA B8 27 EB 73
SoftEther VPNで暗号化鍵を取得する方法
SoftEther VPNではstrongSwanのようにログ出力されないようですので(やり方はあるかも)、少々強引に、ソースコードを編集してキーを出力させます。
- Linux版
- ソースからインストール
インストールされているディレクトリで以下のようにソースコードを編集、キーを取得
# vpnserver stop
# vim src/Cedar/IPsec_IKE.c
(3700行前後、sa-CryptoKey = ...のコードの後で以下を挿入)
BinToStrEx(tmp, sizeof(tmp), sa->CryptoKey->Data, sa->CryptoKey->Size);
FILE *file;
file = fopen("/tmp/test.txt", "a");
fprintf(file, tmp);
fclose(file);
# make; make install; vpnserver start
# cat /tmp/test.txt
008B 32 D7 DA 44 79 86 24 FB 48 B0 96 77 7F E2 05 0E AC C2 60 D0 7C A7 212c0d83c02c0d8cf0
(↑でいう、8B...21がキーなのでこれをコピーしておく)
鍵取得後の復号化の方法
- VPN接続を試験し、その時のパケットキャプチャを取得する
- 切断/キャプチャ停止後、Edit->Preferences->Protocols->ISAKMP->IKEv1 Decryption Table [Edit]
- Initiator's COOKIEをキャプチャファイルのISAKMPヘッダより確認し、入力。Encryption Keyに上記で取得したキーを入力し、「OK」押下
- 正しく処理されれば以下のように暗号化部分が復号化されて表示される
参考
IPsec(ISAKMP、ESP)の復号化手順 - sai’s diary
http://saitoh.hatenablog.jp/entry/2014/09/29/022926
オーム社
売り上げランキング: 195,690