| 1704 |
enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success); |
enque_handler(pvar, SSH2_MSG_USERAUTH_SUCCESS, handle_SSH2_userauth_success); |
| 1705 |
enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure); |
enque_handler(pvar, SSH2_MSG_USERAUTH_FAILURE, handle_SSH2_userauth_failure); |
| 1706 |
enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner); |
enque_handler(pvar, SSH2_MSG_USERAUTH_BANNER, handle_SSH2_userauth_banner); |
| 1707 |
enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_inforeq); |
enque_handler(pvar, SSH2_MSG_USERAUTH_INFO_REQUEST, handle_SSH2_userauth_msg60); |
|
enque_handler(pvar, SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ, handle_SSH2_userauth_passwd_changereq); |
|
| 1708 |
|
|
| 1709 |
enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented); |
enque_handler(pvar, SSH2_MSG_UNIMPLEMENTED, handle_unimplemented); |
| 1710 |
|
|
| 6988 |
} |
} |
| 6989 |
|
|
| 6990 |
|
|
| 6991 |
// SSH2 keyboard-interactive methodの SSH2_MSG_USERAUTH_INFO_REQUEST 処理関数 |
// SSH2 メッセージ 60 番の処理関数 |
| 6992 |
|
// |
| 6993 |
|
// SSH2 では以下のメッセージが 60 番へ重複して割り当てられている。 |
| 6994 |
// |
// |
| 6995 |
|
// * SSH2_MSG_USERAUTH_INFO_REQUEST (keyboard-interactive) |
| 6996 |
|
// * SSH2_MSG_USERAUTH_PK_OK (publickey / Tera Term では Pageant 認証のみ) |
| 6997 |
|
// * SSH2_MSG_USERAUTH_PASSWD_CHANGEREQ (password) |
| 6998 |
|
// |
| 6999 |
// 現状の実装では同じメッセージ番号が存在できないので、 |
// 現状の実装では同じメッセージ番号が存在できないので、 |
| 7000 |
// SSH2 publickey で Pageant を使っているときの |
// 60 番はこの関数で受け、method によって対応するハンドラ関数に振り分ける。 |
|
// SSH2_MSG_USERAUTH_PK_OK もこの関数で処理する。(2007.2.12 maya) |
|
| 7001 |
// |
// |
| 7002 |
// |
BOOL handle_SSH2_userauth_msg60(PTInstVar pvar) |
|
// ※メモ:OpenSSHでPAMを有効にする方法 |
|
|
//・ビルド |
|
|
//# ./configure --with-pam |
|
|
//# make |
|
|
// |
|
|
//・/etc/ssh/sshd_config に下記のように書く。 |
|
|
//PasswordAuthentication no |
|
|
//PermitEmptyPasswords no |
|
|
//ChallengeResponseAuthentication yes |
|
|
//UsePAM yes |
|
|
// |
|
|
// (2005.1.23 yutaka) |
|
|
BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar) |
|
| 7003 |
{ |
{ |
| 7004 |
if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { |
if (pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { |
| 7005 |
// SSH2_MSG_USERAUTH_INFO_REQUEST |
return handle_SSH2_userauth_inforeq(pvar); |
| 7006 |
int len; |
} |
| 7007 |
char *data; |
else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PAGEANT) { |
| 7008 |
int slen = 0, num, echo; |
return handle_SSH2_userauth_pkok(pvar); |
| 7009 |
char *s, *prompt = NULL; |
} |
| 7010 |
buffer_t *msg; |
else if (pvar->auth_state.cur_cred.method == SSH_AUTH_PASSWORD) { |
| 7011 |
unsigned char *outmsg; |
// TODO |
| 7012 |
int i; |
// return handle_SSH2_userauth_passwd_changereq(pvar) { |
| 7013 |
char *name, *inst, *lang; |
return FALSE; |
| 7014 |
char lprompt[512]; |
} |
| 7015 |
|
else { |
| 7016 |
|
return FALSE; |
| 7017 |
|
} |
| 7018 |
|
|
| 7019 |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE); |
return TRUE; // not reached |
| 7020 |
|
} |
| 7021 |
|
|
| 7022 |
// 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード |
BOOL handle_SSH2_userauth_inforeq(PTInstVar pvar) |
| 7023 |
data = pvar->ssh_state.payload; |
{ |
| 7024 |
// パケットサイズ - (パディングサイズ+1);真のパケットサイズ |
// SSH2_MSG_USERAUTH_INFO_REQUEST |
| 7025 |
len = pvar->ssh_state.payloadlen; |
int len; |
| 7026 |
|
char *data; |
| 7027 |
|
int slen = 0, num, echo; |
| 7028 |
|
char *s, *prompt = NULL; |
| 7029 |
|
buffer_t *msg; |
| 7030 |
|
unsigned char *outmsg; |
| 7031 |
|
int i; |
| 7032 |
|
char *name, *inst, *lang; |
| 7033 |
|
char lprompt[512]; |
| 7034 |
|
|
| 7035 |
//debug_print(10, data, len); |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_REQUEST was received.", LOG_LEVEL_VERBOSE); |
| 7036 |
|
|
| 7037 |
///////// step1 |
// 6byte(サイズ+パディング+タイプ)を取り除いた以降のペイロード |
| 7038 |
// get string |
data = pvar->ssh_state.payload; |
| 7039 |
name = buffer_get_string(&data, NULL); |
// パケットサイズ - (パディングサイズ+1);真のパケットサイズ |
| 7040 |
inst = buffer_get_string(&data, NULL); |
len = pvar->ssh_state.payloadlen; |
|
lang = buffer_get_string(&data, NULL); |
|
|
lprompt[0] = 0; |
|
|
if (strlen(inst) > 0) { |
|
|
strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE); |
|
|
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
|
|
} |
|
|
if (strlen(lang) > 0) { |
|
|
strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE); |
|
|
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
|
|
} |
|
|
free(name); |
|
|
free(inst); |
|
|
free(lang); |
|
| 7041 |
|
|
| 7042 |
// num-prompts |
//debug_print(10, data, len); |
|
num = get_uint32_MSBfirst(data); |
|
|
data += 4; |
|
| 7043 |
|
|
| 7044 |
///////// step2 |
///////// step1 |
| 7045 |
// サーバへパスフレーズを送る |
// get string |
| 7046 |
msg = buffer_init(); |
name = buffer_get_string(&data, NULL); |
| 7047 |
if (msg == NULL) { |
inst = buffer_get_string(&data, NULL); |
| 7048 |
// TODO: error check |
lang = buffer_get_string(&data, NULL); |
| 7049 |
return FALSE; |
lprompt[0] = 0; |
| 7050 |
} |
if (strlen(inst) > 0) { |
| 7051 |
buffer_put_int(msg, num); |
strncat_s(lprompt, sizeof(lprompt), inst, _TRUNCATE); |
| 7052 |
|
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
| 7053 |
|
} |
| 7054 |
|
if (strlen(lang) > 0) { |
| 7055 |
|
strncat_s(lprompt, sizeof(lprompt), lang, _TRUNCATE); |
| 7056 |
|
strncat_s(lprompt, sizeof(lprompt), "\r\n", _TRUNCATE); |
| 7057 |
|
} |
| 7058 |
|
free(name); |
| 7059 |
|
free(inst); |
| 7060 |
|
free(lang); |
| 7061 |
|
|
| 7062 |
// パスワード変更の場合、メッセージがあれば、表示する。(2010.11.11 yutaka) |
// num-prompts |
| 7063 |
if (num == 0) { |
num = get_uint32_MSBfirst(data); |
| 7064 |
if (strlen(lprompt) > 0) |
data += 4; |
|
MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION); |
|
|
} |
|
|
|
|
|
// プロンプトの数だけ prompt & echo が繰り返される。 |
|
|
for (i = 0 ; i < num ; i++) { |
|
|
// get string |
|
|
slen = get_uint32_MSBfirst(data); |
|
|
data += 4; |
|
|
prompt = data; // prompt |
|
|
data += slen; |
|
|
|
|
|
// get boolean |
|
|
echo = data[0]; |
|
|
data += 1; |
|
|
|
|
|
// keyboard-interactive method (2005.3.12 yutaka) |
|
|
if (pvar->keyboard_interactive_password_input == 0 && |
|
|
pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { |
|
|
AUTH_set_TIS_mode(pvar, prompt, slen); |
|
|
AUTH_advance_to_next_cred(pvar); |
|
|
pvar->ssh_state.status_flags &= ~STATUS_DONT_SEND_CREDENTIALS; |
|
|
//try_send_credentials(pvar); |
|
|
buffer_free(msg); |
|
|
return TRUE; |
|
|
} |
|
| 7065 |
|
|
| 7066 |
// TODO: ここでプロンプトを表示してユーザから入力させるのが正解。 |
///////// step2 |
| 7067 |
s = pvar->auth_state.cur_cred.password; |
// サーバへパスフレーズを送る |
| 7068 |
buffer_put_string(msg, s, strlen(s)); |
msg = buffer_init(); |
| 7069 |
|
if (msg == NULL) { |
| 7070 |
|
// TODO: error check |
| 7071 |
|
return FALSE; |
| 7072 |
|
} |
| 7073 |
|
buffer_put_int(msg, num); |
| 7074 |
|
|
| 7075 |
// リトライに対応できるよう、フラグをクリアする。(2010.11.11 yutaka) |
// パスワード変更の場合、メッセージがあれば、表示する。(2010.11.11 yutaka) |
| 7076 |
pvar->keyboard_interactive_password_input = 0; |
if (num == 0) { |
| 7077 |
|
if (strlen(lprompt) > 0) |
| 7078 |
|
MessageBox(pvar->cv->HWin, lprompt, "USERAUTH INFO_REQUEST", MB_OK | MB_ICONINFORMATION); |
| 7079 |
|
} |
| 7080 |
|
|
| 7081 |
|
// プロンプトの数だけ prompt & echo が繰り返される。 |
| 7082 |
|
for (i = 0 ; i < num ; i++) { |
| 7083 |
|
// get string |
| 7084 |
|
slen = get_uint32_MSBfirst(data); |
| 7085 |
|
data += 4; |
| 7086 |
|
prompt = data; // prompt |
| 7087 |
|
data += slen; |
| 7088 |
|
|
| 7089 |
|
// get boolean |
| 7090 |
|
echo = data[0]; |
| 7091 |
|
data += 1; |
| 7092 |
|
|
| 7093 |
|
// keyboard-interactive method (2005.3.12 yutaka) |
| 7094 |
|
if (pvar->keyboard_interactive_password_input == 0 && |
| 7095 |
|
pvar->auth_state.cur_cred.method == SSH_AUTH_TIS) { |
| 7096 |
|
AUTH_set_TIS_mode(pvar, prompt, slen); |
| 7097 |
|
AUTH_advance_to_next_cred(pvar); |
| 7098 |
|
pvar->ssh_state.status_flags &= ~STATUS_DONT_SEND_CREDENTIALS; |
| 7099 |
|
//try_send_credentials(pvar); |
| 7100 |
|
buffer_free(msg); |
| 7101 |
|
return TRUE; |
| 7102 |
} |
} |
| 7103 |
|
|
| 7104 |
len = buffer_len(msg); |
// TODO: ここでプロンプトを表示してユーザから入力させるのが正解。 |
| 7105 |
outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_INFO_RESPONSE, len); |
s = pvar->auth_state.cur_cred.password; |
| 7106 |
memcpy(outmsg, buffer_ptr(msg), len); |
buffer_put_string(msg, s, strlen(s)); |
|
finish_send_packet(pvar); |
|
|
buffer_free(msg); |
|
| 7107 |
|
|
| 7108 |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_RESPONSE was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE); |
// リトライに対応できるよう、フラグをクリアする。(2010.11.11 yutaka) |
| 7109 |
|
pvar->keyboard_interactive_password_input = 0; |
| 7110 |
} |
} |
| 7111 |
else { // SSH_AUTH_PAGEANT |
|
| 7112 |
|
len = buffer_len(msg); |
| 7113 |
|
outmsg = begin_send_packet(pvar, SSH2_MSG_USERAUTH_INFO_RESPONSE, len); |
| 7114 |
|
memcpy(outmsg, buffer_ptr(msg), len); |
| 7115 |
|
finish_send_packet(pvar); |
| 7116 |
|
buffer_free(msg); |
| 7117 |
|
|
| 7118 |
|
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_INFO_RESPONSE was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE); |
| 7119 |
|
return TRUE; |
| 7120 |
|
} |
| 7121 |
|
|
| 7122 |
|
BOOL handle_SSH2_userauth_pkok(PTInstVar pvar) |
| 7123 |
|
{ |
| 7124 |
// SSH2_MSG_USERAUTH_PK_OK |
// SSH2_MSG_USERAUTH_PK_OK |
| 7125 |
buffer_t *msg = NULL; |
buffer_t *msg = NULL; |
| 7126 |
char *s, *username; |
char *s, *username; |
| 7221 |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_REQUEST was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE); |
notify_verbose_message(pvar, "SSH2_MSG_USERAUTH_REQUEST was sent at handle_SSH2_userauth_inforeq().", LOG_LEVEL_VERBOSE); |
| 7222 |
|
|
| 7223 |
pvar->pageant_keyfinal = TRUE; |
pvar->pageant_keyfinal = TRUE; |
|
} |
|
| 7224 |
|
|
| 7225 |
return TRUE; |
return TRUE; |
| 7226 |
} |
} |
| 7227 |
|
|
| 7228 |
#define PASSWD_MAXLEN 150 |
#define PASSWD_MAXLEN 150 |
| 7229 |
|
|