WireSharkでIKEトンネルを復号化するメモ


はじめに

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がキーなのでこれをコピーしておく)

鍵取得後の復号化の方法

  1. VPN接続を試験し、その時のパケットキャプチャを取得する
  2. 切断/キャプチャ停止後、Edit->Preferences->Protocols->ISAKMP->IKEv1 Decryption Table [Edit]
  3. Initiator's COOKIEをキャプチャファイルのISAKMPヘッダより確認し、入力。Encryption Keyに上記で取得したキーを入力し、「OK」押下
  4. 正しく処理されれば以下のように暗号化部分が復号化されて表示される

参考

IPsec(ISAKMP、ESP)の復号化手順 - sai’s diary
http://saitoh.hatenablog.jp/entry/2014/09/29/022926
 

マスタリングTCP/IP IPsec編
谷口 功 水澤 紀子
オーム社
売り上げランキング: 195,690

  1. Windowsであれば、ESPトンネルについてはMicrosoft Message Analyzerにより簡単に復号化できます。 

  2. 本手順を実施しても、WireShark 1.系では安定して復号処理が行えませんでしたが、WireShark 2.系であれば、安定して複合処理が行えました。WireSharkは2.系になって非常に高速/軽量になりました。バグも多数改善されたようです。