/* ############################################################################# * # sshGameServer * This is a test * * AUTHER: PreacherDHM * DATE: 07/03/26 * ############################################################################# */ /* This is a sample implementation of a libssh based SSH server */ #include "ssh_server_client.h" #include "client_source/client.h" #include #include #include #include #include #include #include #ifdef HAVE_ARGP_H #include #endif #include #include #include #ifndef BUF_SIZE #define BUF_SIZE 2049 #endif #ifndef KEYS_FOLDER #ifdef _WIN32 #define KEYS_FOLDER #else #define KEYS_FOLDER "/etc/ssh/" #endif #endif static int authenticated=0; static int tries = 0; static int error = 0; static ssh_channel chan[30] ={NULL}; typedef struct { ssh_session session; ServerConfig* config; } ud; static int auth_none(ssh_session session, const char *user, void *userdata) { ssh_string banner = NULL; (void)user; /* unused */ (void)userdata; /* unused */ //ssh_set_auth_methods(session, // SSH_AUTH_METHOD_PASSWORD | SSH_AUTH_METHOD_GSSAPI_MIC); banner = ssh_string_from_char("Loggin To your skelvetty acount!\n"); if (banner != NULL) { ssh_send_issue_banner(session, banner); } ssh_string_free(banner); authenticated ++; return SSH_AUTH_SUCCESS; } static int auth_password(ssh_session session, const char *user, const char *password, void *userdata){ //(void)userdata; //printf("Authenticating user %s pwd %s\n",user, password); //if(strcmp(user,USER) == 0 && strcmp(password, PASSWORD) == 0){ // authenticated = 1; // printf("Authenticated\n"); return SSH_AUTH_SUCCESS; //} //if (tries >= 3){ // printf("Too many authentication tries\n"); // ssh_disconnect(session); // error = 1; // return SSH_AUTH_DENIED; //} //tries++; //return SSH_AUTH_DENIED; } #ifdef WITH_GSSAPI static int auth_gssapi_mic(ssh_session session, const char *user, const char *principal, void *userdata){ ssh_gssapi_creds creds = ssh_gssapi_get_creds(session); (void)userdata; printf("Authenticating user %s with gssapi principal %s\n",user, principal); if (creds != NULL) printf("Received some gssapi credentials\n"); else printf("Not received any forwardable creds\n"); printf("authenticated\n"); authenticated = 1; return SSH_AUTH_SUCCESS; } #endif static int pty_request(ssh_session session, ssh_channel channel, const char *term, int x,int y, int px, int py, void *userdata){ (void) session; (void) channel; (void) term; (void) x; (void) y; (void) px; (void) py; (void) userdata; printf("Allocated terminal\n"); return 0; } static int shell_request(ssh_session session, ssh_channel channel, void *userdata){ (void)session; (void)channel; (void)userdata; printf("Allocated shell\n"); return 0; } struct ssh_channel_callbacks_struct channel_cb = { .channel_pty_request_function = pty_request, .channel_shell_request_function = shell_request }; static ssh_channel new_session_channel(ssh_session session, void *userdata){ (void) session; (void) userdata; printf("Allocated session channel for id %d\n", *(int*)userdata); *(ssh_channel*)userdata = ssh_channel_new(session); ssh_callbacks_init(&channel_cb); ssh_set_channel_callbacks(*(ssh_channel*)userdata, &channel_cb); return *(ssh_channel*)userdata; } void* Handel_Client(void* d) { ud data = *(ud*)d; char buf[BUF_SIZE]; int r; int i; ssh_event mainloop; ssh_session session = data.session; ssh_channel c; struct ssh_server_callbacks_struct cb = { .userdata = (void*)&c, .auth_none_function = auth_none, .auth_password_function = auth_password, .channel_open_request_session_function = new_session_channel, }; ssh_callbacks_init(&cb); ssh_set_server_callbacks(session, &cb); if (ssh_handle_key_exchange(session)) { printf("ssh_handle_key_exchange: %s\n", ssh_get_error(session)); return NULL; } ssh_set_auth_methods(session, SSH_AUTH_METHOD_NONE); mainloop = ssh_event_new(); ssh_event_add_session(mainloop, session); while (!(authenticated && c != NULL)){ if(error) break; r = ssh_event_dopoll(mainloop, -1); if (r == SSH_ERROR){ printf("Error : %s\n",ssh_get_error(session)); ssh_disconnect(session); return NULL; } } char sendBuf[1024] = {0}; int sendBuffSize = 1024; int counter = 0; if(error){ printf("Error, exiting loop\n"); } else printf("Authenticated and got a channel\n"); client* cli = NULL; // Data Init data.config->cbs.init_var = cli; data.config->cbs.run_var = cli; data.config->cbs.stop_var = cli; data.config->cbs.ssh_init(data.config->cbs.init_var); do{ // Update i = 1; //snprintf(sendBuf, 1024, "Counter: %d, id: %d\r", counter, data.config->id); //char kittyBuffer[30] = {0}; //sprintf(kittyBuffer, "\e[>%d", 0b1000); //if (ssh_channel_write(c, kittyBuffer, 30) == SSH_ERROR) { // printf("error writing to channel\n"); // return NULL; //} i = ssh_channel_read_nonblocking(c, buf, sizeof(buf)-1, 0); counter++; // code go here ssh_terminal_data tb = { .inputBuffer = buf, .outputBuffer = sendBuf, .inputSize = 1024, .outputSize = &sendBuffSize, }; data.config->cbs.ssh_run(&tb,data.config->cbs.run_var); // code go here if (ssh_channel_write(c, tb.outputBuffer, 1024) == SSH_ERROR) { printf("error writing to channel\n"); return NULL; } if(i>0) { buf[i] = '\0'; printf("%s", buf); fflush(stdout); if(buf[0] == '\x03') { ssh_disconnect(data.session); ssh_free(data.session); authenticated--; //ssh_channel_close(c); //ssh_channel_free(c); return 0; } } } while (true); data.config->cbs.ssh_stop(data.config->cbs.stop_var); return 0; } int ssh_start(ServerConfig* conf){ ssh_session session; ssh_bind sshbind; int port = 2222;// conf->port; int r =0; sshbind=ssh_bind_new(); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_HOSTKEY, "/home/preacher/.ssh/id_rsa"); ssh_bind_options_set(sshbind, SSH_BIND_OPTIONS_BINDPORT, &port); while(sshbind) { if(ssh_bind_listen(sshbind)<0){ printf("Error listening to socket: %s\n",ssh_get_error(sshbind)); return 1; } session=ssh_new(); r=ssh_bind_accept(sshbind,session); if(r==SSH_ERROR){ printf("error accepting a connection : %s\n",ssh_get_error(sshbind)); return 1; } ud d = {session, conf}; pthread_t thread_id; if(pthread_create(&thread_id, NULL, Handel_Client, (void*)&d) < 0) { ssh_disconnect(session); } } //ssh_disconnect(session); //ssh_bind_free(sshbind); //ssh_finalize(); return 0; }