diff options
Diffstat (limited to 'cmd/args.go')
-rw-r--r-- | cmd/args.go | 126 |
1 files changed, 126 insertions, 0 deletions
diff --git a/cmd/args.go b/cmd/args.go new file mode 100644 index 0000000..50e7c74 --- /dev/null +++ b/cmd/args.go @@ -0,0 +1,126 @@ +package cmd + +import ( + "context" + "errors" + "fmt" + "github.com/spf13/cobra" + "github.com/spf13/pflag" +) + +func registerRpcFlags(cmd *cobra.Command) { + rpcFlags := pflag.NewFlagSet("RPC", pflag.ExitOnError) + + rpcFlags.BoolVar(&rpcClient.NoEpm, "no-epm", false, "Do not use EPM to automatically detect endpoints") + //rpcFlags.BoolVar(&rpcClient.Options.EpmAuto, "epm-auto", false, "Automatically detect endpoints instead of using the module defaults") + rpcFlags.BoolVar(&rpcClient.NoSign, "no-sign", false, "Disable signing on DCE messages") + rpcFlags.BoolVar(&rpcClient.NoSeal, "no-seal", false, "Disable packet stub encryption on DCE messages") + rpcFlags.StringVar(&rpcClient.Filter, "epm-filter", "", "String binding to filter endpoints returned by EPM") + rpcFlags.StringVar(&rpcClient.Endpoint, "endpoint", "", "Explicit RPC endpoint definition") + + cmd.PersistentFlags().AddFlagSet(rpcFlags) + + cmd.MarkFlagsMutuallyExclusive("endpoint", "epm-filter") + cmd.MarkFlagsMutuallyExclusive("no-epm", "epm-filter") +} + +func registerProcessExecutionArgs(cmd *cobra.Command) { + group := pflag.NewFlagSet("Execution", pflag.ExitOnError) + + group.StringVarP(&exec.Input.Arguments, "args", "a", "", "Command line arguments") + group.StringVarP(&exec.Input.CommandLine, "command", "c", "", "Windows process command line (executable & arguments)") + group.StringVarP(&exec.Input.Executable, "executable", "e", "", "Windows executable to invoke") + + cmd.PersistentFlags().AddFlagSet(group) + + cmd.MarkFlagsOneRequired("executable", "command") + cmd.MarkFlagsMutuallyExclusive("executable", "command") +} + +func registerExecutionOutputArgs(cmd *cobra.Command) { + group := pflag.NewFlagSet("Output", pflag.ExitOnError) + + group.StringVarP(&outputPath, "output", "o", "", `Fetch execution output to file or "-" for standard output`) + group.StringVarP(&outputMethod, "output-method", "m", "smb", "Method to fetch execution output") + group.StringVar(&exec.Output.RemotePath, "remote-output", "", "Location to temporarily store output on remote filesystem") + group.BoolVar(&exec.Output.NoDelete, "no-delete-output", false, "Preserve output file on remote filesystem") + + cmd.PersistentFlags().AddFlagSet(group) +} + +func args(reqs ...func(*cobra.Command, []string) error) (fn func(*cobra.Command, []string) error) { + + return func(cmd *cobra.Command, args []string) (err error) { + + for _, req := range reqs { + if err = req(cmd, args); err != nil { + return + } + } + return + } +} + +func argsTarget(proto string) func(cmd *cobra.Command, args []string) error { + + return func(cmd *cobra.Command, args []string) (err error) { + + if len(args) != 1 { + return errors.New("command require exactly one positional argument: [target]") + } + + if credential, target, err = authOpts.WithTarget(context.TODO(), proto, args[0]); err != nil { + return fmt.Errorf("failed to parse target: %w", err) + } + + if credential == nil { + return errors.New("no credentials supplied") + } + if target == nil { + return errors.New("no target supplied") + } + return + } +} + +func argsSmbClient() func(cmd *cobra.Command, args []string) error { + return args( + argsTarget("cifs"), + + func(_ *cobra.Command, _ []string) error { + + smbClient.Credential = credential + smbClient.Target = target + smbClient.Proxy = proxy + + return smbClient.Parse(context.TODO()) + }, + ) +} + +func argsRpcClient(proto string) func(cmd *cobra.Command, args []string) error { + return args( + argsTarget(proto), + + func(cmd *cobra.Command, args []string) (err error) { + + rpcClient.Target = target + rpcClient.Credential = credential + rpcClient.Proxy = proxy + + return rpcClient.Parse(context.TODO()) + }, + ) +} + +func argsOutput(methods ...string) func(cmd *cobra.Command, args []string) error { + + var as []func(*cobra.Command, []string) error + + for _, method := range methods { + if method == "smb" { + as = append(as, argsSmbClient()) + } + } + return args(as...) +} |