• R/O
  • HTTP
  • SSH
  • HTTPS

提交

标签
No Tags

Frequently used words (click to add to your profile)

javaandroidc++linuxc#objective-ccocoa誰得qtrubypythongamewindowsbathyscaphephpguic翻訳omegattwitterframeworktestbtronarduinovb.net計画中(planning stage)directxpreviewerゲームエンジンdom

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


Commit MetaInfo

修订版c865a47dcc1588c66dd5a44439afa8e8b52d63d8 (tree)
时间2019-12-18 17:26:50
作者IWAMOTO 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

更改概述

差异

--- a/ttssh2/ttxssh/ssh.c
+++ b/ttssh2/ttxssh/ssh.c
@@ -64,6 +64,7 @@
6464
6565 #include <direct.h>
6666 #include <io.h>
67+#include <fcntl.h>
6768
6869 // SSH2 macro
6970 #ifdef _DEBUG
@@ -635,6 +636,31 @@ void push_bignum_memdump(char *name, char *desc, BIGNUM *bignum)
635636 free(buf); // free
636637 }
637638
639+log_kex_key(PTInstVar pvar, char *type, char *msg)
640+{
641+ int fd, i;
642+ unsigned char buff[4], *cookie;
643+
644+ if (pvar->settings.KexKeyLogging && pvar->settings.KexKeyLogFile[0] != 0) {
645+ fd = _open(pvar->settings.KexKeyLogFile,
646+ _O_RDWR | _O_APPEND | _O_CREAT | _O_TEXT,
647+ _S_IREAD | _S_IWRITE);
648+ if (fd >= 0) {
649+ cookie = pvar->crypt_state.server_cookie;
650+ _write(fd, type, strlen(type));
651+ _write(fd, " ", 1);
652+ for (i=0; i<16; i++) {
653+ _snprintf_s(buff, sizeof(buff), _TRUNCATE, "%02x", cookie[i]);
654+ _write(fd, buff, 2);
655+ }
656+ _write(fd, " ", 1);
657+ _write(fd, msg, strlen(msg));
658+ _write(fd, "\n", 1);
659+ _close(fd);
660+ }
661+ }
662+}
663+
638664 static unsigned int get_predecryption_amount(PTInstVar pvar)
639665 {
640666 static int small_block_decryption_sizes[] = { 5, 5, 6, 6, 8 };
@@ -5495,6 +5521,7 @@ static void SSH2_dh_kex_init(PTInstVar pvar)
54955521
54965522 // 秘密にすべき乱数(X)を生成
54975523 dh_gen_key(pvar, dh, pvar->we_need);
5524+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(dh->priv_key));
54985525
54995526 msg = buffer_init();
55005527 if (msg == NULL) {
@@ -5726,6 +5753,8 @@ static BOOL handle_SSH2_dh_gex_group(PTInstVar pvar)
57265753 // 秘密にすべき乱数(X)を生成
57275754 dh_gen_key(pvar, dh, pvar->we_need);
57285755
5756+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(dh->priv_key));
5757+
57295758 // 公開鍵をサーバへ送信
57305759 msg = buffer_init();
57315760 if (msg == NULL) {
@@ -5803,6 +5832,7 @@ static void SSH2_ecdh_kex_init(PTInstVar pvar)
58035832 }
58045833 group = EC_KEY_get0_group(client_key);
58055834
5835+ log_kex_key(pvar, "CLIENT_SECRET", BN_bn2hex(EC_KEY_get0_private_key(client_key)));
58065836
58075837 msg = buffer_init();
58085838 if (msg == NULL) {
--- a/ttssh2/ttxssh/ttxssh.c
+++ b/ttssh2/ttxssh/ttxssh.c
@@ -568,6 +568,14 @@ static void read_ssh_options(PTInstVar pvar, PCHAR fileName)
568568
569569 settings->AuthBanner = GetPrivateProfileInt("TTSSH", "AuthBanner", 1, fileName);
570570
571+ read_string_option(fileName, "KexKeyLogFile", "", settings->KexKeyLogFile, sizeof(settings->KexKeyLogFile));
572+ if (settings->KexKeyLogFile[0] == 0) {
573+ settings->KexKeyLogging = 0;
574+ }
575+ else {
576+ settings->KexKeyLogging = GetPrivateProfileInt("TTSSH", "KexKeyLogging", 0, fileName);
577+ }
578+
571579 clear_local_settings(pvar);
572580 }
573581
--- a/ttssh2/ttxssh/ttxssh.h
+++ b/ttssh2/ttxssh/ttxssh.h
@@ -203,6 +203,9 @@ typedef struct _TS_SSH {
203203 int GexMinimalGroupSize;
204204
205205 int AuthBanner;
206+
207+ BOOL KexKeyLogging;
208+ char KexKeyLogFile[1024];
206209 } TS_SSH;
207210
208211 typedef struct _TInstVar {