diff options
author | Bryan McNulty <bryanmcnulty@protonmail.com> | 2025-04-20 11:26:44 -0500 |
---|---|---|
committer | Bryan McNulty <bryanmcnulty@protonmail.com> | 2025-04-20 11:26:44 -0500 |
commit | ce79cf929133ea2592fb899d6339c1e299aa9eeb (patch) | |
tree | 964763333f623969febd5f1ef86a00862a83b591 /cmd | |
parent | 61578457eed9243d3be1bb120cce5995e149adec (diff) | |
download | goexec-ce79cf929133ea2592fb899d6339c1e299aa9eeb.tar.gz goexec-ce79cf929133ea2592fb899d6339c1e299aa9eeb.zip |
Added `tsch change` command
Diffstat (limited to 'cmd')
-rw-r--r-- | cmd/scmr.go | 2 | ||||
-rw-r--r-- | cmd/tsch.go | 63 |
2 files changed, 63 insertions, 2 deletions
diff --git a/cmd/scmr.go b/cmd/scmr.go index c527559..5ad8f21 100644 --- a/cmd/scmr.go +++ b/cmd/scmr.go @@ -177,7 +177,7 @@ References: scmrChangeCmd = &cobra.Command{ Use: "change [target]", - Short: "Change an existing Windows service to gain execution", + Short: "Change an existing Windows service to spawn an arbitrary process", Args: argsRpcClient("cifs"), Run: func(cmd *cobra.Command, args []string) { diff --git a/cmd/tsch.go b/cmd/tsch.go index d8c8853..86fdd62 100644 --- a/cmd/tsch.go +++ b/cmd/tsch.go @@ -19,11 +19,12 @@ func tschCmdInit() { } tschDemandCmdInit() tschCreateCmdInit() + tschChangeCmdInit() tschCmd.PersistentFlags().AddFlagSet(defaultAuthFlags.Flags) tschCmd.PersistentFlags().AddFlagSet(defaultLogFlags.Flags) tschCmd.PersistentFlags().AddFlagSet(defaultNetRpcFlags.Flags) - tschCmd.AddCommand(tschDemandCmd, tschCreateCmd) + tschCmd.AddCommand(tschDemandCmd, tschCreateCmd, tschChangeCmd) } func tschDemandCmdInit() { @@ -49,6 +50,7 @@ func tschDemandCmdInit() { tschDemandCmd.Flags().AddFlagSet(tschDemandFlags.Flags) tschDemandCmd.Flags().AddFlagSet(tschDemandExecFlags.Flags) + tschDemandCmd.MarkFlagsOneRequired("executable", "command") } func tschCreateCmdInit() { @@ -77,6 +79,39 @@ func tschCreateCmdInit() { tschCreateCmd.Flags().AddFlagSet(tschCreateFlags.Flags) tschCreateCmd.Flags().AddFlagSet(tschCreateExecFlags.Flags) + tschCreateCmd.MarkFlagsOneRequired("executable", "command") +} + +func tschChangeCmdInit() { + tschChangeFlags := newFlagSet("Task Scheduler") + + tschChangeFlags.Flags.StringVarP(&tschTask, "task", "t", "", "Path to existing task") + tschChangeFlags.Flags.BoolVar(&tschChange.NoStart, "no-start", false, "Don't start the task") + tschChangeFlags.Flags.BoolVar(&tschChange.NoRevert, "no-revert", false, "Don't restore the original task definition") + + tschChangeExecFlags := newFlagSet("Execution") + + registerExecutionFlags(tschChangeExecFlags.Flags) + registerExecutionOutputFlags(tschChangeExecFlags.Flags) + + cmdFlags[tschChangeCmd] = []*flagSet{ + tschChangeFlags, + tschChangeExecFlags, + defaultAuthFlags, + defaultLogFlags, + defaultNetRpcFlags, + } + + tschChangeCmd.Flags().AddFlagSet(tschChangeFlags.Flags) + tschChangeCmd.Flags().AddFlagSet(tschChangeExecFlags.Flags) + + // Constraints + { + if err := tschChangeCmd.MarkFlagRequired("task"); err != nil { + panic(err) + } + tschChangeCmd.MarkFlagsOneRequired("executable", "command") + } } func argsTask(*cobra.Command, []string) error { @@ -95,6 +130,7 @@ func argsTask(*cobra.Command, []string) error { var ( tschDemand tschexec.TschDemand tschCreate tschexec.TschCreate + tschChange tschexec.TschChange tschTask string @@ -174,4 +210,29 @@ References: } }, } + tschChangeCmd = &cobra.Command{ + Use: "change [target]", + Short: "Modify an existing task to spawn an arbitrary process", + Long: `Description:`, // TODO + Args: args( + argsRpcClient("cifs"), + argsOutput("smb"), + argsTask, + ), + + Run: func(*cobra.Command, []string) { + tschChange.Tsch.Client = &rpcClient + tschChange.IO = exec + tschChange.TaskPath = tschTask + + ctx := log.With(). + Str("module", "tsch"). + Str("method", "change"). + Logger().WithContext(gssapi.NewSecurityContext(context.TODO())) + + if err := goexec.ExecuteCleanMethod(ctx, &tschChange, &exec); err != nil { + log.Fatal().Err(err).Msg("Operation failed") + } + }, + } ) |