Behavioral Reverse Shell

Find shell processes that have open sockets and no open files or TTY (https://clo.ng/blog/osquery_reverse_shell/):

Query

SELECT DISTINCT(processes.pid), processes.parent, processes.name, processes.path, \\
        processes.cmdline, processes.cwd, processes.root, processes.uid, processes.gid, \\
        processes.start_time, process_open_sockets.remote_address, process_open_sockets.remote_port, \\
        (SELECT cmdline FROM processes AS parent_cmdline WHERE pid=processes.parent) AS parent_cmdline \\
        FROM processes JOIN process_open_sockets USING (pid) \\
        LEFT OUTER JOIN process_open_files \\
        ON processes.pid = process_open_files.pid \\
        WHERE (name='sh' OR name='bash') \\
        AND process_open_files.pid IS NULL;

Additional Query Info

  • Version: 2.8.0
  • Interval: 3600

JSON

{
  "queries": {
    "Behavioral Reverse Shell": {
      "query": "SELECT DISTINCT(processes.pid), processes.parent, processes.name, processes.path, \\
        processes.cmdline, processes.cwd, processes.root, processes.uid, processes.gid, \\
        processes.start_time, process_open_sockets.remote_address, process_open_sockets.remote_port, \\
        (SELECT cmdline FROM processes AS parent_cmdline WHERE pid=processes.parent) AS parent_cmdline \\
        FROM processes JOIN process_open_sockets USING (pid) \\
        LEFT OUTER JOIN process_open_files \\
        ON processes.pid = process_open_files.pid \\
        WHERE (name='sh' OR name='bash') \\
        AND process_open_files.pid IS NULL;",
      "interval": "3600",
      "platform": "",
      "version": "2.8.0",
      "description": "Find shell processes that have open sockets and no open files or TTY (https://clo.ng/blog/osquery_reverse_shell/)",
      "value": ""
    }
  }
}