diff --git a/README.md b/README.md index 4b25213278..7d88d4cbdf 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ Sliver ⚠️ __Notice:__ Sliver is currently in __beta__, you've been warned :) and please consider [contributing](/CONTRIBUTING.md) -Sliver is an open source, cross-platform adversary simulation/red team platform, it can be used by organizations of all sizes to perform security testing. Sliver's implants support C2 over Mutual-TLS, HTTP(S), and DNS. Implants are dynamically compiled with unique X.509 certificates signed by a per-instance certificate authority generated when you first run the binary. +Sliver is an open source, cross-platform adversary simulation/red team platform, it can be used by organizations of all sizes to perform security testing. Sliver's implants support C2 over Mutual TLS (mTLS), WireGuard, HTTP(S), and DNS. Implants are dynamically compiled with unique X.509 certificates signed by a per-instance certificate authority generated when you first run the binary. The server and client support MacOS, Windows, and Linux. Implants are supported on MacOS, Windows, and Linux (and possibly every Golang compiler target but we've not tested them all). diff --git a/server/c2/tcp-wg.go b/server/c2/tcp-wg.go index 0a19601bd1..52adf0aa99 100644 --- a/server/c2/tcp-wg.go +++ b/server/c2/tcp-wg.go @@ -39,7 +39,8 @@ func StartWGListener(port uint16, netstackPort uint16, keyExchangeListenPort uin 1420, ) if err != nil { - wgLog.Panic(err) + wgLog.Errorf("CreateNetTUN failed: %v", err) + return nil, nil, nil, err } // Get existing server wg keys @@ -78,12 +79,17 @@ func StartWGListener(port uint16, netstackPort uint16, keyExchangeListenPort uin return nil, nil, nil, err } - dev.Up() + err = dev.Up() + if err != nil { + wgLog.Errorf("Could not set up the device: %v", err) + return nil, nil, nil, err + } // Open up key exchange TCP socket keyExchangeListener, err := tnet.ListenTCP(&net.TCPAddr{IP: net.ParseIP(tunIP), Port: int(keyExchangeListenPort)}) if err != nil { - wgLog.Panic("Failed to setup up wg key exchange listener: ", err) + wgLog.Errorf("Failed to setup up wg key exchange listener: %v", err) + return nil, nil, nil, err } wgLog.Printf("Successfully setup up wg key exchange listener") go acceptKeyExchangeConnection(keyExchangeListener) @@ -91,7 +97,8 @@ func StartWGListener(port uint16, netstackPort uint16, keyExchangeListenPort uin // Open up c2 comms listener TCP socket listener, err := tnet.ListenTCP(&net.TCPAddr{IP: net.ParseIP(tunIP), Port: int(netstackPort)}) if err != nil { - wgLog.Panic("Failed to setup up wg sliver listener: ", err) + wgLog.Errorf("Failed to setup up wg sliver listener: %v", err) + return nil, nil, nil, err } wgLog.Printf("Successfully setup up wg sliver listener") go acceptWGSliverConnections(listener) diff --git a/server/cli/cli.go b/server/cli/cli.go index 0c78285ad2..29edc2120a 100644 --- a/server/cli/cli.go +++ b/server/cli/cli.go @@ -73,15 +73,15 @@ func initLogging(appDir string) *os.File { func init() { // Unpack - cmdUnpack.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") - rootCmd.AddCommand(cmdUnpack) + unpackCmd.Flags().BoolP(forceFlagStr, "f", false, "Force unpack and overwrite") + rootCmd.AddCommand(unpackCmd) // Operator - cmdOperator.Flags().StringP(nameFlagStr, "n", "", "operator name") - cmdOperator.Flags().StringP(lhostFlagStr, "l", "", "listener host") - cmdOperator.Flags().Uint16P(lportFlagStr, "p", uint16(1337), "listener port") - cmdOperator.Flags().StringP(saveFlagStr, "s", "", "save file to ...") - rootCmd.AddCommand(cmdOperator) + operatorCmd.Flags().StringP(nameFlagStr, "n", "", "operator name") + operatorCmd.Flags().StringP(lhostFlagStr, "l", "", "listener host") + operatorCmd.Flags().Uint16P(lportFlagStr, "p", uint16(1337), "listener port") + operatorCmd.Flags().StringP(saveFlagStr, "s", "", "save file to ...") + rootCmd.AddCommand(operatorCmd) // Certs cmdExportCA.Flags().StringP(saveFlagStr, "s", "", "save CA to file ...") @@ -94,8 +94,11 @@ func init() { fmt.Sprintf("ca type (%s)", strings.Join(validCATypes(), ", "))) rootCmd.AddCommand(cmdImportCA) + // Daemon + rootCmd.AddCommand(daemonCmd) + // Version - rootCmd.AddCommand(cmdVersion) + rootCmd.AddCommand(versionCmd) } var rootCmd = &cobra.Command{ diff --git a/server/cli/daemon.go b/server/cli/daemon.go new file mode 100644 index 0000000000..f078e8cb51 --- /dev/null +++ b/server/cli/daemon.go @@ -0,0 +1,15 @@ +package cli + +import ( + "github.com/bishopfox/sliver/server/daemon" + "github.com/spf13/cobra" +) + +var daemonCmd = &cobra.Command{ + Use: "daemon", + Short: "Start server in daemon mode", + Long: ``, + Run: func(cmd *cobra.Command, args []string) { + daemon.Start() + }, +} diff --git a/server/cli/operator.go b/server/cli/operator.go index 69ff607be8..bd4fb82bdf 100644 --- a/server/cli/operator.go +++ b/server/cli/operator.go @@ -29,7 +29,7 @@ import ( "github.com/spf13/cobra" ) -var cmdOperator = &cobra.Command{ +var operatorCmd = &cobra.Command{ Use: "operator", Short: "Generate operator configuration files", Long: ``, diff --git a/server/cli/unpack.go b/server/cli/unpack.go index c38b5ecfaf..1a75e0f56d 100644 --- a/server/cli/unpack.go +++ b/server/cli/unpack.go @@ -25,7 +25,7 @@ import ( "github.com/spf13/cobra" ) -var cmdUnpack = &cobra.Command{ +var unpackCmd = &cobra.Command{ Use: "unpack", Short: "Unpack assets and exit", Long: ``, diff --git a/server/cli/version.go b/server/cli/version.go index 6f812bf19f..b9784e35bb 100644 --- a/server/cli/version.go +++ b/server/cli/version.go @@ -25,7 +25,7 @@ import ( "github.com/spf13/cobra" ) -var cmdVersion = &cobra.Command{ +var versionCmd = &cobra.Command{ Use: "version", Short: "Print version and exit", Long: ``, diff --git a/server/daemon/daemon.go b/server/daemon/daemon.go index db3432cd57..88aef431fb 100644 --- a/server/daemon/daemon.go +++ b/server/daemon/daemon.go @@ -43,7 +43,7 @@ func Start() { if err != nil { fmt.Printf("[!] Failed to start daemon %s", err) daemonLog.Errorf("Error starting client listener %s", err) - return + os.Exit(1) } done := make(chan bool)