aboutsummaryrefslogtreecommitdiff
path: root/cmd
diff options
context:
space:
mode:
authorBryan McNulty <bryanmcnulty@protonmail.com>2025-04-20 11:26:44 -0500
committerBryan McNulty <bryanmcnulty@protonmail.com>2025-04-20 11:26:44 -0500
commitce79cf929133ea2592fb899d6339c1e299aa9eeb (patch)
tree964763333f623969febd5f1ef86a00862a83b591 /cmd
parent61578457eed9243d3be1bb120cce5995e149adec (diff)
downloadgoexec-ce79cf929133ea2592fb899d6339c1e299aa9eeb.tar.gz
goexec-ce79cf929133ea2592fb899d6339c1e299aa9eeb.zip
Added `tsch change` command
Diffstat (limited to 'cmd')
-rw-r--r--cmd/scmr.go2
-rw-r--r--cmd/tsch.go63
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")
+ }
+ },
+ }
)