From d32b0c14a217547dfdf9818f8d96fa0be41d1c01 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sat, 1 Apr 2017 15:28:49 +0430 Subject: now the server will only run the driver commands. not anything. --- daemon/daemon_aux.c | 68 +++++++++++++++++++++++++++++++++++++++++++++++--- daemon/mutatorclient.c | 6 ++--- daemon/mutatord.c | 2 ++ 3 files changed, 69 insertions(+), 7 deletions(-) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index ce47f37..3a78eb6 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -59,6 +59,7 @@ bool cleanser(char cleansee[]) return (cleansee_health && nullterminated); } + /**********************************************************************************************************************/ int mutator_server(FILE* log_file) { @@ -67,9 +68,11 @@ int mutator_server(FILE* log_file) char client_message[2000]; FILE* clientistream; + FILE* mutator_config; char runresponse[4000]; - char NOOUT[]="command did not return any output. could be an error or not.\n"; - char BADOUT[]="what are you exactly trying to do?"; + const char NOOUT[]="command did not return any output. could be an error or not.\n"; + const char BADOUT[]="what are you exactly trying to do?"; + const char STD_OUT[]="stdout returned:\n"; /*create socket*/ socket_desc = socket(AF_INET, SOCK_STREAM, 0); @@ -120,10 +123,59 @@ int mutator_server(FILE* log_file) fprintf(log_file, "%s", "got command from client.\n"); + mutator_config = fopen("/home/bloodstalker/devi/hell2/daemon/mutator.config", "r"); + + char configline[100]; + const char delimiter[2]="="; + char* token_var; + const char mutator_home_var[]="MUTATOR_HOME"; + const char driver_name[] = "/mutator.sh "; + char* full_command; + char* temp; + +#if 1 +#if 1 + while (fgets(configline,sizeof(configline), mutator_config) != NULL) + { + temp = strstr(configline, mutator_home_var); + + if (temp != NULL) + { + memmove(temp, configline + strlen(mutator_home_var) + 1, strlen(configline) - strlen(mutator_home_var) + 1); + + break; + } + } +#endif + +#if 1 + for (int i = 0; i < strlen(temp); ++i) + { + if (i == strlen(temp) - 1) + { + temp[i] = '\0'; + } + } + full_command = malloc(strlen(temp) + strlen(client_message) + strlen(driver_name) + 1); + + strcpy(full_command,temp); + strcat(full_command, driver_name); + strcat(full_command, client_message); + fprintf(log_file, "%s", full_command); +#endif +#endif + if (cleanser(client_message) == true) { +#ifndef __DBG + clientistream = popen(full_command, "r"); +#endif + +#if defined(__DBG) /*open pipe, run command*/ clientistream = popen(client_message, "r"); + //clientistream = popen(full_command, "r"); +#endif } else { @@ -132,6 +184,9 @@ int mutator_server(FILE* log_file) continue; } + fprintf(log_file, "%s", "freeing memory reserved for command.\n"); + free(full_command); + if (clientistream == NULL) { perror("client command did not run successfully."); @@ -146,16 +201,21 @@ int mutator_server(FILE* log_file) if (fgets(runresponse, sizeof(runresponse), clientistream) == NULL) { /*say there was nothing on stdout to send.*/ + fprintf(log_file, "%s", "command returned no stdout.\n"); write(client_sock, NOOUT, strlen(NOOUT)); } + else + { + fprintf(log_file, "%s", "command returned stdout.\n"); + write(client_sock, STD_OUT, strlen(STD_OUT)); + } rewind(clientistream); while (fgets(runresponse, sizeof(runresponse), clientistream) != NULL) { #if defined(__DBG) - fscanf(log_file, "%s", "command stdout:"); - fscanf(log_file, "%s", runresponse); + fprintf(log_file, "%s", "command stdout:\n"); #endif write(client_sock, runresponse, strlen(runresponse)); fprintf(log_file, "%s", runresponse); diff --git a/daemon/mutatorclient.c b/daemon/mutatorclient.c index 2b61d96..0addc76 100644 --- a/daemon/mutatorclient.c +++ b/daemon/mutatorclient.c @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /**********************************************************************************************************************/ /*macros*/ #define __DBG -#if 1 +#if 0 #undef __DBG #endif /**********************************************************************************************************************/ @@ -97,14 +97,14 @@ int main(int argc, char *argv[]) fflush(stdin); #if defined(__DBG) - puts("checkpoint 1"); + puts("checkpoint 11"); #endif /*recieve a reply from the server*/ recvlength = recv(sock, server_reply, 2000, 0); #if defined(__DBG) - puts("checkpoint 2"); + puts("checkpoint 12"); #endif if (recvlength < 0) diff --git a/daemon/mutatord.c b/daemon/mutatord.c index a0496d3..a9d29cd 100644 --- a/daemon/mutatord.c +++ b/daemon/mutatord.c @@ -140,6 +140,8 @@ int main(void) fclose(mut_log); }while(0); + //return server_exit_code; + /*@DEVI-these obviously will never run. theyre just a reminder that i need to handle the gracefull shutdown*/ #if 0 fclose(mut_log); -- cgit v1.2.3 From a9ffad836eafa989b2d4e489fe2d591169b1de8e Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 09:11:05 +0430 Subject: fixed some issues --- daemon/daemon_aux.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index 3a78eb6..3572972 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -149,11 +149,14 @@ int mutator_server(FILE* log_file) #endif #if 1 - for (int i = 0; i < strlen(temp); ++i) + if (temp != NULL) { - if (i == strlen(temp) - 1) + for (int i = 0; i < strlen(temp); ++i) { - temp[i] = '\0'; + if (i == strlen(temp) - 1) + { + temp[i] = '\0'; + } } } full_command = malloc(strlen(temp) + strlen(client_message) + strlen(driver_name) + 1); @@ -181,11 +184,14 @@ int mutator_server(FILE* log_file) { fprintf(log_file, "%s", "what are you trying to do exactly?"); write(client_sock, BADOUT, strlen(BADOUT)); + free(full_command); + fclose(mutator_config); continue; } fprintf(log_file, "%s", "freeing memory reserved for command.\n"); free(full_command); + fclose(mutator_config); if (clientistream == NULL) { -- cgit v1.2.3 From aaebb9c2d6bb9aff225f88884737bbc978df0ae0 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 09:41:59 +0430 Subject: added a check for empty or config file not found. --- daemon/daemon_aux.c | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index 3572972..278d207 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -73,6 +73,7 @@ int mutator_server(FILE* log_file) const char NOOUT[]="command did not return any output. could be an error or not.\n"; const char BADOUT[]="what are you exactly trying to do?"; const char STD_OUT[]="stdout returned:\n"; + const char EMPTY_CONFIG[]="empty config file or file not found.\n"; /*create socket*/ socket_desc = socket(AF_INET, SOCK_STREAM, 0); @@ -133,6 +134,17 @@ int mutator_server(FILE* log_file) char* full_command; char* temp; + /*checking for an empty config-file. could also mean the config file was not found.*/ + if(fgets(configline,sizeof(configline), mutator_config) == NULL) + { + fprintf(log_file, "%s", EMPTY_CONFIG); + fclose(log_file); + fclose(mutator_config); + return 1; + } + + rewind(mutator_config); + #if 1 #if 1 while (fgets(configline,sizeof(configline), mutator_config) != NULL) @@ -149,8 +161,6 @@ int mutator_server(FILE* log_file) #endif #if 1 - if (temp != NULL) - { for (int i = 0; i < strlen(temp); ++i) { if (i == strlen(temp) - 1) @@ -158,7 +168,6 @@ int mutator_server(FILE* log_file) temp[i] = '\0'; } } - } full_command = malloc(strlen(temp) + strlen(client_message) + strlen(driver_name) + 1); strcpy(full_command,temp); -- cgit v1.2.3 From b731fb9edf33fb2e1ec1fa1ab8e65f8680688351 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 09:54:52 +0430 Subject: more fixes --- daemon/daemon_aux.c | 2 ++ 1 file changed, 2 insertions(+) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index 278d207..843c84b 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -140,6 +140,8 @@ int mutator_server(FILE* log_file) fprintf(log_file, "%s", EMPTY_CONFIG); fclose(log_file); fclose(mutator_config); + close(client_sock); + close(socket_desc); return 1; } -- cgit v1.2.3 From 0fa03ec7db294080d4df7f8eff50b0312c48162f Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:36:10 +0430 Subject: general overhaul to how the server handles the command execution. fixed the new-line char being sent along with the command. --- daemon/daemon_aux.c | 73 ++++++++++++++++++++++++++++++++++++++--------------- 1 file changed, 52 insertions(+), 21 deletions(-) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index 843c84b..65fbc4b 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -23,10 +23,25 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* #if 1 #undef __DBG #endif + +#define __DBG_2 +#if 1 +#undef __DBG_2 +#endif + +#define CLEAN_UP() \ + do{\ + fclose(log_file);\ + fclose(mutator_config);\ + close(client_sock);\ + close(socket_desc);\ + }\ + while(0) /**********************************************************************************************************************/ /*inclusion directive*/ #include "daemon_aux.h" /*standard headers*/ +#include #include #include #include @@ -73,7 +88,9 @@ int mutator_server(FILE* log_file) const char NOOUT[]="command did not return any output. could be an error or not.\n"; const char BADOUT[]="what are you exactly trying to do?"; const char STD_OUT[]="stdout returned:\n"; - const char EMPTY_CONFIG[]="empty config file or file not found.\n"; + const char EMPTY_CONFIG[]="error: empty config file.\n"; + const char NFOUND_CONFIG[]="error: cant find config file in the default path.\n"; + const char SERVER_TERM[]="server terminated.\n"; /*create socket*/ socket_desc = socket(AF_INET, SOCK_STREAM, 0); @@ -126,6 +143,17 @@ int mutator_server(FILE* log_file) mutator_config = fopen("/home/bloodstalker/devi/hell2/daemon/mutator.config", "r"); + if (mutator_config == NULL) + { + write(client_sock, NFOUND_CONFIG, strlen(NFOUND_CONFIG)); + write(client_sock, SERVER_TERM, strlen(SERVER_TERM)); + fprintf(log_file, "%s", NFOUND_CONFIG); + fprintf(log_file, "%s%d%s", "fopen returned: ", errno, "\n"); + fprintf(log_file, "%s", SERVER_TERM); + CLEAN_UP(); + return errno; + } + char configline[100]; const char delimiter[2]="="; char* token_var; @@ -133,51 +161,54 @@ int mutator_server(FILE* log_file) const char driver_name[] = "/mutator.sh "; char* full_command; char* temp; + char* dummy; /*checking for an empty config-file. could also mean the config file was not found.*/ if(fgets(configline,sizeof(configline), mutator_config) == NULL) { + write(client_sock, EMPTY_CONFIG, strlen(EMPTY_CONFIG)); + write(client_sock, SERVER_TERM, strlen(SERVER_TERM)); fprintf(log_file, "%s", EMPTY_CONFIG); - fclose(log_file); - fclose(mutator_config); - close(client_sock); - close(socket_desc); - return 1; + fprintf(log_file, "%s", SERVER_TERM); + CLEAN_UP(); + /*@DEVI-return SIGPIPE*/ + return 141; } rewind(mutator_config); -#if 1 -#if 1 while (fgets(configline,sizeof(configline), mutator_config) != NULL) { temp = strstr(configline, mutator_home_var); if (temp != NULL) { - memmove(temp, configline + strlen(mutator_home_var) + 1, strlen(configline) - strlen(mutator_home_var) + 1); + memmove(temp, configline + strlen(mutator_home_var) + 1, strlen(configline) - strlen(mutator_home_var) - 1); break; } } -#endif -#if 1 - for (int i = 0; i < strlen(temp); ++i) - { - if (i == strlen(temp) - 1) - { - temp[i] = '\0'; - } - } - full_command = malloc(strlen(temp) + strlen(client_message) + strlen(driver_name) + 1); + /*@DEVI-null-terminating temp*/ + temp[strlen(temp) - strlen(mutator_home_var) - 2] = '\0'; + /*@DEVI-checks whether the line-break char was also sent.if yes, then removes it.*/ + if (client_message[read_size - 1] == '\n') + { + client_message[read_size - 1] = '\0'; + } + + full_command = malloc(strlen(temp) + read_size + strlen(driver_name) + 1); strcpy(full_command,temp); strcat(full_command, driver_name); + /*@DEVI-client_message is not null-terminated but strcat takes care of that.*/ strcat(full_command, client_message); - fprintf(log_file, "%s", full_command); -#endif + +#if defined(__DBG_2) + fprintf(log_file, "%s%s%s", "temp is: ", temp, "\n"); + fprintf(log_file, "%s%s%s", "driver_name is: ",driver_name, "\n"); #endif + fprintf(log_file, "%s%s%s", "full_command is: ", full_command, "\n"); if (cleanser(client_message) == true) { -- cgit v1.2.3 From 90f5834d0ffd9abc5a435ebc20aebc03d7ca2187 Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:36:25 +0430 Subject: disbaled a macro --- daemon/mutatorclient.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'daemon') diff --git a/daemon/mutatorclient.c b/daemon/mutatorclient.c index 0addc76..1cbfd0a 100644 --- a/daemon/mutatorclient.c +++ b/daemon/mutatorclient.c @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /**********************************************************************************************************************/ /*macros*/ #define __DBG -#if 0 +#if 1 #undef __DBG #endif /**********************************************************************************************************************/ -- cgit v1.2.3 From dae64986f26d1e49e65b1657ef74f4f791ef852d Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:36:49 +0430 Subject: the daemon returns the server exit code --- daemon/mutatord.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'daemon') diff --git a/daemon/mutatord.c b/daemon/mutatord.c index a9d29cd..a148686 100644 --- a/daemon/mutatord.c +++ b/daemon/mutatord.c @@ -20,7 +20,7 @@ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.* /**********************************************************************************************************************/ /*macros*/ #define __DBG -#if 0 +#if 1 #undef __DBG #endif /**********************************************************************************************************************/ @@ -140,7 +140,7 @@ int main(void) fclose(mut_log); }while(0); - //return server_exit_code; + return server_exit_code; /*@DEVI-these obviously will never run. theyre just a reminder that i need to handle the gracefull shutdown*/ #if 0 -- cgit v1.2.3 From 14ea95e8bb55d0e0cbbce85b5cbed605cc05445e Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:37:02 +0430 Subject: marked as deprecated --- daemon/mutatorserver.c | 6 ++++++ 1 file changed, 6 insertions(+) (limited to 'daemon') diff --git a/daemon/mutatorserver.c b/daemon/mutatorserver.c index 4450583..f233553 100644 --- a/daemon/mutatorserver.c +++ b/daemon/mutatorserver.c @@ -1,4 +1,10 @@ +/** @file mutatorserver.c*/ +/** + * @brief The test file for the server. Runs the server as a stand-alone. + */ + +/** @warning Deprecated*/ /***************************************************Project Mutator****************************************************/ /*first line intentionally left blank.*/ /*Copyright (C) 2017 Farzad Sadeghi -- cgit v1.2.3 From cdd1daed95a47a604cb88ef81a11d460dd02ecfe Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:37:13 +0430 Subject: marked as deprecated --- daemon/mutatorserver.h | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'daemon') diff --git a/daemon/mutatorserver.h b/daemon/mutatorserver.h index ce885e7..8585192 100644 --- a/daemon/mutatorserver.h +++ b/daemon/mutatorserver.h @@ -1,4 +1,11 @@ +/** @file mutatorserver.h*/ +/** + * @brief The header for the test file for the server. + */ + +/** @warning Deprecated*/ + /***************************************************Project Mutator****************************************************/ /*first line intentionally left blank.*/ /*Copyright (C) 2017 Farzad Sadeghi -- cgit v1.2.3 From 39a3c2ae3239b13582f811b052c21afbacb12ead Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 16:37:33 +0430 Subject: updated as per the changes --- daemon/README.md | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) (limited to 'daemon') diff --git a/daemon/README.md b/daemon/README.md index ba2a8f7..e9e2943 100644 --- a/daemon/README.md +++ b/daemon/README.md @@ -10,6 +10,7 @@ It's simple. The client sends a command to the server run by the daemon(`mutator The mutator client is a thin client which is also the whole point of all of this: Plugin.
The daemon generates a log file in the `daemon` directory under root named `mutatordlog`.
+The daemon will need to read some VARS from a config file that is generated by `make install` inside the daemon directory named `mutator.config`.
### How to use it? @@ -21,15 +22,25 @@ make all ``` -After that, run `mutatord` to start up the server and then run `mutatorclient` and send your commands.
-The server passes the commands to `mutator.sh` to execute. For a list of available options you can run `mutator.sh -h` or just read the `README.md` in project root.
A -I have yet to decide how to set a home path variable for mutator so you need to pass all adresses to the server as absolute paths since the daemon changes the directory to `/`.
+Or just run that from the main makefile. After that, run `mutatord` to start up the server and then run `mutatorclient` and send your commands.
+The server passes the commands to `mutator.sh` to execute. For a list of available options you can run `mutator.sh -h` or just read the `README.md` in project root.
+ +To run commands on the server, use normal mutator driver commands excluding the driver name:
+ +```bash + +-f /home/user1/mutator/samples/action_file.mutator + +``` + To kill the client and server(and also the daemon) just send `end_comm` as the command through the client.
## WARNING -Currently there are no checks on the commands sent to the server. The server uses `popen()` to run the commands so it will run any valid `sh` command it gets from `/` and the buffers are not exactly small either.
+Currently there are some checks on the commands sent to the server. The server uses `popen()` to run the commands prefixed by the driver name, `mutator.sh`.
+The server checks to see whether the command string is null-terminated and whether it contains `|` or `;`. Thats's all the checks it runs before running a command from the root directory.
+The daemon will switch to the root directory as soon as it is run and the server will inherit the permissions that the daemon was ran by. There is no reason to run the daemon as sudo.
### Directory Content -- cgit v1.2.3 From ba407e763f31d647179d7a11305263b28ea4360d Mon Sep 17 00:00:00 2001 From: bloodstalker Date: Sun, 2 Apr 2017 17:13:50 +0430 Subject: fixing some issues --- daemon/daemon_aux.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'daemon') diff --git a/daemon/daemon_aux.c b/daemon/daemon_aux.c index 65fbc4b..00841de 100644 --- a/daemon/daemon_aux.c +++ b/daemon/daemon_aux.c @@ -110,6 +110,7 @@ int mutator_server(FILE* log_file) /*Bind*/ if (bind(socket_desc, (struct sockaddr*)&server, sizeof(server)) < 0) { + close(socket_desc); perror("bind failed.error.\n"); return 1; } @@ -150,7 +151,11 @@ int mutator_server(FILE* log_file) fprintf(log_file, "%s", NFOUND_CONFIG); fprintf(log_file, "%s%d%s", "fopen returned: ", errno, "\n"); fprintf(log_file, "%s", SERVER_TERM); - CLEAN_UP(); + + fclose(log_file); + close(client_sock); + close(socket_desc); + return errno; } -- cgit v1.2.3