Send server SSH version immediately after tunnel_ack in wssshc to prevent timeouts

parent 797e3f15
...@@ -150,6 +150,27 @@ void handle_tunnel_request(SSL *ssl, const char *request_id, int debug) { ...@@ -150,6 +150,27 @@ void handle_tunnel_request(SSL *ssl, const char *request_id, int debug) {
fflush(stdout); fflush(stdout);
} }
// Send client version to target SSH server
const char *client_version = "SSH-2.0-OpenSSH_9.9p1 Debian-3\r\n";
size_t version_len = strlen(client_version);
if (send(ssh_sock, client_version, version_len, 0) < 0) {
perror("Send client version failed");
return;
}
// Receive server version
char server_version_buf[256];
int bytes_read = recv(ssh_sock, server_version_buf, sizeof(server_version_buf) - 1, 0);
if (bytes_read <= 0) {
perror("Receive server version failed");
return;
}
server_version_buf[bytes_read] = '\0';
if (debug) {
printf("[DEBUG - Tunnel] Received server version: %s", server_version_buf);
fflush(stdout);
}
// Send tunnel_ack back to server // Send tunnel_ack back to server
char ack_msg[256]; char ack_msg[256];
snprintf(ack_msg, sizeof(ack_msg), "{\"type\":\"tunnel_ack\",\"request_id\":\"%s\"}", request_id); snprintf(ack_msg, sizeof(ack_msg), "{\"type\":\"tunnel_ack\",\"request_id\":\"%s\"}", request_id);
...@@ -164,6 +185,29 @@ void handle_tunnel_request(SSL *ssl, const char *request_id, int debug) { ...@@ -164,6 +185,29 @@ void handle_tunnel_request(SSL *ssl, const char *request_id, int debug) {
return; return;
} }
// Send server version as tunnel_response immediately
// Convert to hex
size_t hex_size = (size_t)bytes_read * 2 + 1;
if (hex_size > 256) hex_size = 256;
char hex_data[256];
for (int i = 0; i < bytes_read && (size_t)i * 2 < hex_size - 1; i++) {
sprintf(hex_data + i * 2, "%02x", (unsigned char)server_version_buf[i]);
}
hex_data[bytes_read * 2] = '\0';
char response_msg[512];
snprintf(response_msg, sizeof(response_msg), "{\"type\":\"tunnel_response\",\"request_id\":\"%s\",\"data\":\"%s\"}", request_id, hex_data);
if (debug) {
printf("[DEBUG - WebSockets] Sending server version immediately: %s\n", response_msg);
fflush(stdout);
}
if (!send_websocket_frame(ssl, response_msg)) {
fprintf(stderr, "Send server version failed\n");
return;
}
// Start bidirectional forwarding between WebSocket and SSH server // Start bidirectional forwarding between WebSocket and SSH server
thread_args_t *thread_args = malloc(sizeof(thread_args_t)); thread_args_t *thread_args = malloc(sizeof(thread_args_t));
if (thread_args) { if (thread_args) {
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment