• R/O
  • HTTP
  • SSH
  • HTTPS

Commit

Tags
No Tags

Frequently used words (click to add to your profile)

javaandroidc++objective-ccocoa誰得c#linuxgamebathyscaphephp翻訳qtrubycwindowspythonomegattwitterguiframeworkbtronarduinovb.netdirectxtestゲームエンジンdom計画中(planning stage)previewer

Tera Termの個人的な作業用リポジトリ


Commit MetaInfo

Revision1331f91740e604a803b8412dc6a5c8ee7f5a3eff (tree)
Time2018-03-08 13:15:32
AuthorIWAMOTO Kouichi <sue@iwmt...>
CommiterIWAMOTO Kouichi

Log Message

KEX の Client Secret を記録できるようにした。

Wireshark でこれを利用して、SSH 通信の復号をできるようにするのが目標。
フォーマットは NSS Key Log Format (*1) を参考に、以下のようにした。

<Label> <space> <ClientCookie> <space> <Secret>

・<Label> は <Secret> が何かの説明
・<ClientCookie> はクライアントが送信する SSH_MSG_KEXINIT の cookie を

16 進数表記した32バイトのデータ

・<Secret> は <Lable> によって変わる

<Label> は現在のところ以下がある。

・CLIENT_SECRET: DH や ECDH の Client Secret を 16 進表記したもの
・SHARED_SECRET: DH や ECDH で共有された Shared Secret を 16進表記したもの
・EXCHANGE_HASH: 鍵交換の結果得られた Exchange-Hash を 16進表記したもの

現在のところ、CLIENT_SECRET のみ出力するようになっている。
SHARED_SECRET や EXCHANGE_HASH は CLIENT_SECRET と通信内容があれば計算が
出来るので、その計算の手間を省く為の参考情報。

*1: https://developer.mozilla.org/en-US/docs/Mozilla/Projects/NSS/Key_Log_Format

Change Summary

Incremental Difference

--- a/ttssh2/ttxssh/ssh.c
+++ b/ttssh2/ttxssh/ssh.c
@@ -62,6 +62,7 @@
6262
6363 #include <direct.h>
6464 #include <io.h>
65+#include <fcntl.h>
6566
6667 // SSH2 macro
6768 #ifdef _DEBUG
@@ -607,6 +608,31 @@ void push_bignum_memdump(char *name, char *desc, BIGNUM *bignum)
607608 free(buf); // free
608609 }
609610
611+log_kex_key(PTInstVar pvar, char *type, char *msg)
612+{
613+ int fd, i;
614+ unsigned char buff[4], *cookie;
615+
616+ if (pvar->settings.KexKeyLogging && pvar->settings.KexKeyLogFile[0] != 0) {
617+ fd = _open(pvar->settings.KexKeyLogFile,
618+ _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
619+ _S_IREAD | _S_IWRITE);
620+ if (fd >= 0) {
621+ cookie = pvar->crypt_state.server_cookie;
622+ _write(fd, type, strlen(type));
623+ _write(fd, " ", 1);
624+ for (i=0; i<16; i++) {
625+ _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%02x", cookie[i]);
626+ _write(fd, buff, 2);
627+ }
628+ _write(fd, " ", 1);
629+ _write(fd, msg, strlen(msg));
630+ _write(fd, "\n", 1);
631+ _close(fd);
632+ }
633+ }
634+}
635+
610636 static unsigned int get_predecryption_amount(PTInstVar pvar)
611637 {
612638 static int small_block_decryption_sizes[] = { 5, 5, 6, 6, 8 };
@@ -5343,6 +5369,7 @@ static void SSH2_dh_kex_init(PTInstVar pvar)
53435369
53445370 // 秘密にすべき乱数(X)を生成
53455371 dh_gen_key(pvar, dh, pvar->we_need);
5372+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(dh->priv_key));
53465373
53475374 msg = buffer_init();
53485375 if (msg == NULL) {
@@ -5571,6 +5598,8 @@ static BOOL handle_SSH2_dh_gex_group(PTInstVar pvar)
55715598 // 秘密にすべき乱数(X)を生成
55725599 dh_gen_key(pvar, dh, pvar->we_need);
55735600
5601+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(dh->priv_key));
5602+
55745603 // 公開鍵をサーバへ送信
55755604 msg = buffer_init();
55765605 if (msg == NULL) {
@@ -5637,6 +5666,7 @@ static void SSH2_ecdh_kex_init(PTInstVar pvar)
56375666 }
56385667 group = EC_KEY_get0_group(client_key);
56395668
5669+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(EC_KEY_get0_private_key(client_key)));
56405670
56415671 msg = buffer_init();
56425672 if (msg == NULL) {
--- a/ttssh2/ttxssh/ttxssh.c
+++ b/ttssh2/ttxssh/ttxssh.c
@@ -544,6 +544,14 @@ static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
544544
545545 settings->AuthBanner = GetPrivateProfileInt("TTSSH", "AuthBanner", 1, fileName);
546546
547+ read_string_option(fileName, "KexKeyLogFile", "", settings->KexKeyLogFile, sizeof(settings->KexKeyLogFile));
548+ if (settings->KexKeyLogFile[0] == 0) {
549+ settings->KexKeyLogging = 0;
550+ }
551+ else {
552+ settings->KexKeyLogging = GetPrivateProfileInt("TTSSH", "KexKeyLogging", 0, fileName);
553+ }
554+
547555 clear_local_settings(pvar);
548556 }
549557
--- a/ttssh2/ttxssh/ttxssh.h
+++ b/ttssh2/ttxssh/ttxssh.h
@@ -194,6 +194,9 @@ typedef struct _TS_SSH {
194194 int GexMinimalGroupSize;
195195
196196 int AuthBanner;
197+
198+ BOOL KexKeyLogging;
199+ char KexKeyLogFile[1024];
197200 } TS_SSH;
198201
199202 typedef struct _TInstVar {